Snap for 7453540 from 3a33e9de5220f4450e90ea7e6cc66af39428de5e to emu-30-release

Change-Id: I5773c0bcd0ccadf61eb3c9dc61c7565a82431936
diff --git a/BUILD.gn b/BUILD.gn
index f2e28f8..2e204a7 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -2,8 +2,10 @@
   sources = [
     "android-emu/android/base/AlignedBuf.cpp",
     "android-emu/android/base/AlignedBuf.h",
+    "android-emu/android/base/Allocator.h",
     "android-emu/android/base/AndroidSubAllocator.cpp",
     "android-emu/android/base/AndroidSubAllocator.h",
+    "android-emu/android/base/BumpPool.h",
     "android-emu/android/base/Pool.cpp",
     "android-emu/android/base/Pool.h",
     "android-emu/android/base/Tracing.cpp",
@@ -14,6 +16,13 @@
     "android-emu/android/base/files/Stream.h",
     "android-emu/android/base/files/StreamSerializing.cpp",
     "android-emu/android/base/files/StreamSerializing.h",
+    "android-emu/android/base/fit/Defer.h",
+    "android-emu/android/base/fit/Function.h",
+    "android-emu/android/base/fit/FunctionInternal.h",
+    "android-emu/android/base/fit/Nullable.h",
+    "android-emu/android/base/fit/ThreadChecker.h",
+    "android-emu/android/base/fit/ThreadSafety.h",
+    "android-emu/android/base/fit/UtilityInternal.h",
     "android-emu/android/base/ring_buffer.c",
     "android-emu/android/base/synchronization/AndroidConditionVariable.h",
     "android-emu/android/base/synchronization/AndroidLock.h",
diff --git a/OWNERS b/OWNERS
new file mode 100644
index 0000000..c5e9dac
--- /dev/null
+++ b/OWNERS
@@ -0,0 +1,13 @@
+bohu@google.com
+cstout@google.com
+doughorn@google.com
+gurchetansingh@google.com
+kaiyili@google.com
+lfy@google.com
+liyl@google.com
+natsu@google.com
+reveman@google.com
+rkir@google.com
+yahan@google.com
+
+# COMPONENT: Graphics
diff --git a/android-emu/android/base/Allocator.h b/android-emu/android/base/Allocator.h
new file mode 100644
index 0000000..d875de1
--- /dev/null
+++ b/android-emu/android/base/Allocator.h
@@ -0,0 +1,68 @@
+// Copyright 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+#pragma once
+
+#include <inttypes.h>
+#include <stddef.h>
+#include <string.h>
+
+namespace android {
+namespace base {
+
+// A generic memory allocator interface which could be used to allocate
+// a certain size of memory region, or memory region for arrays / strings.
+// How the memory are recycled / freed is up to derived classes.
+class Allocator {
+public:
+    Allocator() = default;
+    virtual ~Allocator() = default;
+
+    virtual void* alloc(size_t wantedSize) = 0;
+
+    // Convenience function to allocate an array
+    // of objects of type T.
+    template <class T>
+    T* allocArray(size_t count) {
+        size_t bytes = sizeof(T) * count;
+        void* res = alloc(bytes);
+        return (T*)res;
+    }
+
+    char* strDup(const char* toCopy) {
+        size_t bytes = strlen(toCopy) + 1;
+        void* res = alloc(bytes);
+        memset(res, 0x0, bytes);
+        memcpy(res, toCopy, bytes);
+        return (char*)res;
+    }
+
+    char** strDupArray(const char* const* arrayToCopy, size_t count) {
+        char** res = allocArray<char*>(count);
+
+        for (size_t i = 0; i < count; i++) {
+            res[i] = strDup(arrayToCopy[i]);
+        }
+
+        return res;
+    }
+
+    void* dupArray(const void* buf, size_t bytes) {
+        void* res = alloc(bytes);
+        memcpy(res, buf, bytes);
+        return res;
+    }
+};
+
+}  // namespace base
+}  // namespace android
diff --git a/android-emu/android/base/BumpPool.h b/android-emu/android/base/BumpPool.h
index 34dbc7d..545e9e3 100644
--- a/android-emu/android/base/BumpPool.h
+++ b/android-emu/android/base/BumpPool.h
@@ -14,6 +14,7 @@
 #pragma once
 
 #include "android/base/AlignedBuf.h"
+#include "android/base/Allocator.h"
 
 #include <vector>
 #include <unordered_set>
@@ -28,7 +29,7 @@
 // BUT it's necessary to preserve previous pointer values in between the first
 // alloc() after a freeAll(), and the freeAll() itself, allowing some sloppy use of
 // malloc in the first pass while we find out how much data was needed.
-class BumpPool {
+class BumpPool : public Allocator {
 public:
     BumpPool(size_t startingBytes = 4096) : mStorage(startingBytes / sizeof(uint64_t))  { }
     // All memory allocated by this pool
@@ -36,7 +37,7 @@
     // is deconstructed.
     ~BumpPool() { }
 
-    void* alloc(size_t wantedSize) {
+    void* alloc(size_t wantedSize) override {
         size_t wantedSizeRoundedUp =
             sizeof(uint64_t) * ((wantedSize + sizeof(uint64_t) - 1) / (sizeof(uint64_t)));
 
@@ -65,40 +66,6 @@
         }
         mTotalWantedThisGeneration = 0;
     }
-
-    // Convenience function to allocate an array
-    // of objects of type T.
-    template <class T>
-    T* allocArray(size_t count) {
-        size_t bytes = sizeof(T) * count;
-        void* res = alloc(bytes);
-        return (T*) res;
-    }
-
-    char* strDup(const char* toCopy) {
-        size_t bytes = strlen(toCopy) + 1;
-        void* res = alloc(bytes);
-        memset(res, 0x0, bytes);
-        memcpy(res, toCopy, bytes);
-        return (char*)res;
-    }
-
-    char** strDupArray(const char* const* arrayToCopy, size_t count) {
-        char** res = allocArray<char*>(count);
-
-        for (size_t i = 0; i < count; i++) {
-            res[i] = strDup(arrayToCopy[i]);
-        }
-
-        return res;
-    }
-
-    void* dupArray(const void* buf, size_t bytes) {
-        void* res = alloc(bytes);
-        memcpy(res, buf, bytes);
-        return res;
-    }
-
 private:
     AlignedBuf<uint64_t, 8> mStorage;
     std::unordered_set<void*> mFallbackPtrs;
diff --git a/android-emu/android/base/Pool.h b/android-emu/android/base/Pool.h
index b5b1d1b..14a39f8 100644
--- a/android-emu/android/base/Pool.h
+++ b/android-emu/android/base/Pool.h
@@ -13,6 +13,8 @@
 // limitations under the License.
 #pragma once
 
+#include "android/base/Allocator.h"
+
 #include <unordered_set>
 
 #include <inttypes.h>
@@ -25,7 +27,7 @@
 // Class to make it easier to set up memory regions where it is fast
 // to allocate/deallocate buffers that have size within
 // the specified range.
-class Pool {
+class Pool : public Allocator {
 public:
     // minSize/maxSize: the target range of sizes for which we want to
     // make allocations fast. the greater the range, the more space
@@ -45,45 +47,12 @@
     // is deconstructed.
     ~Pool();
 
-    void* alloc(size_t wantedSize);
+    void* alloc(size_t wantedSize) override;
     void free(void* ptr);
 
     // Convenience function to free everything currently allocated.
     void freeAll();
 
-    // Convenience function to allocate an array
-    // of objects of type T.
-    template <class T>
-    T* allocArray(size_t count) {
-        size_t bytes = sizeof(T) * count;
-        void* res = alloc(bytes);
-        return (T*) res;
-    }
-
-    char* strDup(const char* toCopy) {
-        size_t bytes = strlen(toCopy) + 1;
-        void* res = alloc(bytes);
-        memset(res, 0x0, bytes);
-        memcpy(res, toCopy, bytes);
-        return (char*)res;
-    }
-
-    char** strDupArray(const char* const* arrayToCopy, size_t count) {
-        char** res = allocArray<char*>(count);
-
-        for (size_t i = 0; i < count; i++) {
-            res[i] = strDup(arrayToCopy[i]);
-        }
-
-        return res;
-    }
-
-    void* dupArray(const void* buf, size_t bytes) {
-        void* res = alloc(bytes);
-        memcpy(res, buf, bytes);
-        return res;
-    }
-
 private:
     class Impl;
     Impl* mImpl = nullptr;
diff --git a/android-emu/android/base/fit/Defer.h b/android-emu/android/base/fit/Defer.h
new file mode 100644
index 0000000..d120c32
--- /dev/null
+++ b/android-emu/android/base/fit/Defer.h
@@ -0,0 +1,157 @@
+// Copyright 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Copyright 2018 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#pragma once
+
+#include <utility>
+
+#include "Function.h"
+#include "Nullable.h"
+
+namespace android::base {
+namespace fit {
+
+// A move-only deferred action wrapper with RAII semantics.
+// This class is not thread safe.
+//
+// The wrapper holds a function-like callable target with no arguments
+// which it invokes when it goes out of scope unless canceled, called, or
+// moved to a wrapper in a different scope.
+//
+// See |fit::defer()| for idiomatic usage.
+template <typename T>
+class DeferredAction final {
+public:
+    // Creates a deferred action without a pending target.
+    DeferredAction() = default;
+    explicit DeferredAction(decltype(nullptr)) {}
+
+    // Creates a deferred action with a pending target.
+    explicit DeferredAction(T target) : mTarget(std::move(target)) {}
+
+    // Creates a deferred action with a pending target moved from another
+    // deferred action, leaving the other one without a pending target.
+    DeferredAction(DeferredAction&& other) : mTarget(std::move(other.mTarget)) {
+        other.mTarget.reset();
+    }
+
+    // Invokes and releases the deferred action's pending target (if any).
+    ~DeferredAction() { call(); }
+
+    // Returns true if the deferred action has a pending target.
+    explicit operator bool() const { return !!mTarget; }
+
+    // Invokes and releases the deferred action's pending target (if any),
+    // then move-assigns it from another deferred action, leaving the latter
+    // one without a pending target.
+    DeferredAction& operator=(DeferredAction&& other) {
+        if (&other == this)
+            return *this;
+        call();
+        mTarget = std::move(other.mTarget);
+        other.mTarget.reset();
+        return *this;
+    }
+
+    // Invokes and releases the deferred action's pending target (if any).
+    void call() {
+        if (mTarget) {
+            // Move to a local to guard against re-entrance.
+            T local_target = std::move(*mTarget);
+            mTarget.reset();
+            local_target();
+        }
+    }
+
+    // Releases the deferred action's pending target (if any) without
+    // invoking it.
+    void cancel() { mTarget.reset(); }
+    DeferredAction& operator=(decltype(nullptr)) {
+        cancel();
+        return *this;
+    }
+
+    // Assigns a new target to the deferred action.
+    DeferredAction& operator=(T target) {
+        mTarget = std::move(target);
+        return *this;
+    }
+
+    DeferredAction(const DeferredAction& other) = delete;
+    DeferredAction& operator=(const DeferredAction& other) = delete;
+
+private:
+    Nullable<T> mTarget;
+};
+
+template <typename T>
+bool operator==(const DeferredAction<T>& action, decltype(nullptr)) {
+    return !action;
+}
+template <typename T>
+bool operator==(decltype(nullptr), const DeferredAction<T>& action) {
+    return !action;
+}
+template <typename T>
+bool operator!=(const DeferredAction<T>& action, decltype(nullptr)) {
+    return !!action;
+}
+template <typename T>
+bool operator!=(decltype(nullptr), const DeferredAction<T>& action) {
+    return !!action;
+}
+
+// Defers execution of a function-like callable target with no arguments
+// until the value returned by this function goes out of scope unless canceled,
+// called, or moved to a wrapper in a different scope.
+//
+// // This example prints "Hello..." then "Goodbye!".
+// void test() {
+//     auto d = fit::defer([]{ puts("Goodbye!"); });
+//     puts("Hello...");
+// }
+//
+// // This example prints nothing because the deferred action is canceled.
+// void do_nothing() {
+//     auto d = fit::defer([]{ puts("I'm not here."); });
+//     d.cancel();
+// }
+//
+// // This example shows how the deferred action can be reassigned assuming
+// // the new target has the same type and the old one, in this case by
+// // representing the target as a |fit::Closure|.
+// void reassign() {
+//     auto d = fit::defer<fit::Closure>([] { puts("This runs first."); });
+//     d = fit::defer<fit::Closure>([] { puts("This runs afterwards."); });
+// }
+template <typename T>
+inline DeferredAction<T> defer(T target) {
+    return DeferredAction<T>(std::move(target));
+}
+
+// Alias for a deferred_action using a fit::Callback.
+using DeferredCallback = DeferredAction<fit::Callback<void()>>;
+
+// Defers execution of a fit::Callback with no arguments. See |fit::defer| for
+// details.
+inline DeferredCallback deferCallback(fit::Callback<void()> target) {
+    return DeferredCallback(std::move(target));
+}
+
+}  // namespace fit
+}  // namespace android::base
diff --git a/android-emu/android/base/fit/Function.h b/android-emu/android/base/fit/Function.h
new file mode 100644
index 0000000..4f4b17d
--- /dev/null
+++ b/android-emu/android/base/fit/Function.h
@@ -0,0 +1,513 @@
+// Copyright 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Copyright 2017 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#pragma once
+
+#include "FunctionInternal.h"
+#include "UtilityInternal.h"
+
+namespace android::base {
+namespace fit {
+
+template <size_t inlineTargetSize, bool requireInline, typename Result, typename... Args>
+class FunctionImpl;
+
+template <size_t inlineTargetSize, bool requireInline, typename Result, typename... Args>
+class CallbackImpl;
+
+// The default size allowance for storing a target inline within a function
+// object, in bytes.  This default allows for inline storage of targets
+// as big as two pointers, such as an object pointer and a pointer to a member
+// function.
+constexpr size_t kDefaultInlineTargetSize = sizeof(void*) * 2;
+
+// A |fit::Function| is a move-only polymorphic function wrapper.
+//
+// If you need a class with similar characteristics that also ensures
+// "run-once" semantics (such as callbacks shared with timeouts, or for
+// service requests with redundant, failover, or fallback service providers),
+// see |fit::Callback|.
+//
+// |fit::Function<T>| behaves like |std::function<T>| except that it is
+// move-only instead of copyable, so it can hold targets that cannot be copied,
+// such as mutable lambdas, and immutable lambdas that capture move-only
+// objects.
+//
+// Targets of up to |inlineTargetSize| bytes in size (rounded up for memory
+// alignment) are stored inline within the function object without incurring
+// any heap allocation.  Larger callable objects will be moved to the heap as
+// required.
+//
+// See also |fit::InlineFunction<T, size>| for more control over allocation
+// behavior.
+//
+// SYNOPSIS
+//
+// |T| is the function's signature.  e.g. void(int, std::string).
+//
+// |inlineTargetSize| is the minimum size of target that is guaranteed to
+// fit within a function without requiring heap allocation.
+// Defaults to |kDefaultInlineTargetSize|.
+//
+// Class members are documented in |fit::FunctionImpl|, below.
+//
+// EXAMPLES
+//
+// -
+// https://fuchsia.googlesource.com/fuchsia/+/HEAD/sdk/lib/fit/test/examples/function_example1.cc
+// -
+// https://fuchsia.googlesource.com/fuchsia/+/HEAD/sdk/lib/fit/test/examples/function_example2.cc
+//
+template <typename T, size_t inlineTargetSize = kDefaultInlineTargetSize>
+using function = FunctionImpl<inlineTargetSize, /*requireInline=*/false, T>;
+
+// A move-only callable object wrapper that forces callables to be stored inline
+// and never performs heap allocation.
+//
+// Behaves just like |fit::Function<T, inlineTargetSize>| except that
+// attempting to store a target larger than |inlineTargetSize| will fail to
+// compile.
+template <typename T, size_t inlineTargetSize = kDefaultInlineTargetSize>
+using InlineFunction = FunctionImpl<inlineTargetSize,
+                                    /*requireInline=*/true,
+                                    T>;
+
+// Synonym for a function which takes no arguments and produces no result.
+using closure = function<void()>;
+
+// A |fit::Callback| is a move-only polymorphic function wrapper that also
+// ensures "run-once" semantics (such as callbacks shared with timeouts, or for
+// service requests with redundant, failover, or fallback service providers).
+// A |fit::Callback| releases it's resources after the first call, and can be
+// inspected before calling, so a potential caller can know if it should call
+// the function, or skip the call because the target was already called.
+//
+// If you need a move-only function class with typical function characteristics,
+// that permits multiple invocations of the same function, see |fit::Function|.
+//
+// |fit::Callback<T>| behaves like |std::function<T>| except:
+//
+//   1. It is move-only instead of copyable, so it can hold targets that cannot
+//      be copied, such as mutable lambdas, and immutable lambdas that capture
+//      move-only objects.
+//   2. On the first call to invoke a |fit::Callback|, the target function held
+//      by the |fit::Callback| cannot be called again.
+//
+// When a |fit::Callback| is invoked for the first time, the target function is
+// released and destructed, along with any resources owned by that function
+// (typically the objects captured by a lambda).
+//
+// A |fit::Callback| in the "already called" state has the same state as a
+// |fit::Callback| that has been assigned to |nullptr|. It can be compared to
+// |nullptr| (via "==" or "!=", and its "operator bool()" returns false, which
+// provides a convenient way to gate whether or not the |fit::Callback| should
+// be called. (Note that invoking an empty |fit::Callback| or |fit::Function|
+// will cause a program abort!)
+//
+// As an example, sharing |fit::Callback| between both a service and a timeout
+// might look something like this:
+//
+//  void service_with_timeout(fit::Callback<void(bool)> cb, uint timeout_ms) {
+//    service_request([cb = cb.share()]() mutable { if (cb) cb(false); });
+//    timeout(timeout_ms, [cb = std::move(cb)]() mutable { if (cb) cb(true); });
+//  }
+//
+// Since |fit::Callback| objects are move-only, and not copyable, duplicate
+// references to the same |fit::Callback| can be obtained via share(), as shown
+// in the example above. This method converts the |fit::Callback| into a
+// reference-counted version of the |fit::Callback| and returns a copy of the
+// reference as another |fit::Callback| with the same target function.
+//
+// What is notable about |fit::Callback<T>.share()| is that invoking any shared
+// copy will "nullify" all shared copies, as shown in the example.
+//
+// Note that |fit::Callback| is NOT thread-safe by default. If multi-threaded
+// support is required, you would need to implement your own mutex, or similar
+// guard, before checking and calling a |fit::Callback|.
+//
+// Targets of up to |inlineTargetSize| bytes in size (rounded up for memory
+// alignment) are stored inline within the callback object without incurring
+// any heap allocation.  Larger callable objects will be moved to the heap as
+// required.
+//
+// See also |fit::inline_callback<T, size>| for more control over allocation
+// behavior.
+//
+// SYNOPSIS
+//
+// |T| is the callback's signature.  e.g. void(int, std::string).
+//
+// |inlineTargetSize| is the minimum size of target that is guaranteed to
+// fit within a callback without requiring heap allocation.
+// Defaults to |kDefaultInlineTargetSize|.
+//
+// Class members are documented in |fit::CallbackImpl|, below.
+//
+template <typename T, size_t inlineTargetSize = kDefaultInlineTargetSize>
+using Callback = CallbackImpl<inlineTargetSize, /*requireInline=*/false, T>;
+
+// A move-only, run-once, callable object wrapper that forces callables to be
+// stored inline and never performs heap allocation.
+//
+// Behaves just like |fit::Callback<T, inlineTargetSize>| except that
+// attempting to store a target larger than |inlineTargetSize| will fail to
+// compile.
+template <typename T, size_t inlineTargetSize = kDefaultInlineTargetSize>
+using InlineCallback = CallbackImpl<inlineTargetSize,
+                                    /*requireInline=*/true,
+                                    T>;
+
+template <size_t inlineTargetSize, bool requireInline, typename Result, typename... Args>
+class FunctionImpl<inlineTargetSize, requireInline, Result(Args...)> final
+    : private ::android::base::fit::internal::
+          function_base<inlineTargetSize, requireInline, Result(Args...)> {
+    using Base = ::android::base::fit::internal::
+        function_base<inlineTargetSize, requireInline, Result(Args...)>;
+
+    // function_base requires private access during share()
+    friend class ::android::base::fit::internal::
+        function_base<inlineTargetSize, requireInline, Result(Args...)>;
+
+    // supports target() for shared functions
+    friend const void* ::android::base::fit::internal::get_target_type_id<>(
+        const FunctionImpl<inlineTargetSize, requireInline, Result(Args...)>&);
+
+    template <typename U>
+    using NotSelfType = ::android::base::fit::internal::NotSameType<FunctionImpl, U>;
+
+    template <typename... Conditions>
+    using RequiresConditions = ::android::base::fit::internal::RequiresConditions<Conditions...>;
+
+    template <typename... Conditions>
+    using AssignmentRequiresConditions =
+        ::android::base::fit::internal::AssignmentRequiresConditions<FunctionImpl&, Conditions...>;
+
+public:
+    // The function's result type.
+    using typename Base::result_type;
+
+    // Initializes an empty (null) function. Attempting to call an empty
+    // function will abort the program.
+    FunctionImpl() = default;
+
+    // Creates a function with an empty target (same outcome as the default
+    // constructor).
+    FunctionImpl(decltype(nullptr)) : Base(nullptr) {}
+
+    // Creates a function bound to the specified function pointer.
+    // If target == nullptr, assigns an empty target.
+    FunctionImpl(Result (*target)(Args...)) : Base(target) {}
+
+    // Creates a function bound to the specified callable object.
+    // If target == nullptr, assigns an empty target.
+    //
+    // For functors, we need to capture the raw type but also restrict on the
+    // existence of an appropriate operator () to resolve overloads and implicit
+    // casts properly.
+    //
+    // Note that specializations of this template method that take fit::Callback
+    // objects as the target Callable are deleted (see below).
+    template <typename Callable,
+              RequiresConditions<
+                  std::is_convertible<decltype(std::declval<Callable&>()(std::declval<Args>()...)),
+                                      result_type>,
+                  NotSelfType<Callable>> = true>
+    FunctionImpl(Callable&& target) : Base(std::forward<Callable>(target)) {}
+
+    // Deletes the specializations of FunctionImpl(Callable) that would allow
+    // a |fit::Function| to be constructed from a |fit::Callback|. This prevents
+    // unexpected behavior of a |fit::Function| that would otherwise fail after
+    // one call. To explicitly allow this, simply wrap the |fit::Callback| in a
+    // pass-through lambda before passing it to the |fit::Function|.
+    template <size_t otherInlineTargetSize, bool otherRequireInline>
+    FunctionImpl(::android::base::fit::CallbackImpl<otherInlineTargetSize,
+                                                    otherRequireInline,
+                                                    Result(Args...)>) = delete;
+
+    // Creates a function with a target moved from another function,
+    // leaving the other function with an empty target.
+    FunctionImpl(FunctionImpl&& other) : Base(static_cast<Base&&>(other)) {}
+
+    // Destroys the function, releasing its target.
+    ~FunctionImpl() = default;
+
+    // Assigns the function to an empty target. Attempting to invoke the
+    // function will abort the program.
+    FunctionImpl& operator=(decltype(nullptr)) {
+        Base::assign(nullptr);
+        return *this;
+    }
+
+    // Assigns the function to the specified callable object. If target ==
+    // nullptr, assigns an empty target.
+    //
+    // For functors, we need to capture the raw type but also restrict on the
+    // existence of an appropriate operator () to resolve overloads and implicit
+    // casts properly.
+    //
+    // Note that specializations of this template method that take fit::Callback
+    // objects as the target Callable are deleted (see below).
+    template <typename Callable>
+    AssignmentRequiresConditions<
+        std::is_convertible<decltype(std::declval<Callable&>()(std::declval<Args>()...)),
+                            result_type>,
+        NotSelfType<Callable>>
+    operator=(Callable&& target) {
+        Base::assign(std::forward<Callable>(target));
+        return *this;
+    }
+
+    // Deletes the specializations of operator=(Callable) that would allow
+    // a |fit::Function| to be assigned from a |fit::Callback|. This
+    // prevents unexpected behavior of a |fit::Function| that would otherwise
+    // fail after one call. To explicitly allow this, simply wrap the
+    // |fit::Callback| in a pass-through lambda before assigning it to the
+    // |fit::Function|.
+    template <size_t otherInlineTargetSize, bool otherRequireInline>
+    FunctionImpl& operator=(::android::base::fit::CallbackImpl<otherInlineTargetSize,
+                                                               otherRequireInline,
+                                                               Result(Args...)>) = delete;
+
+    // Move assignment
+    FunctionImpl& operator=(FunctionImpl&& other) {
+        if (&other == this)
+            return *this;
+        Base::assign(static_cast<Base&&>(other));
+        return *this;
+    }
+
+    // Swaps the functions' targets.
+    void swap(FunctionImpl& other) { Base::swap(other); }
+
+    // Returns a pointer to the function's target.
+    using Base::target;
+
+    // Returns true if the function has a non-empty target.
+    using Base::operator bool;
+
+    // Invokes the function's target.
+    // Aborts if the function's target is empty.
+    Result operator()(Args... args) const { return Base::invoke(std::forward<Args>(args)...); }
+
+    // Returns a new function object that invokes the same target.
+    // The target itself is not copied; it is moved to the heap and its
+    // lifetime is extended until all references have been released.
+    //
+    // Note: This method is not supported on |fit::InlineFunction<>|
+    //       because it may incur a heap allocation which is contrary to
+    //       the stated purpose of |fit::InlineFunction<>|.
+    FunctionImpl share() {
+        FunctionImpl copy;
+        Base::template share_with<FunctionImpl>(copy);
+        return copy;
+    }
+};
+
+template <size_t inlineTargetSize, bool requireInline, typename Result, typename... Args>
+void swap(FunctionImpl<inlineTargetSize, requireInline, Result, Args...>& a,
+          FunctionImpl<inlineTargetSize, requireInline, Result, Args...>& b) {
+    a.swap(b);
+}
+
+template <size_t inlineTargetSize, bool requireInline, typename Result, typename... Args>
+bool operator==(const FunctionImpl<inlineTargetSize, requireInline, Result, Args...>& f,
+                decltype(nullptr)) {
+    return !f;
+}
+template <size_t inlineTargetSize, bool requireInline, typename Result, typename... Args>
+bool operator==(decltype(nullptr),
+                const FunctionImpl<inlineTargetSize, requireInline, Result, Args...>& f) {
+    return !f;
+}
+template <size_t inlineTargetSize, bool requireInline, typename Result, typename... Args>
+bool operator!=(const FunctionImpl<inlineTargetSize, requireInline, Result, Args...>& f,
+                decltype(nullptr)) {
+    return !!f;
+}
+template <size_t inlineTargetSize, bool requireInline, typename Result, typename... Args>
+bool operator!=(decltype(nullptr),
+                const FunctionImpl<inlineTargetSize, requireInline, Result, Args...>& f) {
+    return !!f;
+}
+
+template <size_t inlineTargetSize, bool requireInline, typename Result, typename... Args>
+class CallbackImpl<inlineTargetSize, requireInline, Result(Args...)> final
+    : private ::android::base::fit::internal::
+          function_base<inlineTargetSize, requireInline, Result(Args...)> {
+    using Base = ::android::base::fit::internal::
+        function_base<inlineTargetSize, requireInline, Result(Args...)>;
+
+    // function_base requires private access during share()
+    friend class ::android::base::fit::internal::
+        function_base<inlineTargetSize, requireInline, Result(Args...)>;
+
+    // supports target() for shared functions
+    friend const void* ::android::base::fit::internal::get_target_type_id<>(
+        const CallbackImpl<inlineTargetSize, requireInline, Result(Args...)>&);
+
+    template <typename U>
+    using NotSelfType = ::android::base::fit::internal::NotSameType<CallbackImpl, U>;
+
+    template <typename... Conditions>
+    using RequiresConditions = ::android::base::fit::internal::RequiresConditions<Conditions...>;
+
+    template <typename... Conditions>
+    using AssignmentRequiresConditions =
+        ::android::base::fit::internal::AssignmentRequiresConditions<CallbackImpl&, Conditions...>;
+
+public:
+    // The callback function's result type.
+    using typename Base::result_type;
+
+    // Initializes an empty (null) callback. Attempting to call an empty
+    // callback will abort the program.
+    CallbackImpl() = default;
+
+    // Creates a callback with an empty target (same outcome as the default
+    // constructor).
+    CallbackImpl(decltype(nullptr)) : Base(nullptr) {}
+
+    // Creates a callback bound to the specified function pointer.
+    // If target == nullptr, assigns an empty target.
+    CallbackImpl(Result (*target)(Args...)) : Base(target) {}
+
+    // Creates a callback bound to the specified callable object.
+    // If target == nullptr, assigns an empty target.
+    //
+    // For functors, we need to capture the raw type but also restrict on the
+    // existence of an appropriate operator () to resolve overloads and implicit
+    // casts properly.
+    template <typename Callable,
+              RequiresConditions<
+                  std::is_convertible<decltype(std::declval<Callable&>()(std::declval<Args>()...)),
+                                      result_type>,
+                  NotSelfType<Callable>> = true>
+    CallbackImpl(Callable&& target) : Base(std::forward<Callable>(target)) {}
+
+    // Creates a callback with a target moved from another callback,
+    // leaving the other callback with an empty target.
+    CallbackImpl(CallbackImpl&& other) : Base(static_cast<Base&&>(other)) {}
+
+    // Destroys the callback, releasing its target.
+    ~CallbackImpl() = default;
+
+    // Assigns the callback to an empty target. Attempting to invoke the
+    // callback will abort the program.
+    CallbackImpl& operator=(decltype(nullptr)) {
+        Base::assign(nullptr);
+        return *this;
+    }
+
+    // Assigns the callback to the specified callable object. If target ==
+    // nullptr, assigns an empty target.
+    //
+    // For functors, we need to capture the raw type but also restrict on the
+    // existence of an appropriate operator () to resolve overloads and implicit
+    // casts properly.
+    template <typename Callable>
+    AssignmentRequiresConditions<
+        std::is_convertible<decltype(std::declval<Callable&>()(std::declval<Args>()...)),
+                            result_type>,
+        NotSelfType<Callable>>
+    operator=(Callable&& target) {
+        Base::assign(std::forward<Callable>(target));
+        return *this;
+    }
+
+    // Move assignment
+    CallbackImpl& operator=(CallbackImpl&& other) {
+        if (&other == this)
+            return *this;
+        Base::assign(static_cast<Base&&>(other));
+        return *this;
+    }
+
+    // Swaps the callbacks' targets.
+    void swap(CallbackImpl& other) { Base::swap(other); }
+
+    // Returns a pointer to the callback's target.
+    using Base::target;
+
+    // Returns true if the callback has a non-empty target.
+    using Base::operator bool;
+
+    // Invokes the callback's target.
+    // Aborts if the callback's target is empty.
+    // |fit::Callback| must be non-const to invoke. Before the target function
+    // is actually called, the fit::Callback will be set to the default empty
+    // state (== nullptr, and operator bool() will subsequently return |false|).
+    // The target function will then be released after the function is called.
+    // If the callback was shared, any remaining copies will also be cleared.
+    Result operator()(Args... args) {
+        auto temp = std::move(*this);
+        return temp.invoke(std::forward<Args>(args)...);
+    }
+
+    // Returns a new callback object that invokes the same target.
+    // The target itself is not copied; it is moved to the heap and its
+    // lifetime is extended until all references have been released.
+    // For |fit::Callback| (unlike fit::Function), the first invocation of the
+    // callback will release all references to the target. All callbacks
+    // derived from the same original callback (via share()) will be cleared,
+    // as if set to |nullptr|, and "operator bool()" will return false.
+    //
+    // Note: This method is not supported on |fit::InlineFunction<>|
+    //       because it may incur a heap allocation which is contrary to
+    //       the stated purpose of |fit::InlineFunction<>|.
+    CallbackImpl share() {
+        CallbackImpl copy;
+        Base::template share_with<CallbackImpl>(copy);
+        return copy;
+    }
+};
+
+template <size_t inlineTargetSize, bool requireInline, typename Result, typename... Args>
+void swap(CallbackImpl<inlineTargetSize, requireInline, Result, Args...>& a,
+          CallbackImpl<inlineTargetSize, requireInline, Result, Args...>& b) {
+    a.swap(b);
+}
+
+template <size_t inlineTargetSize, bool requireInline, typename Result, typename... Args>
+bool operator==(const CallbackImpl<inlineTargetSize, requireInline, Result, Args...>& f,
+                decltype(nullptr)) {
+    return !f;
+}
+template <size_t inlineTargetSize, bool requireInline, typename Result, typename... Args>
+bool operator==(decltype(nullptr),
+                const CallbackImpl<inlineTargetSize, requireInline, Result, Args...>& f) {
+    return !f;
+}
+template <size_t inlineTargetSize, bool requireInline, typename Result, typename... Args>
+bool operator!=(const CallbackImpl<inlineTargetSize, requireInline, Result, Args...>& f,
+                decltype(nullptr)) {
+    return !!f;
+}
+template <size_t inlineTargetSize, bool requireInline, typename Result, typename... Args>
+bool operator!=(decltype(nullptr),
+                const CallbackImpl<inlineTargetSize, requireInline, Result, Args...>& f) {
+    return !!f;
+}
+
+// Returns a Callable object that invokes a member function of an object.
+template <typename R, typename T, typename... Args>
+auto bindMember(T* instance, R (T::*fn)(Args...)) {
+    return [instance, fn](Args... args) { return (instance->*fn)(std::forward<Args>(args)...); };
+}
+
+}  // namespace fit
+}  // namespace android::base
diff --git a/android-emu/android/base/fit/FunctionInternal.h b/android-emu/android/base/fit/FunctionInternal.h
new file mode 100644
index 0000000..3fb1ac5
--- /dev/null
+++ b/android-emu/android/base/fit/FunctionInternal.h
@@ -0,0 +1,456 @@
+// Copyright 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Copyright 2017 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#pragma once
+
+#include <stddef.h>
+#include <stdlib.h>
+
+#include <memory>
+
+#include "Nullable.h"
+
+#include <new>
+#include <type_traits>
+#include <utility>
+
+namespace android::base {
+namespace fit {
+namespace internal {
+
+template <typename Result, typename... Args>
+struct target_ops final {
+    const void* (*target_type_id)(void* bits, const void* impl_ops);
+    void* (*get)(void* bits);
+    Result (*invoke)(void* bits, Args... args);
+    void (*move)(void* from_bits, void* to_bits);
+    void (*destroy)(void* bits);
+};
+
+template <typename Callable, bool is_inline, bool is_shared, typename Result, typename... Args>
+struct target;
+
+inline const void* unshared_target_type_id(void* bits, const void* impl_ops) {
+    return impl_ops;
+}
+
+// vtable for nullptr (empty target function)
+
+template <typename Result, typename... Args>
+struct target<decltype(nullptr),
+              /*is_inline=*/true,
+              /*is_shared=*/false,
+              Result,
+              Args...>
+    final {
+    static Result invoke(void* bits, Args... args) { __builtin_abort(); }
+
+    static const target_ops<Result, Args...> ops;
+};
+
+inline void* null_target_get(void* bits) {
+    return nullptr;
+}
+inline void null_target_move(void* from_bits, void* to_bits) {}
+inline void null_target_destroy(void* bits) {}
+
+template <typename Result, typename... Args>
+constexpr target_ops<Result, Args...> target<decltype(nullptr),
+                                             /*is_inline=*/true,
+                                             /*is_shared=*/false,
+                                             Result,
+                                             Args...>::ops = {
+    &unshared_target_type_id, &null_target_get, &target::invoke, &null_target_move,
+    &null_target_destroy};
+
+// vtable for inline target function
+
+template <typename Callable, typename Result, typename... Args>
+struct target<Callable,
+              /*is_inline=*/true,
+              /*is_shared=*/false,
+              Result,
+              Args...>
+    final {
+    template <typename Callable_>
+    static void initialize(void* bits, Callable_&& target) {
+        new (bits) Callable(std::forward<Callable_>(target));
+    }
+    static Result invoke(void* bits, Args... args) {
+        auto& target = *static_cast<Callable*>(bits);
+        return target(std::forward<Args>(args)...);
+    }
+    static void move(void* from_bits, void* to_bits) {
+        auto& from_target = *static_cast<Callable*>(from_bits);
+        new (to_bits) Callable(std::move(from_target));
+        from_target.~Callable();
+    }
+    static void destroy(void* bits) {
+        auto& target = *static_cast<Callable*>(bits);
+        target.~Callable();
+    }
+
+    static const target_ops<Result, Args...> ops;
+};
+
+inline void* inline_target_get(void* bits) {
+    return bits;
+}
+
+template <typename Callable, typename Result, typename... Args>
+constexpr target_ops<Result, Args...> target<Callable,
+                                             /*is_inline=*/true,
+                                             /*is_shared=*/false,
+                                             Result,
+                                             Args...>::ops = {
+    &unshared_target_type_id, &inline_target_get, &target::invoke, &target::move, &target::destroy};
+
+// vtable for pointer to target function
+
+template <typename Callable, typename Result, typename... Args>
+struct target<Callable,
+              /*is_inline=*/false,
+              /*is_shared=*/false,
+              Result,
+              Args...>
+    final {
+    template <typename Callable_>
+    static void initialize(void* bits, Callable_&& target) {
+        auto ptr = static_cast<Callable**>(bits);
+        *ptr = new Callable(std::forward<Callable_>(target));
+    }
+    static Result invoke(void* bits, Args... args) {
+        auto& target = **static_cast<Callable**>(bits);
+        return target(std::forward<Args>(args)...);
+    }
+    static void move(void* from_bits, void* to_bits) {
+        auto from_ptr = static_cast<Callable**>(from_bits);
+        auto to_ptr = static_cast<Callable**>(to_bits);
+        *to_ptr = *from_ptr;
+    }
+    static void destroy(void* bits) {
+        auto ptr = static_cast<Callable**>(bits);
+        delete *ptr;
+    }
+
+    static const target_ops<Result, Args...> ops;
+};
+
+inline void* heap_target_get(void* bits) {
+    return *static_cast<void**>(bits);
+}
+
+template <typename Callable, typename Result, typename... Args>
+constexpr target_ops<Result, Args...> target<Callable,
+                                             /*is_inline=*/false,
+                                             /*is_shared=*/false,
+                                             Result,
+                                             Args...>::ops = {
+    &unshared_target_type_id, &heap_target_get, &target::invoke, &target::move, &target::destroy};
+
+// vtable for fit::function std::shared_ptr to target function
+
+template <typename SharedFunction>
+const void* get_target_type_id(const SharedFunction& function_or_callback) {
+    return function_or_callback.target_type_id();
+}
+
+// For this vtable,
+// Callable by definition will be either a fit::function or fit::callback
+template <typename SharedFunction, typename Result, typename... Args>
+struct target<SharedFunction,
+              /*is_inline=*/false,
+              /*is_shared=*/true,
+              Result,
+              Args...>
+    final {
+    static void initialize(void* bits, SharedFunction target) {
+        new (bits) std::shared_ptr<SharedFunction>(
+            std::move(std::make_shared<SharedFunction>(std::move(target))));
+    }
+    static void copy_shared_ptr(void* from_bits, void* to_bits) {
+        auto& from_shared_ptr = *static_cast<std::shared_ptr<SharedFunction>*>(from_bits);
+        new (to_bits) std::shared_ptr<SharedFunction>(from_shared_ptr);
+    }
+    static const void* target_type_id(void* bits, const void* impl_ops) {
+        auto& function_or_callback = **static_cast<std::shared_ptr<SharedFunction>*>(bits);
+        return ::android::base::fit::internal::get_target_type_id(function_or_callback);
+    }
+    static void* get(void* bits) {
+        auto& function_or_callback = **static_cast<std::shared_ptr<SharedFunction>*>(bits);
+        return function_or_callback.template target<SharedFunction>(
+            /*check=*/false);  // void* will fail the check
+    }
+    static Result invoke(void* bits, Args... args) {
+        auto& function_or_callback = **static_cast<std::shared_ptr<SharedFunction>*>(bits);
+        return function_or_callback(std::forward<Args>(args)...);
+    }
+    static void move(void* from_bits, void* to_bits) {
+        auto from_shared_ptr = std::move(*static_cast<std::shared_ptr<SharedFunction>*>(from_bits));
+        new (to_bits) std::shared_ptr<SharedFunction>(std::move(from_shared_ptr));
+    }
+    static void destroy(void* bits) {
+        static_cast<std::shared_ptr<SharedFunction>*>(bits)->reset();
+    }
+
+    static const target_ops<Result, Args...> ops;
+};
+
+template <typename SharedFunction, typename Result, typename... Args>
+constexpr target_ops<Result, Args...> target<SharedFunction,
+                                             /*is_inline=*/false,
+                                             /*is_shared=*/true,
+                                             Result,
+                                             Args...>::ops = {
+    &target::target_type_id, &target::get, &target::invoke, &target::move, &target::destroy};
+
+template <size_t inline_target_size, bool requireInline, typename Result, typename... Args>
+class function_base;
+
+// Function implementation details.
+// See |fit::function| and |fit::callback| documentation for more information.
+template <size_t inline_target_size, bool requireInline, typename Result, typename... Args>
+class function_base<inline_target_size, requireInline, Result(Args...)> {
+    using ops_type = const target_ops<Result, Args...>*;
+    using storage_type = typename std::aligned_storage<(
+        inline_target_size >= sizeof(void*) ? inline_target_size : sizeof(void*))>::
+        type;  // avoid including <algorithm> for max
+    template <typename Callable>
+    using target_type = target<Callable,
+                               (sizeof(Callable) <= sizeof(storage_type)),
+                               /*is_shared=*/false,
+                               Result,
+                               Args...>;
+    template <typename SharedFunction>
+    using shared_target_type = target<SharedFunction,
+                                      /*is_inline=*/false,
+                                      /*is_shared=*/true,
+                                      Result,
+                                      Args...>;
+    using null_target_type = target_type<decltype(nullptr)>;
+
+protected:
+    using result_type = Result;
+
+    function_base() { initialize_null_target(); }
+
+    function_base(decltype(nullptr)) { initialize_null_target(); }
+
+    function_base(Result (*target)(Args...)) { initialize_target(target); }
+
+    template <typename Callable,
+              typename = std::enable_if_t<
+                  std::is_convertible<decltype(std::declval<Callable&>()(std::declval<Args>()...)),
+                                      result_type>::value>>
+    function_base(Callable&& target) {
+        initialize_target(std::forward<Callable>(target));
+    }
+
+    function_base(function_base&& other) { move_target_from(std::move(other)); }
+
+    ~function_base() { destroy_target(); }
+
+    // Returns true if the function has a non-empty target.
+    explicit operator bool() const { return ops_->get(&bits_) != nullptr; }
+
+    // Returns a pointer to the function's target.
+    // If |check| is true (the default), the function _may_ abort if the
+    // caller tries to assign the target to a varible of the wrong type. (This
+    // check is currently skipped for share()d objects.)
+    // Note the shared pointer vtable must set |check| to false to assign the
+    // target to |void*|.
+    template <typename Callable>
+    Callable* target(bool check = true) {
+        if (check)
+            check_target_type<Callable>();
+        return static_cast<Callable*>(ops_->get(&bits_));
+    }
+
+    // Returns a pointer to the function's target (const version).
+    // If |check| is true (the default), the function _may_ abort if the
+    // caller tries to assign the target to a varible of the wrong type. (This
+    // check is currently skipped for share()d objects.)
+    // Note the shared pointer vtable must set |check| to false to assign the
+    // target to |void*|.
+    template <typename Callable>
+    const Callable* target(bool check = true) const {
+        if (check)
+            check_target_type<Callable>();
+        return static_cast<Callable*>(ops_->get(&bits_));
+    }
+
+    // Used by the derived "impl" classes to implement share().
+    //
+    // The caller creates a new object of the same type as itself, and passes in
+    // the empty object. This function first checks if |this| is already shared,
+    // and if not, creates a new version of itself containing a
+    // |std::shared_ptr| to its original self, and updates |ops_| to the vtable
+    // for the shared version.
+    //
+    // Then it copies its |shared_ptr| to the |bits_| of the given |copy|,
+    // and assigns the same shared pointer vtable to the copy's |ops_|.
+    //
+    // The target itself is not copied; it is moved to the heap and its
+    // lifetime is extended until all references have been released.
+    //
+    // Note: This method is not supported on |fit::InlineFunction<>|
+    //       because it may incur a heap allocation which is contrary to
+    //       the stated purpose of |fit::InlineFunction<>|.
+    template <typename SharedFunction>
+    void share_with(SharedFunction& copy) {
+        static_assert(!requireInline, "Inline functions cannot be shared.");
+        if (ops_->get(&bits_) != nullptr) {
+            if (ops_ != &shared_target_type<SharedFunction>::ops) {
+                convert_to_shared_target<SharedFunction>();
+            }
+            copy_shared_target_to(copy);
+        }
+    }
+
+    // Used by derived "impl" classes to implement operator()().
+    // Invokes the function's target.
+    // Note that fit::callback will release the target immediately after
+    // invoke() (also affecting any share()d copies).
+    // Aborts if the function's target is empty.
+    Result invoke(Args... args) const { return ops_->invoke(&bits_, std::forward<Args>(args)...); }
+
+    // Used by derived "impl" classes to implement operator=().
+    // Assigns an empty target.
+    void assign(decltype(nullptr)) {
+        destroy_target();
+        initialize_null_target();
+    }
+
+    // Used by derived "impl" classes to implement operator=().
+    // Assigns the function's target.
+    // If target == nullptr, assigns an empty target.
+    template <typename Callable,
+              typename = std::enable_if_t<
+                  std::is_convertible<decltype(std::declval<Callable&>()(std::declval<Args>()...)),
+                                      result_type>::value>>
+    void assign(Callable&& target) {
+        destroy_target();
+        initialize_target(std::forward<Callable>(target));
+    }
+
+    // Used by derived "impl" classes to implement operator=().
+    // Assigns the function with a target moved from another function,
+    // leaving the other function with an empty target.
+    void assign(function_base&& other) {
+        destroy_target();
+        move_target_from(std::move(other));
+    }
+
+    void swap(function_base& other) {
+        if (&other == this)
+            return;
+        ops_type temp_ops = ops_;
+        storage_type temp_bits;
+        ops_->move(&bits_, &temp_bits);
+
+        ops_ = other.ops_;
+        other.ops_->move(&other.bits_, &bits_);
+
+        other.ops_ = temp_ops;
+        temp_ops->move(&temp_bits, &other.bits_);
+    }
+
+    // returns an opaque ID unique to the |Callable| type of the target.
+    // Used by check_target_type.
+    const void* target_type_id() const { return ops_->target_type_id(&bits_, ops_); }
+
+    // Deleted copy constructor and assign. |function_base| implementations are
+    // move-only.
+    function_base(const function_base& other) = delete;
+    function_base& operator=(const function_base& other) = delete;
+
+    // Move assignment must be provided by subclasses.
+    function_base& operator=(function_base&& other) = delete;
+
+private:
+    // Implements the move operation, used by move construction and move
+    // assignment. Leaves other target initialized to null.
+    void move_target_from(function_base&& other) {
+        ops_ = other.ops_;
+        other.ops_->move(&other.bits_, &bits_);
+        other.initialize_null_target();
+    }
+
+    // fit::function and fit::callback are not directly copyable, but share()
+    // will create shared references to the original object. This method
+    // implements the copy operation for the |std::shared_ptr| wrapper.
+    template <typename SharedFunction>
+    void copy_shared_target_to(SharedFunction& copy) {
+        copy.destroy_target();
+        assert(ops_ == &shared_target_type<SharedFunction>::ops);
+        shared_target_type<SharedFunction>::copy_shared_ptr(&bits_, &copy.bits_);
+        copy.ops_ = ops_;
+    }
+
+    // assumes target is uninitialized
+    void initialize_null_target() { ops_ = &null_target_type::ops; }
+
+    // target may or may not be initialized.
+    template <typename Callable>
+    void initialize_target(Callable&& target) {
+        // Convert function or function references to function pointer.
+        using DecayedCallable = std::decay_t<Callable>;
+        static_assert(
+            std::alignment_of<DecayedCallable>::value <= std::alignment_of<storage_type>::value,
+            "Alignment of Callable must be <= alignment of max_align_t.");
+        static_assert(!requireInline || sizeof(DecayedCallable) <= inline_target_size,
+                      "Callable too large to store inline as requested.");
+        if (is_null(target)) {
+            initialize_null_target();
+        } else {
+            ops_ = &target_type<DecayedCallable>::ops;
+            target_type<DecayedCallable>::initialize(&bits_, std::forward<Callable>(target));
+        }
+    }
+
+    // assumes target is uninitialized
+    template <typename SharedFunction>
+    void convert_to_shared_target() {
+        shared_target_type<SharedFunction>::initialize(
+            &bits_, std::move(*static_cast<SharedFunction*>(this)));
+        ops_ = &shared_target_type<SharedFunction>::ops;
+    }
+
+    // leaves target uninitialized
+    void destroy_target() { ops_->destroy(&bits_); }
+
+    // Called by target() if |check| is true.
+    // Checks the template parameter, usually inferred from the context of
+    // the call to target(), and aborts the program if it can determine that
+    // the Callable type is not compatible with the function's Result and Args.
+    template <typename Callable>
+    void check_target_type() const {
+        if (target_type<Callable>::ops.target_type_id(nullptr, &target_type<Callable>::ops) !=
+            target_type_id()) {
+            __builtin_abort();
+        }
+    }
+
+    ops_type ops_;
+    mutable storage_type bits_;
+};
+
+}  // namespace internal
+
+}  // namespace fit
+}  // namespace android::base
diff --git a/android-emu/android/base/fit/Nullable.h b/android-emu/android/base/fit/Nullable.h
new file mode 100644
index 0000000..e05021b
--- /dev/null
+++ b/android-emu/android/base/fit/Nullable.h
@@ -0,0 +1,265 @@
+// Copyright 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Copyright 2018 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#pragma once
+
+#include <assert.h>
+
+#include <optional>
+#include <type_traits>
+#include <utility>
+
+namespace android::base {
+namespace fit {
+
+// Determines whether a type can be compared with nullptr.
+template <typename T, typename Comparable = bool>
+struct IsComparableWithNull : public std::false_type {};
+template <typename T>
+struct IsComparableWithNull<T, decltype(std::declval<const T&>() == nullptr)>
+    : public std::true_type {};
+
+// Suppress the warning when the compiler can see that a nullable value is
+// never equal to nullptr.
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Waddress"
+template <typename T, std::enable_if_t<IsComparableWithNull<T>::value, bool> = true>
+constexpr inline bool isNull(T&& value) {
+    return std::forward<T>(value) == nullptr;
+}
+#pragma GCC diagnostic pop
+
+template <typename T, std::enable_if_t<!IsComparableWithNull<T>::value, bool> = false>
+constexpr inline bool isNull(T&&) {
+    return false;
+}
+
+// Determines whether a type can be initialized, assigned, and compared
+// with nullptr.
+template <typename T>
+struct IsNullable
+    : public std::integral_constant<bool,
+                                    std::is_constructible<T, decltype(nullptr)>::value &&
+                                        std::is_assignable<T&, decltype(nullptr)>::value &&
+                                        IsComparableWithNull<T>::value> {};
+template <>
+struct IsNullable<void> : public std::false_type {};
+
+// Holds a value or nullptr.
+//
+// This class is similar to |std::optional<T>| except that it uses less
+// storage when the value type can be initialized, assigned, and compared
+// with nullptr.
+//
+// For example:
+// - sizeof(fit::nullable<void*>) == sizeof(void*)
+// - sizeof(std::optional<void*>) == sizeof(struct { bool; void*; })
+// - sizeof(fit::nullable<int>) == sizeof(struct { bool; int; })
+// - sizeof(std::optional<int>) == sizeof(struct { bool; int; })
+//
+// TODO(fxbug.dev/4681): fit::nullable does not precisely mirror
+// std::optional. This should be corrected to avoid surprises when switching
+// between the types.
+template <typename T,
+          bool = (IsNullable<T>::value && std::is_constructible<T, T&&>::value &&
+                  std::is_assignable<T&, T&&>::value)>
+class Nullable final {
+public:
+    using value_type = T;
+
+    ~Nullable() = default;
+    constexpr Nullable() = default;
+
+    explicit constexpr Nullable(decltype(nullptr)) {}
+    explicit constexpr Nullable(T value) : mOpt(std::move(value)) {}
+
+    constexpr Nullable(const Nullable& other) = default;
+    constexpr Nullable& operator=(const Nullable& other) = default;
+
+    constexpr Nullable(Nullable&& other) = default;
+    constexpr Nullable& operator=(Nullable&& other) = default;
+
+    constexpr T& value() & { return mOpt.value(); }
+    constexpr const T& value() const& { return mOpt.value(); }
+    constexpr T&& value() && { return std::move(mOpt.value()); }
+    constexpr const T&& value() const&& { return std::move(mOpt.value()); }
+
+    template <typename U = T>
+    constexpr T valueOr(U&& default_value) const {
+        return mOpt.value_or(std::forward<U>(default_value));
+    }
+
+    constexpr T* operator->() { return &*mOpt; }
+    constexpr const T* operator->() const { return &*mOpt; }
+    constexpr T& operator*() { return *mOpt; }
+    constexpr const T& operator*() const { return *mOpt; }
+
+    constexpr bool hasValue() const { return mOpt.has_value(); }
+    explicit constexpr operator bool() const { return hasValue(); }
+
+    constexpr Nullable& operator=(decltype(nullptr)) {
+        reset();
+        return *this;
+    }
+
+    constexpr Nullable& operator=(T value) {
+        mOpt = std::move(value);
+        return *this;
+    }
+
+    constexpr void reset() { mOpt.reset(); }
+
+    constexpr void swap(Nullable& other) { mOpt.swap(other.mOpt); }
+
+private:
+    std::optional<T> mOpt;
+};
+
+template <typename T>
+class Nullable<T, true> final {
+public:
+    using value_type = T;
+
+    constexpr Nullable() : mValue(nullptr) {}
+    explicit constexpr Nullable(decltype(nullptr)) : mValue(nullptr) {}
+    explicit constexpr Nullable(T value) : mValue(std::move(value)) {}
+    constexpr Nullable(const Nullable& other) = default;
+    constexpr Nullable(Nullable&& other) : mValue(std::move(other.value_)) {}
+    ~Nullable() = default;
+
+    constexpr T& value() & {
+        if (hasValue()) {
+            return mValue;
+        } else {
+            __builtin_abort();
+        }
+    }
+    constexpr const T& value() const& {
+        if (hasValue()) {
+            return mValue;
+        } else {
+            __builtin_abort();
+        }
+    }
+    constexpr T&& value() && {
+        if (hasValue()) {
+            return std::move(mValue);
+        } else {
+            __builtin_abort();
+        }
+    }
+    constexpr const T&& value() const&& {
+        if (hasValue()) {
+            return std::move(mValue);
+        } else {
+            __builtin_abort();
+        }
+    }
+
+    template <typename U = T>
+    constexpr T valueOr(U&& default_value) const {
+        return hasValue() ? mValue : static_cast<T>(std::forward<U>(default_value));
+    }
+
+    constexpr T* operator->() { return &mValue; }
+    constexpr const T* operator->() const { return &mValue; }
+    constexpr T& operator*() { return mValue; }
+    constexpr const T& operator*() const { return mValue; }
+
+    constexpr bool hasValue() const { return !(mValue == nullptr); }
+    explicit constexpr operator bool() const { return hasValue(); }
+
+    constexpr Nullable& operator=(const Nullable& other) = default;
+    constexpr Nullable& operator=(Nullable&& other) {
+        mValue = std::move(other.value_);
+        return *this;
+    }
+
+    constexpr Nullable& operator=(decltype(nullptr)) {
+        reset();
+        return *this;
+    }
+
+    constexpr Nullable& operator=(T value) {
+        mValue = std::move(value);
+        return *this;
+    }
+
+    constexpr void reset() { mValue = nullptr; }
+
+    constexpr void swap(Nullable& other) {
+        using std::swap;
+        swap(mValue, other.value_);
+    }
+
+private:
+    T mValue;
+};
+
+template <typename T>
+void swap(Nullable<T>& a, Nullable<T>& b) {
+    a.swap(b);
+}
+
+template <typename T>
+constexpr bool operator==(const Nullable<T>& lhs, decltype(nullptr)) {
+    return !lhs.hasValue();
+}
+template <typename T>
+constexpr bool operator!=(const Nullable<T>& lhs, decltype(nullptr)) {
+    return lhs.hasValue();
+}
+
+template <typename T>
+constexpr bool operator==(decltype(nullptr), const Nullable<T>& rhs) {
+    return !rhs.hasValue();
+}
+template <typename T>
+constexpr bool operator!=(decltype(nullptr), const Nullable<T>& rhs) {
+    return rhs.hasValue();
+}
+
+template <typename T, typename U>
+constexpr bool operator==(const Nullable<T>& lhs, const Nullable<U>& rhs) {
+    return (lhs.hasValue() == rhs.hasValue()) && (!lhs.hasValue() || *lhs == *rhs);
+}
+template <typename T, typename U>
+constexpr bool operator!=(const Nullable<T>& lhs, const Nullable<U>& rhs) {
+    return (lhs.hasValue() != rhs.hasValue()) || (lhs.hasValue() && *lhs != *rhs);
+}
+
+template <typename T, typename U>
+constexpr bool operator==(const Nullable<T>& lhs, const U& rhs) {
+    return (lhs.hasValue() != isNull(rhs)) && (!lhs.hasValue() || *lhs == rhs);
+}
+template <typename T, typename U>
+constexpr bool operator!=(const Nullable<T>& lhs, const U& rhs) {
+    return (lhs.hasValue() == isNull(rhs)) || (lhs.hasValue() && *lhs != rhs);
+}
+
+template <typename T, typename U>
+constexpr bool operator==(const T& lhs, const Nullable<U>& rhs) {
+    return (isNull(lhs) != rhs.hasValue()) && (!rhs.hasValue() || lhs == *rhs);
+}
+template <typename T, typename U>
+constexpr bool operator!=(const T& lhs, const Nullable<U>& rhs) {
+    return (isNull(lhs) == rhs.hasValue()) || (rhs.hasValue() && lhs != *rhs);
+}
+
+}  // namespace fit
+}  // namespace android::base
diff --git a/android-emu/android/base/fit/README b/android-emu/android/base/fit/README
new file mode 100644
index 0000000..4b3eeeb
--- /dev/null
+++ b/android-emu/android/base/fit/README
@@ -0,0 +1,150 @@
+libfit
+
+Source: https://fuchsia.googlesource.com/fuchsia/+/main/sdk/lib/fit/
+Version: 36303cd2d1611cb1b670235692d01a92e83ecd21
+License:
+
+Copyright 2019 The Fuchsia Authors.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+   * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+   * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+======
+
+FIT is a lean library of portable C++ abstractions for control flow and
+memory management beyond what is offered by the C++ 17 standard library.
+
+FIT only depends on the C++ language and standard library, including some C++17
+library features.  It offers essential enhancements to the C++ standard library
+rather than attempting to replace it or become a framework for writing
+applications.  FIT can be thought of as an "annex" that expresses a few ideas
+we wish the C++ standard library might itself implement someday.
+
+FIT is lean.
+
+## What Belongs in FIT
+
+Several Fuchsia SDK libraries, such as *libfidl*, depend on FIT and on the C++
+standard library.  As these libraries are broadly used, we must take care in
+deciding what features to include in FIT to avoid burdening developers with
+unnecessary code or dependencies.
+
+In general, the goal is to identify specific abstractions that make sense to
+generalize across the entire ecosystem of Fuchsia C++ applications.  These will
+necessarily be somewhat low-level but high impact.  We don't want to add code to
+FIT simply because we think it's cool.  We need evidence that it is a common
+idiom and that a broad audience of developers will significantly benefit from
+its promotion.
+
+Here are a few criteria to consider:
+
+- Is the feature lightweight, general-purpose, and platform-independent?
+- Is the feature not well served by other means, particularly by the C++
+  standard library?
+- Is the feature needed by a Fuchsia SDK library?
+- Does the feature embody a beneficial idiom that clients of the Fuchsia SDK
+  commonly use?
+- Has the feature been re-implemented many times already leading to code
+  fragmentation that we would like to eliminate?
+
+If in doubt, leave it out.  See [Justifications] below.
+
+## What Doesn't Belong in FIT
+
+FIT is not intended to become a catch-all class library.
+
+Specifically prohibited features:
+
+- Features that introduce dependencies on libraries other than the C and C++
+  standard library.
+- Features that only work on certain operating systems.
+- Collection classes where the C++ 17 standard library already offers an
+  adequate (if not perfect) alternative.
+- Classes that impose an implementation burden on clients such as event loops,
+  dispatchers, frameworks, and other glue code.
+
+## Implementation Considerations
+
+FIT is not exception safe (but could be made to be in the future).
+
+## Style Conventions
+
+The API style was modified to fit current android::base library conventions.
+
+In brief:
+
+- Class identifiers are CamelCase
+- Class methods and variable identifiers use "camelCase", class fields use
+  "mCamelCase".
+- Template parameters are `CamelCase`.
+- Preprocessor macros are `UPPER_SNAKE_CASE`.
+
+## Justifications
+
+These sections explain why certain features are in FIT.
+
+### fit::Function
+
+- *libfidl*'s API needs a callable function wrapper with move semantics but
+  C++ 14's `std::function` only supports copyable function objects which forces
+  FIDL to allocate callback state on the heap making programs less efficient
+  and harder to write.
+- Lots of other C++ code uses callbacks extensively and would benefit from move
+  semantics for similar reasons.
+- So we should create a move-only function wrapper to use everywhere.
+
+### fit::Defer
+
+- When writing asynchronous event-driven programs, it can become challenging
+  to ensure that resources remain in scope for the duration of an operation
+  in progress and are subsequently released.
+- The C++ 14 standard library offers several classes with RAII semantics, such
+  as `std::unique_ptr`, which are helpful in these situations.  Unfortunately the
+  C++ 14 standard library does not offer affordances for easily invoking a
+  function when a block or object goes out of scope short of implementing a
+  new class from scratch.
+- We have observed several re-implementations of the same idea throughout the
+  system.
+- So we should create a simple way to invoke a function on scope exit.
+
+### fit::Nullable
+
+- Case study: fit::defer has a need to store a closure that may be nullable.
+  We were able to replace its hand-rolled lifetime management code with
+  fit::nullable thereby vastly simplifying its implementation.
+- Case study: fit::future has a need to track its own validity along with
+  a continuation that may or not be present.
+- Case study: We have previously observed bugs where developers were
+  surprised when assigning a null closure to wrappers such as fit::function
+  fit::defer, or fit::future left these objects in a supposedly "valid"
+  but uninvocable state.  These objects therefore take care to detect
+  null closures and enter an "invalid" state.  Using fit::is_null and
+  fit::nullable makes it easier to eliminate this redundant state and
+  simplifies the API for clients of these wrappers.
+- std::optional can be effective here but it doesn't directly handle nullity
+  so it takes more care to coalesce the null and "not present" states.
+  std::optional also increases the size of the object to carry an extra
+  bool and passing, whereas fit::nullable eliminates this overhead by
+  taking advantage of the underlying value's null state (if there is one).
+- So we introduce fit::nullable to handle both cases systematically while
+  still hewing close to the semantics of std::optional.
diff --git a/android-emu/android/base/fit/ThreadChecker.h b/android-emu/android/base/fit/ThreadChecker.h
new file mode 100644
index 0000000..3859ecf
--- /dev/null
+++ b/android-emu/android/base/fit/ThreadChecker.h
@@ -0,0 +1,87 @@
+// Copyright 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Copyright 2016 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// A class for checking that the current thread is/isn't the same as an initial
+// thread.
+
+#pragma once
+
+#include <assert.h>
+
+#include <thread>
+
+#include "ThreadSafety.h"
+
+namespace android::base {
+namespace fit {
+
+// A simple class that records the identity of the thread that it was created
+// on, and at later points can tell if the current thread is the same as its
+// creation thread. This class is thread-safe.
+//
+// In addition to providing an explicit check of the current thread,
+// |thread_checker| complies with BasicLockable, checking the current thread
+// when |lock| is called. This allows static thread safety analysis to be used
+// to ensure that resources are accessed in a context that is checked (at debug
+// runtime) to ensure that it's running on the correct thread:
+//
+// class MyClass {
+//  public:
+//    void Foo() {
+//      std::lock_guard<fit::thread_checker> locker(thread_checker_);
+//      resource_ = 0;
+//    }
+//  private:
+//   fit::thread_checker thread_checker_;
+//   int resource_ GUARDED_BY(thread_checker_);
+// }
+//
+// Note: |lock| checks the thread in debug builds only.
+//
+class CAPABILITY("mutex") ThreadChecker final {
+public:
+    // Default constructor. Constructs a thread checker bound to the currently
+    // running thread.
+    ThreadChecker() : self_(std::this_thread::get_id()) {}
+    // Constructs a thread checker bound to an explicit other thread.
+    explicit ThreadChecker(std::thread::id self) : self_(self) {}
+    ~ThreadChecker() = default;
+
+    // Returns true if the current thread is the thread this object was created
+    // on and false otherwise.
+    bool isThreadValid() const { return std::this_thread::get_id() == self_; }
+
+    // Implementation of the BaseLockable requirement
+    void lock() ACQUIRE() { assert(isThreadValid()); }
+
+    void unlock() RELEASE() {}
+
+private:
+    const std::thread::id self_;
+};
+
+#ifndef NDEBUG
+#define DECLARE_THREAD_CHECKER(c) android::base::fit::ThreadChecker c
+#define DCHECK_IS_THREAD_VALID(c) assert((c).isThreadValid())
+#else
+#define DECLARE_THREAD_CHECKER(c)
+#define DCHECK_IS_THREAD_VALID(c) ((void)0)
+#endif
+
+}  // namespace fit
+}  // namespace android::base
diff --git a/android-emu/android/base/fit/ThreadSafety.h b/android-emu/android/base/fit/ThreadSafety.h
new file mode 100644
index 0000000..bce528e
--- /dev/null
+++ b/android-emu/android/base/fit/ThreadSafety.h
@@ -0,0 +1,81 @@
+// Copyright 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Copyright 2018 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#pragma once
+
+// Other libraries (e.g. libbase) may have already defined these symbols.
+// Only define them if they are not defined elsewhere.
+
+// Thread-safety annotations.
+// Currently these are only supported on Clang.
+#ifndef THREAD_ANNOTATION_ATTRIBUTE__
+#if defined(__clang__) && defined(_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS) && \
+    __has_attribute(acquire_capability)
+#define THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x))
+#else
+#define THREAD_ANNOTATION_ATTRIBUTE__(x)
+#endif
+#endif  // THREAD_ANNOTATION_ATTRIBUTE__
+
+#ifndef CAPABILITY
+#define CAPABILITY(x) THREAD_ANNOTATION_ATTRIBUTE__(__capability__(x))
+#endif  // CAPABILITY
+
+#ifndef GUARDED_BY
+#define GUARDED_BY(x) THREAD_ANNOTATION_ATTRIBUTE__(__guarded_by__(x))
+#endif  // GUARDED_BY
+
+#ifndef ACQUIRE
+#define ACQUIRE(...) THREAD_ANNOTATION_ATTRIBUTE__(__acquire_capability__(__VA_ARGS__))
+#endif  // ACQUIRE
+
+#ifndef TRY_ACQUIRE
+#define TRY_ACQUIRE(...) THREAD_ANNOTATION_ATTRIBUTE__(__try_acquire_capability__(__VA_ARGS__))
+#endif  // TRY_ACQUIRE
+
+#ifndef ACQUIRED_BEFORE
+#define ACQUIRED_BEFORE(...) THREAD_ANNOTATION_ATTRIBUTE__(__acquired_before__(__VA_ARGS__))
+#endif  // ACQUIRED_BEFORE
+
+#ifndef ACQUIRED_AFTER
+#define ACQUIRED_AFTER(...) THREAD_ANNOTATION_ATTRIBUTE__(__acquired_after__(__VA_ARGS__))
+#endif  // ACQUIRED_AFTER
+
+#ifndef RELEASE
+#define RELEASE(...) THREAD_ANNOTATION_ATTRIBUTE__(__release_capability__(__VA_ARGS__))
+#endif  // RELEASE
+
+#ifndef REQUIRES
+#define REQUIRES(...) THREAD_ANNOTATION_ATTRIBUTE__(__requires_capability__(__VA_ARGS__))
+#endif  // REQUIRES
+
+#ifndef EXCLUDES
+#define EXCLUDES(...) THREAD_ANNOTATION_ATTRIBUTE__(__locks_excluded__(__VA_ARGS__))
+#endif  // EXCLUDES
+
+#ifndef RETURN_CAPABILITY
+#define RETURN_CAPABILITY(x) THREAD_ANNOTATION_ATTRIBUTE__(__lock_returned__(x))
+#endif  // RETURN_CAPABILITY
+
+#ifndef SCOPED_CAPABILITY
+#define SCOPED_CAPABILITY THREAD_ANNOTATION_ATTRIBUTE__(__scoped_lockable__)
+#endif  // SCOPED_CAPABILITY
+
+#ifndef NO_THREAD_SAFETY_ANALYSIS
+#define NO_THREAD_SAFETY_ANALYSIS THREAD_ANNOTATION_ATTRIBUTE__(__no_thread_safety_analysis__)
+#endif  // NO_THREAD_SAFETY_ANALYSIS
diff --git a/android-emu/android/base/fit/UtilityInternal.h b/android-emu/android/base/fit/UtilityInternal.h
new file mode 100644
index 0000000..274105e
--- /dev/null
+++ b/android-emu/android/base/fit/UtilityInternal.h
@@ -0,0 +1,146 @@
+// Copyright 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Copyright 2019 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#pragma once
+
+#include <type_traits>
+#include <utility>
+
+namespace android::base {
+namespace fit {
+namespace internal {
+
+// Utility to return the first type in a parameter pack.
+template <typename... Ts>
+struct First;
+template <typename FirstType, typename... Rest>
+struct First<FirstType, Rest...> {
+    using Type = FirstType;
+};
+
+template <typename... Ts>
+using First_t = typename First<Ts...>::Type;
+
+// Utility to count the occurences of type T in the parameter pack Ts.
+template <typename T, typename... Ts>
+struct OccurencesOf : std::integral_constant<size_t, 0> {};
+template <typename T, typename U>
+struct OccurencesOf<T, U> : std::integral_constant<size_t, std::is_same<T, U>::value> {};
+template <typename T, typename First, typename... Rest>
+struct OccurencesOf<T, First, Rest...>
+    : std::integral_constant<size_t,
+                             OccurencesOf<T, First>::value + OccurencesOf<T, Rest...>::value> {};
+
+template <typename T, typename... Ts>
+constexpr size_t occurencesOf = OccurencesOf<T, Ts...>::value;
+
+// Utility to remove const, volatile, and reference qualifiers.
+template <typename T>
+using RemoveCvref_t = std::remove_cv_t<std::remove_reference_t<T>>;
+
+// Evaluates to truth-like when type T matches type U with cv-reference removed.
+template <typename T, typename U>
+using NotSameType = std::negation<std::is_same<T, RemoveCvref_t<U>>>;
+
+// Concept helper for constructors.
+template <typename... Conditions>
+using RequiresConditions = std::enable_if_t<std::conjunction_v<Conditions...>, bool>;
+
+// Concept helper for assignment operators.
+template <typename Return, typename... Conditions>
+using AssignmentRequiresConditions =
+    std::enable_if_t<std::conjunction_v<Conditions...>, std::add_lvalue_reference_t<Return>>;
+
+// Evaluates to true when every element type of Ts is trivially destructible.
+template <typename... Ts>
+constexpr bool isTriviallyDestructible = std::conjunction_v<std::is_trivially_destructible<Ts>...>;
+
+// Evaluates to true when every element type of Ts is trivially copyable.
+template <typename... Ts>
+constexpr bool isTriviallyCopyable =
+    (std::conjunction_v<std::is_trivially_copy_assignable<Ts>...> &&
+     std::conjunction_v<std::is_trivially_copy_constructible<Ts>...>);
+
+// Evaluates to true when every element type of Ts is trivially movable.
+template <typename... Ts>
+constexpr bool isTriviallyMovable =
+    (std::conjunction_v<std::is_trivially_move_assignable<Ts>...> &&
+     std::conjunction_v<std::is_trivially_move_constructible<Ts>...>);
+
+// Enable if relational operator is convertible to bool and the optional
+// conditions are true.
+template <typename Op, typename... Conditions>
+using enable_relop_t =
+    std::enable_if_t<(std::is_convertible<Op, bool>::value && std::conjunction_v<Conditions...>),
+                     bool>;
+
+template <typename T>
+struct Identity {
+    using Type = T;
+};
+
+// Evaluates to true when T is an unbounded array.
+template <typename T>
+struct IsUnboundedArray : std::conjunction<std::is_array<T>, std::negation<std::extent<T>>> {};
+
+// Returns true when T is a complete type or an unbounded array.
+template <typename T, size_t = sizeof(T)>
+constexpr bool isCompleteOrUnboundedArray(Identity<T>) {
+    return true;
+}
+template <typename Identity, typename T = typename Identity::Type>
+constexpr bool isCompleteOrUnboundedArray(Identity) {
+    return std::disjunction<std::is_reference<T>, std::is_function<T>, std::is_void<T>,
+                            IsUnboundedArray<T>>::value;
+}
+
+// Using swap for ADL. This directive is contained within the fit::internal
+// namespace, which prevents leaking std::swap into user namespaces. Doing this
+// at namespace scope is necessary to lookup swap via ADL while preserving the
+// noexcept() specification of the resulting lookup.
+using std::swap;
+
+// Evaluates to true when T is swappable.
+template <typename T, typename = void>
+struct IsSwappable : std::false_type {
+    static_assert(isCompleteOrUnboundedArray(Identity<T>{}),
+                  "T must be a complete type or an unbounded array!");
+};
+template <typename T>
+struct IsSwappable<T, std::void_t<decltype(swap(std::declval<T&>(), std::declval<T&>()))>>
+    : std::true_type {
+    static_assert(isCompleteOrUnboundedArray(Identity<T>{}),
+                  "T must be a complete type or an unbounded array!");
+};
+
+// Evaluates to true when T is nothrow swappable.
+template <typename T, typename = void>
+struct IsNothrowSwappable : std::false_type {
+    static_assert(isCompleteOrUnboundedArray(Identity<T>{}),
+                  "T must be a complete type or an unbounded array!");
+};
+template <typename T>
+struct IsNothrowSwappable<T, std::void_t<decltype(swap(std::declval<T&>(), std::declval<T&>()))>>
+    : std::integral_constant<bool, noexcept(swap(std::declval<T&>(), std::declval<T&>()))> {
+    static_assert(isCompleteOrUnboundedArray(Identity<T>{}),
+                  "T must be a complete type or an unbounded array!");
+};
+
+}  // namespace internal
+}  // namespace fit
+}  // namespace android::base
diff --git a/android-emu/android/base/synchronization/AndroidConditionVariable.h b/android-emu/android/base/synchronization/AndroidConditionVariable.h
index 21cbdc0..b6ef088 100644
--- a/android-emu/android/base/synchronization/AndroidConditionVariable.h
+++ b/android-emu/android/base/synchronization/AndroidConditionVariable.h
@@ -41,13 +41,20 @@
     // efficient to signal the variable before unlocking mutex, while on others
     // (Windows) it's exactly the opposite. Functions implement the best way
     // for each platform and abstract it out from the user.
-    void signalAndUnlock(StaticLock* lock);
-    void signalAndUnlock(AutoLock* lock);
+    template <bool IsRecursive>
+    void signalAndUnlock(StaticLock<IsRecursive>* lock);
 
-    void broadcastAndUnlock(StaticLock* lock);
-    void broadcastAndUnlock(AutoLock* lock);
+    template <class Lockable>
+    void signalAndUnlock(AutoLock<Lockable>* lock);
 
-    void wait(AutoLock* userLock) {
+    template <bool IsRecursive>
+    void broadcastAndUnlock(StaticLock<IsRecursive>* lock);
+
+    template <class Lockable>
+    void broadcastAndUnlock(AutoLock<Lockable>* lock);
+
+    template <class Lockable>
+    void wait(AutoLock<Lockable>* userLock) {
         assert(userLock->mLocked);
         wait(&userLock->mLock);
     }
@@ -70,15 +77,15 @@
     //          signature and returns a condition when one should stop waiting.
     //
 
-    template <class Predicate>
-    void wait(StaticLock* lock, Predicate pred) {
+    template <bool IsRecursive, class Predicate>
+    void wait(StaticLock<IsRecursive>* lock, Predicate pred) {
         while (!pred()) {
             this->wait(lock);
         }
     }
 
-    template <class Predicate>
-    void wait(AutoLock* lock, Predicate pred) {
+    template <class Lockable, class Predicate>
+    void wait(AutoLock<Lockable>* lock, Predicate pred) {
         this->wait(&lock->mLock, pred);
     }
 
@@ -101,11 +108,13 @@
     //
     //    if (!condition) { condVar.wait(&lock); }
     //
-    void wait(StaticLock* userLock) {
+    template <bool IsRecursive>
+    void wait(StaticLock<IsRecursive>* userLock) {
         ::SleepConditionVariableSRW(&mCond, &userLock->mLock, INFINITE, 0);
     }
 
-    bool timedWait(StaticLock *userLock, System::Duration waitUntilUs) {
+    template <bool IsRecursive>
+    bool timedWait(StaticLock<IsRecursive>* userLock, System::Duration waitUntilUs) {
         const auto now = System::get()->getUnixTimeUs();
         const auto timeout =
                 std::max<System::Duration>(0, waitUntilUs  - now) / 1000;
@@ -139,18 +148,21 @@
         pthread_cond_destroy(&mCond);
     }
 
-    void wait(StaticLock* userLock) {
+    template <bool IsRecursive>
+    void wait(StaticLock<IsRecursive>* userLock) {
         pthread_cond_wait(&mCond, &userLock->mLock);
     }
 
-    bool timedWait(StaticLock* userLock, uint64_t waitUntilUs) {
+    template <bool IsRecursive>
+    bool timedWait(StaticLock<IsRecursive>* userLock, uint64_t waitUntilUs) {
         timespec abstime;
         abstime.tv_sec = waitUntilUs / 1000000LL;
         abstime.tv_nsec = (waitUntilUs % 1000000LL) * 1000;
         return timedWait(userLock, abstime);
     }
 
-    bool timedWait(StaticLock* userLock, const timespec& abstime) {
+    template <bool IsRecursive>
+    bool timedWait(StaticLock<IsRecursive>* userLock, const timespec& abstime) {
         return pthread_cond_timedwait(&mCond, &userLock->mLock, &abstime) == 0;
     }
 
@@ -171,37 +183,46 @@
 };
 
 #ifdef _WIN32
-inline void ConditionVariable::signalAndUnlock(StaticLock* lock) {
+template <bool IsRecursive>
+inline void ConditionVariable::signalAndUnlock(StaticLock<IsRecursive>* lock) {
     lock->unlock();
     signal();
 }
-inline void ConditionVariable::signalAndUnlock(AutoLock* lock) {
+template <class Lockable>
+inline void ConditionVariable::signalAndUnlock(AutoLock<Lockable>* lock) {
     lock->unlock();
     signal();
 }
 
-inline void ConditionVariable::broadcastAndUnlock(StaticLock* lock) {
+template <bool IsRecursive>
+inline void ConditionVariable::broadcastAndUnlock(StaticLock<IsRecursive>* lock) {
     lock->unlock();
     broadcast();
 }
-inline void ConditionVariable::broadcastAndUnlock(AutoLock* lock) {
+template <class Lockable>
+inline void ConditionVariable::broadcastAndUnlock(AutoLock<Lockable>* lock) {
     lock->unlock();
     broadcast();
 }
 #else  // !_WIN32
-inline void ConditionVariable::signalAndUnlock(StaticLock* lock) {
+
+template <bool IsRecursive>
+inline void ConditionVariable::signalAndUnlock(StaticLock<IsRecursive>* lock) {
     signal();
     lock->unlock();
 }
-inline void ConditionVariable::signalAndUnlock(AutoLock* lock) {
+template <class Lockable>
+inline void ConditionVariable::signalAndUnlock(AutoLock<Lockable>* lock) {
     signal();
     lock->unlock();
 }
-inline void ConditionVariable::broadcastAndUnlock(StaticLock* lock) {
+template <bool IsRecursive>
+inline void ConditionVariable::broadcastAndUnlock(StaticLock<IsRecursive>* lock) {
     broadcast();
     lock->unlock();
 }
-inline void ConditionVariable::broadcastAndUnlock(AutoLock* lock) {
+template <class Lockable>
+inline void ConditionVariable::broadcastAndUnlock(AutoLock<Lockable>* lock) {
     broadcast();
     lock->unlock();
 }
diff --git a/android-emu/android/base/synchronization/AndroidLock.h b/android-emu/android/base/synchronization/AndroidLock.h
index 74877d4..7b567f2 100644
--- a/android-emu/android/base/synchronization/AndroidLock.h
+++ b/android-emu/android/base/synchronization/AndroidLock.h
@@ -37,16 +37,22 @@
 namespace base {
 namespace guest {
 
+template <class Lockable>
 class AutoLock;
+
 class AutoWriteLock;
 class AutoReadLock;
 
 // A wrapper class for mutexes only suitable for using in static context,
-// where it's OK to leak the underlying system object. Use Lock for scoped or
-// member locks.
-class StaticLock {
+// where it's OK to leak the underlying system object.
+// Use Lock / RecursiveLock for scoped or member locks.
+template <bool IsRecursive>
+class StaticLock;
+
+template <>
+class StaticLock<false> {
 public:
-    using AutoLock = android::base::guest::AutoLock;
+    using AutoLock = android::base::guest::AutoLock<StaticLock>;
 
     constexpr StaticLock() = default;
 
@@ -100,8 +106,72 @@
     AEMU_IF_DEBUG(bool mIsLocked = false;)
 };
 
+template <>
+class StaticLock<true> {
+public:
+    using AutoLock = android::base::guest::AutoLock<StaticLock>;
+
+    StaticLock() {
+#ifdef _WIN32
+        ::InitializeCriticalSectionAndSpinCount(&mLock, 0x400);
+#else
+        pthread_mutexattr_t attr;
+        pthread_mutexattr_init(&attr);
+        pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+        pthread_mutex_init(&mLock, &attr);
+#endif
+    }
+
+    // Acquire the lock.
+    void lock() {
+#ifdef _WIN32
+        ::EnterCriticalSection(&mLock);
+#else
+        ::pthread_mutex_lock(&mLock);
+#endif
+        AEMU_IF_DEBUG(mIsLocked = true;)
+    }
+
+    bool tryLock() {
+        bool ret = false;
+#ifdef _WIN32
+        ret = ::TryEnterCriticalSection(&mLock);
+#else
+        ret = ::pthread_mutex_trylock(&mLock) == 0;
+#endif
+        AEMU_IF_DEBUG(mIsLocked = ret;)
+        return ret;
+    }
+
+    AEMU_IF_DEBUG(bool isLocked() const { return mIsLocked; })
+
+    // Release the lock.
+    void unlock() {
+        AEMU_IF_DEBUG(mIsLocked = false;)
+#ifdef _WIN32
+        ::LeaveCriticalSection(&mLock);
+#else
+        ::pthread_mutex_unlock(&mLock);
+#endif
+    }
+
+protected:
+    friend class ConditionVariable;
+
+#ifdef _WIN32
+    // We use CRITICAL_SECTION since it always allow recursive access.
+    CRITICAL_SECTION mLock;
+#else
+    pthread_mutex_t mLock = PTHREAD_MUTEX_INITIALIZER;
+#endif
+    // Both POSIX threads and WinAPI don't allow move (undefined behavior).
+    DISALLOW_COPY_ASSIGN_AND_MOVE(StaticLock);
+
+    AEMU_IF_DEBUG(bool mIsLocked = false;)
+};
+
 // Simple wrapper class for mutexes used in non-static context.
-class Lock : public StaticLock {
+class Lock : public StaticLock<false> {
 public:
     using StaticLock::AutoLock;
 
@@ -113,6 +183,22 @@
 #endif
 };
 
+// Simple wrapper class for mutexes used in non-static context.
+class RecursiveLock : public StaticLock<true> {
+public:
+    using StaticLock::AutoLock;
+
+    RecursiveLock() = default;
+
+    ~RecursiveLock() {
+#ifdef _WIN32
+        ::DeleteCriticalSection(&mLock);
+#else
+        ::pthread_mutex_destroy(&mLock);
+#endif
+    }
+};
+
 class ReadWriteLock {
 public:
     using AutoWriteLock = android::base::guest::AutoWriteLock;
@@ -147,11 +233,12 @@
 // Helper class to lock / unlock a mutex automatically on scope
 // entry and exit.
 // NB: not thread-safe (as opposed to the Lock class)
+template <class Lockable>
 class AutoLock {
 public:
-    AutoLock(StaticLock& lock) : mLock(lock) { mLock.lock(); }
+    AutoLock(Lockable& lock) : mLock(lock) { mLock.lock(); }
 
-    AutoLock(AutoLock&& other) : mLock(other.mLock), mLocked(other.mLocked) {
+    AutoLock(AutoLock<Lockable>&& other) : mLock(other.mLock), mLocked(other.mLocked) {
         other.mLocked = false;
     }
 
@@ -176,7 +263,7 @@
     }
 
 private:
-    StaticLock& mLock;
+    Lockable& mLock;
     bool mLocked = true;
 
     friend class ConditionVariable;
diff --git a/shared/GoldfishAddressSpace/include/goldfish_address_space.h b/shared/GoldfishAddressSpace/include/goldfish_address_space.h
index b824ace..1012629 100644
--- a/shared/GoldfishAddressSpace/include/goldfish_address_space.h
+++ b/shared/GoldfishAddressSpace/include/goldfish_address_space.h
@@ -68,10 +68,10 @@
 
 #ifdef __Fuchsia__
     std::unique_ptr<
-        fuchsia_hardware_goldfish::AddressSpaceDevice::SyncClient>
+        ::fidl::WireSyncClient<fuchsia_hardware_goldfish::AddressSpaceDevice>>
         m_device;
     std::unique_ptr<
-        fuchsia_hardware_goldfish::AddressSpaceChildDriver::SyncClient>
+        ::fidl::WireSyncClient<fuchsia_hardware_goldfish::AddressSpaceChildDriver>>
         m_child_driver;
 #else // __Fuchsia__
     address_space_handle_t m_handle;
@@ -104,7 +104,7 @@
     GoldfishAddressSpaceBlock &operator=(const GoldfishAddressSpaceBlock &);
 
 #ifdef __Fuchsia__
-    fuchsia_hardware_goldfish::AddressSpaceChildDriver::SyncClient*
+    ::fidl::WireSyncClient<fuchsia_hardware_goldfish::AddressSpaceChildDriver>*
         m_driver;
     uint32_t  m_vmo;
 #else // __Fuchsia__
diff --git a/shared/GoldfishAddressSpace/include/goldfish_address_space_fuchsia.impl b/shared/GoldfishAddressSpace/include/goldfish_address_space_fuchsia.impl
index e9acb4d..54d7e35 100644
--- a/shared/GoldfishAddressSpace/include/goldfish_address_space_fuchsia.impl
+++ b/shared/GoldfishAddressSpace/include/goldfish_address_space_fuchsia.impl
@@ -57,7 +57,7 @@
               __FUNCTION__);
         return;
     }
-    m_device = std::make_unique<AddressSpaceDevice::SyncClient>(std::move(channel));
+    m_device = std::make_unique<fidl::WireSyncClient<AddressSpaceDevice>>(std::move(channel));
 
     auto child_driver_ends =
         fidl::CreateEndpoints<::fuchsia_hardware_goldfish::AddressSpaceChildDriver>();
@@ -74,7 +74,7 @@
               __FUNCTION__, result.status());
         return;
     }
-    m_child_driver = std::make_unique<AddressSpaceChildDriver::SyncClient>(
+    m_child_driver = std::make_unique<fidl::WireSyncClient<AddressSpaceChildDriver>>(
         std::move(child_driver_ends->client));
 }
 
@@ -128,7 +128,7 @@
         return false;
     }
 
-    AddressSpaceChildDriver::SyncClient* driver = provider->m_child_driver.get();
+    fidl::WireSyncClient<AddressSpaceChildDriver>* driver = provider->m_child_driver.get();
 
     auto result = driver->AllocateBlock(size);
     if (!result.ok() || result.Unwrap()->res != ZX_OK) {
@@ -308,15 +308,15 @@
               __FUNCTION__);
         return 0;
     }
-    AddressSpaceDevice::SyncClient*
-        deviceSync = new AddressSpaceDevice::SyncClient(std::move(channel));
+    fidl::WireSyncClient<AddressSpaceDevice>*
+        deviceSync = new fidl::WireSyncClient<AddressSpaceDevice>(std::move(channel));
     return (address_space_handle_t)deviceSync;
 }
 
 void goldfish_address_space_close(address_space_handle_t handle) {
-    AddressSpaceDevice::SyncClient* deviceSync =
+    fidl::WireSyncClient<AddressSpaceDevice>* deviceSync =
         reinterpret_cast<
-            AddressSpaceDevice::SyncClient*>(handle);
+            fidl::WireSyncClient<AddressSpaceDevice>*>(handle);
     delete deviceSync;
 }
 
@@ -324,9 +324,9 @@
     address_space_handle_t handle, GoldfishAddressSpaceSubdeviceType type,
     address_space_handle_t* handle_out) {
 
-    AddressSpaceDevice::SyncClient* deviceSync =
+    fidl::WireSyncClient<AddressSpaceDevice>* deviceSync =
         reinterpret_cast<
-            AddressSpaceDevice::SyncClient*>(handle);
+            fidl::WireSyncClient<AddressSpaceDevice>*>(handle);
 
     auto child_driver_ends =
         fidl::CreateEndpoints<::fuchsia_hardware_goldfish::AddressSpaceChildDriver>();
@@ -339,8 +339,8 @@
         static_cast<AddressSpaceChildDriverType>(type),
         std::move(child_driver_ends->server));
 
-    AddressSpaceChildDriver::SyncClient*
-        childSync = new AddressSpaceChildDriver::SyncClient(std::move(child_driver_ends->client));
+    fidl::WireSyncClient<AddressSpaceChildDriver>*
+        childSync = new fidl::WireSyncClient<AddressSpaceChildDriver>(std::move(child_driver_ends->client));
 
     // On creating a subdevice, in our use cases we wont be needing the
     // original device sync anymore, so get rid of it.
@@ -354,9 +354,9 @@
 bool goldfish_address_space_allocate(
     address_space_handle_t handle,
     size_t size, uint64_t* phys_addr, uint64_t* offset) {
-    AddressSpaceChildDriver::SyncClient* deviceSync =
+    fidl::WireSyncClient<AddressSpaceChildDriver>* deviceSync =
         reinterpret_cast<
-            AddressSpaceChildDriver::SyncClient*>(handle);
+            fidl::WireSyncClient<AddressSpaceChildDriver>*>(handle);
 
     zx::vmo vmo;
     auto result = deviceSync->AllocateBlock(size);
@@ -384,9 +384,9 @@
     if (info.vmo == ZX_HANDLE_INVALID) return false;
     zx_handle_close(info.vmo);
 
-    AddressSpaceChildDriver::SyncClient* deviceSync =
+    fidl::WireSyncClient<AddressSpaceChildDriver>* deviceSync =
         reinterpret_cast<
-            AddressSpaceChildDriver::SyncClient*>(handle);
+            fidl::WireSyncClient<AddressSpaceChildDriver>*>(handle);
 
     auto result = deviceSync->DeallocateBlock(info.phys_addr);
     if (!result.ok() || result.Unwrap()->res != ZX_OK) {
@@ -400,9 +400,9 @@
 bool goldfish_address_space_claim_shared(
     address_space_handle_t handle, uint64_t offset, uint64_t size) {
 
-    AddressSpaceChildDriver::SyncClient* deviceSync =
+    fidl::WireSyncClient<AddressSpaceChildDriver>* deviceSync =
         reinterpret_cast<
-            AddressSpaceChildDriver::SyncClient*>(handle);
+            fidl::WireSyncClient<AddressSpaceChildDriver>*>(handle);
 
     zx::vmo vmo;
     auto result = deviceSync->ClaimSharedBlock(offset, size);
@@ -423,9 +423,9 @@
 
 bool goldfish_address_space_unclaim_shared(
     address_space_handle_t handle, uint64_t offset) {
-    AddressSpaceChildDriver::SyncClient* deviceSync =
+    fidl::WireSyncClient<AddressSpaceChildDriver>* deviceSync =
         reinterpret_cast<
-            AddressSpaceChildDriver::SyncClient*>(handle);
+            fidl::WireSyncClient<AddressSpaceChildDriver>*>(handle);
 
     auto result = deviceSync->UnclaimSharedBlock(offset);
     if (!result.ok() || result.Unwrap()->res != ZX_OK) {
@@ -469,9 +469,9 @@
     AddressSpaceChildDriverPingMessage fuchsiaPing =
         *(AddressSpaceChildDriverPingMessage*)ping;
 
-    AddressSpaceChildDriver::SyncClient* deviceSync =
+    fidl::WireSyncClient<AddressSpaceChildDriver>* deviceSync =
         reinterpret_cast<
-            AddressSpaceChildDriver::SyncClient*>(handle);
+            fidl::WireSyncClient<AddressSpaceChildDriver>*>(handle);
 
     AddressSpaceChildDriverPingMessage res;
     auto result = deviceSync->Ping(fuchsiaPing);
diff --git a/shared/OpenglCodecCommon/GLClientState.cpp b/shared/OpenglCodecCommon/GLClientState.cpp
index 93f9d5d..0915341 100644
--- a/shared/OpenglCodecCommon/GLClientState.cpp
+++ b/shared/OpenglCodecCommon/GLClientState.cpp
@@ -1481,7 +1481,7 @@
     return GL_NO_ERROR;
 }
 
-void GLClientState::setBoundEGLImage(GLenum target, GLeglImageOES image) {
+void GLClientState::setBoundEGLImage(GLenum target, GLeglImageOES image, int width, int height) {
     (void)image;
 
     if (target == GL_RENDERBUFFER) {
@@ -1489,7 +1489,7 @@
         setBoundRenderbufferEGLImageBacked();
         setBoundRenderbufferFormat(GL_RGBA);
         setBoundRenderbufferSamples(0);
-        setBoundRenderbufferDimensions(1, 1);
+        setBoundRenderbufferDimensions(width, height);
     } else {
         GLuint texture = getBoundTexture(target);
         TextureRec* texrec = getTextureRec(texture);
@@ -1499,7 +1499,7 @@
         setBoundTextureFormat(target, GL_RGBA);
         setBoundTextureType(target, GL_UNSIGNED_BYTE);
         setBoundTextureSamples(target, 0);
-        setBoundTextureDims(target, target, 0, 1, 1, 1);
+        setBoundTextureDims(target, target, 0, width, height, 1);
     }
 }
 
@@ -1760,7 +1760,9 @@
 GLenum GLClientState::checkFramebufferCompleteness(GLenum target) {
     // Default framebuffer is complete
     // TODO: Check the case where the default framebuffer is 0x0
-    if (0 == boundFramebuffer(target)) return GL_FRAMEBUFFER_COMPLETE;
+    if (0 == boundFramebuffer(target)) {
+        return GL_FRAMEBUFFER_COMPLETE;
+    }
 
     bool hasAttachment = false;
     FboProps& props = boundFboProps(target);
@@ -2469,6 +2471,10 @@
     props.depthAttachment_hasRbo = false;
     props.stencilAttachment_hasRbo = false;
     props.depthstencilAttachment_hasRbo = false;
+
+    props.defaultWidth = 0;
+    props.defaultHeight = 0;
+
     mFboState.fboData[name] = props;
 }
 
diff --git a/shared/OpenglCodecCommon/GLClientState.h b/shared/OpenglCodecCommon/GLClientState.h
index c0ca53a..ff20287 100644
--- a/shared/OpenglCodecCommon/GLClientState.h
+++ b/shared/OpenglCodecCommon/GLClientState.h
@@ -414,7 +414,7 @@
     // For accurate error detection, bindTexture should be called for *all*
     // targets, not just 2D and EXTERNAL_OES.
     GLenum bindTexture(GLenum target, GLuint texture, GLboolean* firstUse);
-    void setBoundEGLImage(GLenum target, GLeglImageOES image);
+    void setBoundEGLImage(GLenum target, GLeglImageOES image, int width, int height);
 
     // Return the texture currently bound to GL_TEXTURE_(2D|EXTERNAL_OES).
     GLuint getBoundTexture(GLenum target) const;
diff --git a/shared/OpenglCodecCommon/GLSharedGroup.h b/shared/OpenglCodecCommon/GLSharedGroup.h
index 807a006..9832378 100755
--- a/shared/OpenglCodecCommon/GLSharedGroup.h
+++ b/shared/OpenglCodecCommon/GLSharedGroup.h
@@ -30,6 +30,7 @@
 #include <GLES2/gl2ext.h>
 
 #include <map>
+#include <memory>
 #include <string>
 #include <vector>
 
@@ -39,7 +40,6 @@
 #include <utils/threads.h>
 #include "auto_goldfish_dma_context.h"
 #include "IndexRangeCache.h"
-#include "SmartPtr.h"
 #include "StateTrackingSupport.h"
 
 struct BufferData {
@@ -258,6 +258,6 @@
     int getActiveAttributesCountForProgram(GLuint program);
 };
 
-typedef SmartPtr<GLSharedGroup> GLSharedGroupPtr; 
+typedef std::shared_ptr<GLSharedGroup> GLSharedGroupPtr;
 
 #endif //_GL_SHARED_GROUP_H_
diff --git a/shared/OpenglCodecCommon/SmartPtr.h b/shared/OpenglCodecCommon/SmartPtr.h
deleted file mode 100644
index 3d821c8..0000000
--- a/shared/OpenglCodecCommon/SmartPtr.h
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
-* Copyright (C) 2011 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-#ifndef __SMART_PTR_H
-#define __SMART_PTR_H
-
-#include <PortableMutex.h>
-
-#include <cutils/atomic.h>
-
-template <class T, bool threadSafe = false>
-class SmartPtr
-{
-public:
-    explicit SmartPtr(T* ptr = (T*)NULL) {
-        if (threadSafe) {
-            m_lock = new mutex_t;
-            mutex_init(m_lock);
-        }
-        else m_lock = NULL;
-
-        m_ptr = ptr;
-        if (ptr)
-           m_pRefCount = new int32_t(1);
-        else
-           m_pRefCount = NULL;
-    }
-
-    SmartPtr<T,threadSafe>(const SmartPtr<T,false>& rhs) {
-        if (threadSafe) {
-            m_lock = new mutex_t;
-            mutex_init(m_lock);
-        }
-        else m_lock = NULL;
-
-        m_pRefCount = rhs.m_pRefCount;
-        m_ptr       = rhs.m_ptr;
-        use();
-    }
-
-    SmartPtr<T,threadSafe>(SmartPtr<T,true>& rhs) {
-        if (threadSafe) {
-            m_lock = new mutex_t;
-            mutex_init(m_lock);
-        }
-        else m_lock = NULL;
-
-        if (rhs.m_lock) mutex_lock(rhs.m_lock);
-        m_pRefCount = rhs.m_pRefCount;
-        m_ptr       = rhs.m_ptr;
-        use();
-        if (rhs.m_lock) mutex_unlock(rhs.m_lock);
-    }
-
-    ~SmartPtr() {
-        if (m_lock) mutex_lock(m_lock);
-        release();
-        if (m_lock)
-        {
-            mutex_unlock(m_lock);
-            mutex_destroy(m_lock);
-            delete m_lock;
-        }
-    }
-
-    T* Ptr() const {
-        return m_ptr;
-    }
-
-    const T* constPtr() const
-    {
-        return m_ptr;
-    }
-
-    T* operator->() const {
-        return m_ptr;
-    }
-
-    T& operator*() const {
-        return *m_ptr;
-    }
-
-    operator void*() const {
-        return (void *)m_ptr;
-    }
-
-    // This gives STL lists something to compare.
-    bool operator <(const SmartPtr<T>& t1) const {
-        return m_ptr < t1.m_ptr;
-    }
-
-    SmartPtr<T,threadSafe>& operator=(const SmartPtr<T,false>& rhs)
-    {
-        if (m_ptr == rhs.m_ptr)
-            return *this;
-
-        if (m_lock) mutex_lock(m_lock);
-        release();
-        m_pRefCount = rhs.m_pRefCount;
-        m_ptr       = rhs.m_ptr;
-        use();
-        if (m_lock) mutex_unlock(m_lock);
-
-        return *this;
-    }
-
-    SmartPtr<T,threadSafe>& operator=(SmartPtr<T,true>& rhs)
-    {
-        if (m_ptr == rhs.m_ptr)
-            return *this;
-
-        if (m_lock) mutex_lock(m_lock);
-        release();
-        if (rhs.m_lock) mutex_lock(rhs.m_lock);
-        m_pRefCount = rhs.m_pRefCount;
-        m_ptr       = rhs.m_ptr;
-        use();
-        if (rhs.m_lock) mutex_unlock(rhs.m_lock);
-        if (m_lock) mutex_unlock(m_lock);
-
-        return *this;
-    }
-
-private:
-    int32_t  *m_pRefCount;
-    mutex_t  *m_lock;
-    T* m_ptr;
-
-    // Increment the reference count on this pointer by 1.
-    int use() {
-        if (!m_pRefCount) return 0;
-        return android_atomic_inc(m_pRefCount) + 1;
-    }
-
-    // Decrement the reference count on the pointer by 1.
-    // If the reference count goes to (or below) 0, the pointer is deleted.
-    int release() {
-        if (!m_pRefCount) return 0;
-
-        int iVal = android_atomic_dec(m_pRefCount);
-        if (iVal > 1)
-            return iVal - 1;
-
-        delete m_pRefCount;
-        m_pRefCount = NULL;
-
-        if (m_ptr) {
-            delete m_ptr;
-            m_ptr = NULL;
-        }
-        return 0;
-    }
-
-};
-
-#endif // of  __SMART_PTR_H
diff --git a/system/GLESv1_enc/GLEncoder.h b/system/GLESv1_enc/GLEncoder.h
index a26636c..7837838 100644
--- a/system/GLESv1_enc/GLEncoder.h
+++ b/system/GLESv1_enc/GLEncoder.h
@@ -33,7 +33,7 @@
     }
     void setSharedGroup(GLSharedGroupPtr shared) {
         m_shared = shared;
-        if (m_state && m_shared.Ptr())
+        if (m_state && m_shared)
             m_state->setTextureData(m_shared->getTextureData());
     }
     void flush() { m_stream->flush(); }
diff --git a/system/GLESv2/gl2.cpp b/system/GLESv2/gl2.cpp
index 1c5ece7..9598a30 100644
--- a/system/GLESv2/gl2.cpp
+++ b/system/GLESv2/gl2.cpp
@@ -79,7 +79,7 @@
         DEFINE_AND_VALIDATE_HOST_CONNECTION();
 
         ctx->override2DTextureTarget(target);
-        ctx->associateEGLImage(target, hostImage);
+        ctx->associateEGLImage(target, hostImage, image->width, image->height);
         rcEnc->rcBindTexture(rcEnc,
                 grallocHelper->getHostHandle(native_buffer->handle));
         ctx->restore2DTextureTarget(target);
@@ -87,7 +87,7 @@
     else if (image->target == EGL_GL_TEXTURE_2D_KHR) {
         GET_CONTEXT;
         ctx->override2DTextureTarget(target);
-        ctx->associateEGLImage(target, hostImage);
+        ctx->associateEGLImage(target, hostImage, image->width, image->height);
         ctx->m_glEGLImageTargetTexture2DOES_enc(self, GL_TEXTURE_2D, hostImage);
         ctx->restore2DTextureTarget(target);
     }
@@ -116,7 +116,7 @@
 
         DEFINE_AND_VALIDATE_HOST_CONNECTION();
         GET_CONTEXT;
-        ctx->associateEGLImage(target, hostImage);
+        ctx->associateEGLImage(target, hostImage, image->width, image->height);
         rcEnc->rcBindRenderbuffer(rcEnc,
                 grallocHelper->getHostHandle(native_buffer->handle));
     } else {
diff --git a/system/GLESv2_enc/GL2Encoder.cpp b/system/GLESv2_enc/GL2Encoder.cpp
index 931fa4e..9fcce62 100755
--- a/system/GLESv2_enc/GL2Encoder.cpp
+++ b/system/GLESv2_enc/GL2Encoder.cpp
@@ -41,7 +41,7 @@
 static GLubyte *gExtensionsString= (GLubyte *) "GL_OES_EGL_image_external ";
 
 #define SET_ERROR_IF(condition, err) if((condition)) { \
-        ALOGE("%s:%s:%d GL error 0x%x\n", __FILE__, __FUNCTION__, __LINE__, err); \
+        ALOGE("%s:%s:%d GL error 0x%x condition [%s]\n", __FILE__, __FUNCTION__, __LINE__, err, #condition); \
         ctx->setError(err); \
         return; \
     }
@@ -74,6 +74,7 @@
     m_currMajorVersion = 2;
     m_currMinorVersion = 0;
     m_hasAsyncUnmapBuffer = false;
+    m_hasSyncBufferData = false;
     m_initialized = false;
     m_noHostError = false;
     m_state = NULL;
@@ -668,7 +669,11 @@
 
     ctx->m_shared->updateBufferData(bufferId, size, data);
     ctx->m_shared->setBufferUsage(bufferId, usage);
-    ctx->m_glBufferData_enc(self, target, size, data, usage);
+    if (ctx->m_hasSyncBufferData) {
+        ctx->glBufferDataSyncAEMU(self, target, size, data, usage);
+    } else {
+        ctx->m_glBufferData_enc(self, target, size, data, usage);
+    }
 }
 
 void GL2Encoder::s_glBufferSubData(void * self, GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data)
@@ -1104,10 +1109,14 @@
 
     default:
         if (!state) return;
-        if (!state->getClientStateParameter<GLboolean>(param, ptr)) {
-            ctx->safe_glGetBooleanv(param, ptr);
+        {
+            GLint intVal;
+            if (!state->getClientStateParameter<GLint>(param, &intVal)) {
+                ctx->safe_glGetBooleanv(param, ptr);
+            } else {
+                *ptr = (intVal != 0) ? GL_TRUE : GL_FALSE;
+            }
         }
-        *ptr = (*ptr != 0) ? GL_TRUE : GL_FALSE;
         break;
     }
 }
@@ -1454,7 +1463,7 @@
 
     if (!has_client_vertex_arrays && !has_indirect_arrays) {
         // ALOGW("glDrawElements: no vertex arrays / buffers bound to the command\n");
-        GLenum status = ctx->m_glCheckFramebufferStatus_enc(self, GL_FRAMEBUFFER);
+        GLenum status = ctx->glCheckFramebufferStatus(self, GL_FRAMEBUFFER);
         SET_ERROR_IF(status != GL_FRAMEBUFFER_COMPLETE, GL_INVALID_FRAMEBUFFER_OPERATION);
     }
 
@@ -1571,7 +1580,7 @@
 
     if (!has_client_vertex_arrays && !has_indirect_arrays) {
         // ALOGW("glDrawElements: no vertex arrays / buffers bound to the command\n");
-        GLenum status = ctx->m_glCheckFramebufferStatus_enc(self, GL_FRAMEBUFFER);
+        GLenum status = ctx->glCheckFramebufferStatus(self, GL_FRAMEBUFFER);
         SET_ERROR_IF(status != GL_FRAMEBUFFER_COMPLETE, GL_INVALID_FRAMEBUFFER_OPERATION);
     }
 
@@ -1664,6 +1673,7 @@
 // Replace uses of samplerExternalOES with sampler2D, recording the names of
 // modified shaders in data. Also remove
 //   #extension GL_OES_EGL_image_external : require
+//   #extension GL_OES_EGL_image_external_essl3 : require
 // statements.
 //
 // This implementation assumes the input has already been pre-processed. If not,
@@ -1753,34 +1763,40 @@
         }
         char* sampler_start = c;
         c += samplerExternalType.size();
-        if (!isspace(*c) && *c != '\0') {
+        if (!isspace(*c) && *c != '\0' && *c != ';') {
             continue;
+        } else {
+            // capture sampler name
+            while (isspace(*c) && *c != '\0') {
+                c++;
+            }
         }
 
-        // capture sampler name
-        while (isspace(*c) && *c != '\0') {
-            c++;
-        }
-        if (!isalpha(*c) && *c != '_') {
-            // not an identifier
-            return false;
-        }
-        char* name_start = c;
-        do {
-            c++;
-        } while (isalnum(*c) || *c == '_');
+        if ((!isalpha(*c) && *c != '_') || *c == ';') {
+            // not an identifier, but might have some effect anyway.
+            if (samplerExternalType == STR_SAMPLER_EXTERNAL_OES) {
+                memcpy(sampler_start, STR_SAMPLER2D_SPACE, sizeof(STR_SAMPLER2D_SPACE)-1);
+            }
+        } else {
+            char* name_start = c;
+            do {
+                c++;
+            } while (isalnum(*c) || *c == '_');
 
-        size_t len = (size_t)(c - name_start);
-        data->samplerExternalNames.push_back(
-            std::string(name_start, len));
+            size_t len = (size_t)(c - name_start);
+            if (len) {
+                data->samplerExternalNames.push_back(
+                        std::string(name_start, len));
+            }
 
-        // We only need to perform a string replacement for the original
-        // occurrence of samplerExternalOES if a #define was used.
-        //
-        // The important part was to record the name in
-        // |data->samplerExternalNames|.
-        if (samplerExternalType == STR_SAMPLER_EXTERNAL_OES) {
-            memcpy(sampler_start, STR_SAMPLER2D_SPACE, sizeof(STR_SAMPLER2D_SPACE)-1);
+            // We only need to perform a string replacement for the original
+            // occurrence of samplerExternalOES if a #define was used.
+            //
+            // The important part was to record the name in
+            // |data->samplerExternalNames|.
+            if (samplerExternalType == STR_SAMPLER_EXTERNAL_OES) {
+                memcpy(sampler_start, STR_SAMPLER2D_SPACE, sizeof(STR_SAMPLER2D_SPACE)-1);
+            }
         }
     }
 
@@ -2593,7 +2609,8 @@
     SET_ERROR_IF(!GLESv2Validation::textureTarget(ctx, target), GL_INVALID_ENUM);
     SET_ERROR_IF(!GLESv2Validation::pixelType(ctx, type), GL_INVALID_ENUM);
     SET_ERROR_IF(!GLESv2Validation::pixelFormat(ctx, format), GL_INVALID_ENUM);
-    SET_ERROR_IF(!GLESv2Validation::pixelFormat(ctx, internalformat) && !GLESv2Validation::pixelInternalFormat(internalformat), GL_INVALID_ENUM);
+    SET_ERROR_IF(!GLESv2Validation::pixelFormat(ctx, internalformat) && !GLESv2Validation::pixelInternalFormat(internalformat), GL_INVALID_VALUE);
+    SET_ERROR_IF(!(GLESv2Validation::pixelOp(format,type)),GL_INVALID_OPERATION);
     SET_ERROR_IF(!GLESv2Validation::pixelSizedFormat(ctx, internalformat, format, type), GL_INVALID_OPERATION);
     // If unpack buffer is nonzero, verify unmapped state.
     SET_ERROR_IF(ctx->isBufferTargetMapped(GL_PIXEL_UNPACK_BUFFER), GL_INVALID_OPERATION);
@@ -2744,7 +2761,7 @@
     GLClientState* state = ctx->m_state;
 
     SET_ERROR_IF(!GLESv2Validation::textureTarget(ctx, target), GL_INVALID_ENUM);
-    SET_ERROR_IF(!GLESv2Validation::pixelFormat(ctx, internalformat) && !GLESv2Validation::pixelInternalFormat(internalformat), GL_INVALID_ENUM);
+    SET_ERROR_IF(!GLESv2Validation::pixelFormat(ctx, internalformat) && !GLESv2Validation::pixelInternalFormat(internalformat), GL_INVALID_VALUE);
     GLint max_texture_size;
     GLint max_cube_map_texture_size;
     ctx->glGetIntegerv(ctx, GL_MAX_TEXTURE_SIZE, &max_texture_size);
@@ -2847,8 +2864,8 @@
     }
 }
 
-void GL2Encoder::associateEGLImage(GLenum target, GLeglImageOES eglImage) {
-    m_state->setBoundEGLImage(target, eglImage);
+void GL2Encoder::associateEGLImage(GLenum target, GLeglImageOES eglImage, int width, int height) {
+    m_state->setBoundEGLImage(target, eglImage, width, height);
 }
 
 
@@ -2930,6 +2947,7 @@
     GLClientState* state = ctx->m_state;
 
     SET_ERROR_IF(target != GL_RENDERBUFFER, GL_INVALID_ENUM);
+    SET_ERROR_IF(0 == ctx->m_state->boundRenderbuffer(), GL_INVALID_OPERATION);
     SET_ERROR_IF(
         !GLESv2Validation::rboFormat(ctx, internalformat),
         GL_INVALID_ENUM);
@@ -3356,6 +3374,7 @@
 
     SET_ERROR_IF(!GLESv2Validation::textureTarget(ctx, target), GL_INVALID_ENUM);
     SET_ERROR_IF(target == GL_TEXTURE_CUBE_MAP, GL_INVALID_ENUM);
+    fprintf(stderr, "%s: format: 0x%x\n", __func__, internalformat);
     // Filter compressed formats support.
     SET_ERROR_IF(!GLESv2Validation::supportedCompressedFormat(ctx, internalformat), GL_INVALID_ENUM);
     // Verify level <= log2(GL_MAX_TEXTURE_SIZE).
@@ -4228,6 +4247,7 @@
                  GL_INVALID_ENUM);
     SET_ERROR_IF(!GLESv2Validation::pixelType(ctx, type), GL_INVALID_ENUM);
     SET_ERROR_IF(!GLESv2Validation::pixelFormat(ctx, format), GL_INVALID_ENUM);
+    SET_ERROR_IF(!(GLESv2Validation::pixelOp(format,type)),GL_INVALID_OPERATION);
     SET_ERROR_IF(!GLESv2Validation::pixelSizedFormat(ctx, internalFormat, format, type), GL_INVALID_OPERATION);
     SET_ERROR_IF(target == GL_TEXTURE_3D &&
         ((format == GL_DEPTH_COMPONENT) ||
@@ -4572,7 +4592,7 @@
 
     if (!has_client_vertex_arrays && !has_indirect_arrays) {
         // ALOGW("glDrawElements: no vertex arrays / buffers bound to the command\n");
-        GLenum status = ctx->m_glCheckFramebufferStatus_enc(self, GL_FRAMEBUFFER);
+        GLenum status = ctx->glCheckFramebufferStatus(self, GL_FRAMEBUFFER);
         SET_ERROR_IF(status != GL_FRAMEBUFFER_COMPLETE, GL_INVALID_FRAMEBUFFER_OPERATION);
     }
 
@@ -4665,7 +4685,7 @@
 
     if (!has_client_vertex_arrays && !has_indirect_arrays) {
         // ALOGW("glDrawElements: no vertex arrays / buffers bound to the command\n");
-        GLenum status = ctx->m_glCheckFramebufferStatus_enc(self, GL_FRAMEBUFFER);
+        GLenum status = ctx->glCheckFramebufferStatus(self, GL_FRAMEBUFFER);
         SET_ERROR_IF(status != GL_FRAMEBUFFER_COMPLETE, GL_INVALID_FRAMEBUFFER_OPERATION);
     }
 
@@ -6106,6 +6126,18 @@
     GLuint tex = ctx->m_state->getBoundTexture(target);
     GLsizei neededWidth = xoffset + width;
     GLsizei neededHeight = yoffset + height;
+    ALOGV("%s: tex %u needed width height %d %d xoff %d width %d yoff %d height %d (texture width %d height %d) level %d\n", __func__,
+            tex,
+            neededWidth,
+            neededHeight,
+            xoffset,
+            width,
+            yoffset,
+            height,
+            ctx->m_state->queryTexWidth(level, tex),
+            ctx->m_state->queryTexWidth(level, tex),
+            level);
+
     SET_ERROR_IF(tex &&
                  (neededWidth > ctx->m_state->queryTexWidth(level, tex) ||
                   neededHeight > ctx->m_state->queryTexHeight(level, tex)),
@@ -6554,6 +6586,7 @@
     GL2Encoder* ctx = (GL2Encoder*)self;
     SET_ERROR_IF(target != GL_RENDERBUFFER, GL_INVALID_ENUM);
     SET_ERROR_IF(!GLESv2Validation::allowedGetRenderbufferParameter(pname), GL_INVALID_ENUM);
+    SET_ERROR_IF(0 == ctx->m_state->boundRenderbuffer(), GL_INVALID_OPERATION);
     ctx->m_glGetRenderbufferParameteriv_enc(ctx, target, pname, params);
 }
 
diff --git a/system/GLESv2_enc/GL2Encoder.h b/system/GLESv2_enc/GL2Encoder.h
index 93108eb..90978be 100644
--- a/system/GLESv2_enc/GL2Encoder.h
+++ b/system/GLESv2_enc/GL2Encoder.h
@@ -35,6 +35,9 @@
     void setHasAsyncUnmapBuffer(int version) {
         m_hasAsyncUnmapBuffer = version;
     }
+    void setHasSyncBufferData(bool value) {
+        m_hasSyncBufferData = value;
+    }
     void setNoHostError(bool noHostError) {
         m_noHostError = noHostError;
     }
@@ -62,7 +65,7 @@
     }
     void setSharedGroup(GLSharedGroupPtr shared) {
         m_shared = shared;
-        if (m_state && m_shared.Ptr()) {
+        if (m_state && m_shared) {
             m_state->setTextureData(m_shared->getTextureData());
             m_state->setRenderbufferInfo(m_shared->getRenderbufferInfo());
             m_state->setSamplerInfo(m_shared->getSamplerInfo());
@@ -94,7 +97,7 @@
 
     void override2DTextureTarget(GLenum target);
     void restore2DTextureTarget(GLenum target);
-    void associateEGLImage(GLenum target, GLeglImageOES eglImage);
+    void associateEGLImage(GLenum target, GLeglImageOES eglImage, int width, int height);
 
     // Convenience functions for buffers
     GLuint boundBuffer(GLenum target) const;
@@ -113,6 +116,7 @@
     std::vector<std::string> m_currExtensionsArray;
 
     bool    m_hasAsyncUnmapBuffer;
+    bool    m_hasSyncBufferData;
     bool    m_initialized;
     bool    m_noHostError;
     GLClientState *m_state;
diff --git a/system/GLESv2_enc/gl2_client_context.cpp b/system/GLESv2_enc/gl2_client_context.cpp
index aaa0325..49b52a7 100644
--- a/system/GLESv2_enc/gl2_client_context.cpp
+++ b/system/GLESv2_enc/gl2_client_context.cpp
@@ -436,6 +436,7 @@
 	glDrawElementsDataNullAEMU = (glDrawElementsDataNullAEMU_client_proc_t) getProc("glDrawElementsDataNullAEMU", userData);
 	glUnmapBufferAsyncAEMU = (glUnmapBufferAsyncAEMU_client_proc_t) getProc("glUnmapBufferAsyncAEMU", userData);
 	glFlushMappedBufferRangeAEMU2 = (glFlushMappedBufferRangeAEMU2_client_proc_t) getProc("glFlushMappedBufferRangeAEMU2", userData);
+	glBufferDataSyncAEMU = (glBufferDataSyncAEMU_client_proc_t) getProc("glBufferDataSyncAEMU", userData);
 	return 0;
 }
 
diff --git a/system/GLESv2_enc/gl2_client_context.h b/system/GLESv2_enc/gl2_client_context.h
index 575395a..b3d5f70 100644
--- a/system/GLESv2_enc/gl2_client_context.h
+++ b/system/GLESv2_enc/gl2_client_context.h
@@ -436,6 +436,7 @@
 	glDrawElementsDataNullAEMU_client_proc_t glDrawElementsDataNullAEMU;
 	glUnmapBufferAsyncAEMU_client_proc_t glUnmapBufferAsyncAEMU;
 	glFlushMappedBufferRangeAEMU2_client_proc_t glFlushMappedBufferRangeAEMU2;
+	glBufferDataSyncAEMU_client_proc_t glBufferDataSyncAEMU;
 	virtual ~gl2_client_context_t() {}
 
 	typedef gl2_client_context_t *CONTEXT_ACCESSOR_TYPE(void);
diff --git a/system/GLESv2_enc/gl2_client_proc.h b/system/GLESv2_enc/gl2_client_proc.h
index 615b123..268cb99 100644
--- a/system/GLESv2_enc/gl2_client_proc.h
+++ b/system/GLESv2_enc/gl2_client_proc.h
@@ -438,6 +438,7 @@
 typedef void (gl2_APIENTRY *glDrawElementsDataNullAEMU_client_proc_t) (void * ctx, GLenum, GLsizei, GLenum, void*, GLuint);
 typedef void (gl2_APIENTRY *glUnmapBufferAsyncAEMU_client_proc_t) (void * ctx, GLenum, GLintptr, GLsizeiptr, GLbitfield, void*, GLboolean*);
 typedef void (gl2_APIENTRY *glFlushMappedBufferRangeAEMU2_client_proc_t) (void * ctx, GLenum, GLintptr, GLsizeiptr, GLbitfield, void*);
+typedef GLboolean (gl2_APIENTRY *glBufferDataSyncAEMU_client_proc_t) (void * ctx, GLenum, GLsizeiptr, const GLvoid*, GLenum);
 
 
 #endif
diff --git a/system/GLESv2_enc/gl2_enc.cpp b/system/GLESv2_enc/gl2_enc.cpp
index d997f29..e610c86 100644
--- a/system/GLESv2_enc/gl2_enc.cpp
+++ b/system/GLESv2_enc/gl2_enc.cpp
@@ -11918,6 +11918,52 @@
 
 }
 
+GLboolean glBufferDataSyncAEMU_enc(void *self , GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
+{
+	AEMU_SCOPED_TRACE("glBufferDataSyncAEMU encode");
+
+	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	const unsigned int __size_data = ((data != NULL) ?  size : 0);
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 4 + 4 + __size_data + 4 + 1*4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_glBufferDataSyncAEMU;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &target, 4); ptr += 4;
+		memcpy(ptr, &size, 4); ptr += 4;
+	memcpy(ptr, &__size_data, 4); ptr += 4;
+	if (data != NULL) memcpy(ptr, data, __size_data);ptr += __size_data;
+		memcpy(ptr, &usage, 4); ptr += 4;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+
+	GLboolean retval;
+	stream->readback(&retval, 1);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 1);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("glBufferDataSyncAEMU: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
 }  // namespace
 
 gl2_encoder_context_t::gl2_encoder_context_t(IOStream *stream, ChecksumCalculator *checksumCalculator)
@@ -12351,5 +12397,6 @@
 	this->glDrawElementsDataNullAEMU = &glDrawElementsDataNullAEMU_enc;
 	this->glUnmapBufferAsyncAEMU = &glUnmapBufferAsyncAEMU_enc;
 	this->glFlushMappedBufferRangeAEMU2 = &glFlushMappedBufferRangeAEMU2_enc;
+	this->glBufferDataSyncAEMU = &glBufferDataSyncAEMU_enc;
 }
 
diff --git a/system/GLESv2_enc/gl2_entry.cpp b/system/GLESv2_enc/gl2_entry.cpp
index a5d6c87..5ea44c2 100644
--- a/system/GLESv2_enc/gl2_entry.cpp
+++ b/system/GLESv2_enc/gl2_entry.cpp
@@ -431,6 +431,7 @@
 	void glDrawElementsDataNullAEMU(GLenum mode, GLsizei count, GLenum type, void* data, GLuint datalen);
 	void glUnmapBufferAsyncAEMU(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access, void* guest_buffer, GLboolean* out_res);
 	void glFlushMappedBufferRangeAEMU2(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access, void* guest_buffer);
+	GLboolean glBufferDataSyncAEMU(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage);
 };
 
 #ifndef GET_CONTEXT
@@ -3032,3 +3033,9 @@
 	ctx->glFlushMappedBufferRangeAEMU2(ctx, target, offset, length, access, guest_buffer);
 }
 
+GLboolean glBufferDataSyncAEMU(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
+{
+	GET_CONTEXT;
+	return ctx->glBufferDataSyncAEMU(ctx, target, size, data, usage);
+}
+
diff --git a/system/GLESv2_enc/gl2_opcodes.h b/system/GLESv2_enc/gl2_opcodes.h
index 9c619e1..25ab3e7 100644
--- a/system/GLESv2_enc/gl2_opcodes.h
+++ b/system/GLESv2_enc/gl2_opcodes.h
@@ -429,7 +429,8 @@
 #define OP_glDrawElementsDataNullAEMU 					2471
 #define OP_glUnmapBufferAsyncAEMU 					2472
 #define OP_glFlushMappedBufferRangeAEMU2 					2473
-#define OP_last 					2474
+#define OP_glBufferDataSyncAEMU 					2474
+#define OP_last 					2475
 
 
 #endif
diff --git a/system/OpenglSystemCommon/AddressSpaceStream.cpp b/system/OpenglSystemCommon/AddressSpaceStream.cpp
index 53b5285..84d635a 100644
--- a/system/OpenglSystemCommon/AddressSpaceStream.cpp
+++ b/system/OpenglSystemCommon/AddressSpaceStream.cpp
@@ -152,14 +152,22 @@
     return nullptr;
 }
 #else
+static address_space_handle_t openVirtGpuAddressSpace() {
+    address_space_handle_t ret;
+    uint8_t retryCount = 64;
+    do {
+        ret = virtgpu_address_space_open();
+    } while(ret < 0 && retryCount-- > 0 && errno == EINTR);
+    return ret;
+}
+
 AddressSpaceStream* createVirtioGpuAddressSpaceStream(size_t ignored_bufSize) {
     // Ignore incoming ignored_bufSize
     (void)ignored_bufSize;
 
-    auto handle = virtgpu_address_space_open();
-
-    if (handle == reinterpret_cast<address_space_handle_t>(-1)) {
-        ALOGE("AddressSpaceStream::create failed (open device)\n");
+    auto handle = openVirtGpuAddressSpace();
+    if (handle <= reinterpret_cast<address_space_handle_t>(-1)) {
+        ALOGE("AddressSpaceStream::create failed (open device) %d (%s)\n", errno, strerror(errno));
         return nullptr;
     }
 
diff --git a/system/OpenglSystemCommon/EGLImage.h b/system/OpenglSystemCommon/EGLImage.h
index a83e1ad..8a1eb6d 100644
--- a/system/OpenglSystemCommon/EGLImage.h
+++ b/system/OpenglSystemCommon/EGLImage.h
@@ -36,6 +36,8 @@
 {
     EGLDisplay dpy;
     EGLenum target;
+    int width;
+    int height;
 
     union
     {
diff --git a/system/OpenglSystemCommon/EmulatorFeatureInfo.h b/system/OpenglSystemCommon/EmulatorFeatureInfo.h
index f4467bb..f6d8ce5 100644
--- a/system/OpenglSystemCommon/EmulatorFeatureInfo.h
+++ b/system/OpenglSystemCommon/EmulatorFeatureInfo.h
@@ -125,6 +125,10 @@
 
 // Queue submit with commands
 static const char kVulkanQueueSubmitWithCommands[] = "ANDROID_EMU_vulkan_queue_submit_with_commands";
+//
+// Synchronized glBufferData call
+static const char kSyncBufferData[] = "ANDROID_EMU_sync_buffer_data";
+
 
 // Batched descriptor set update
 static const char kVulkanBatchedDescriptorSetUpdate[] = "ANDROID_EMU_vulkan_batched_descriptor_set_update";
@@ -154,7 +158,8 @@
         hasHostSideTracing(false),
         hasAsyncFrameCommands(false),
         hasVulkanQueueSubmitWithCommands(false),
-        hasVulkanBatchedDescriptorSetUpdate(false)
+        hasVulkanBatchedDescriptorSetUpdate(false),
+        hasSyncBufferData(false)
     { }
 
     SyncImpl syncImpl;
@@ -179,6 +184,7 @@
     bool hasAsyncFrameCommands;
     bool hasVulkanQueueSubmitWithCommands;
     bool hasVulkanBatchedDescriptorSetUpdate;
+    bool hasSyncBufferData;
 };
 
 enum HostConnectionType {
diff --git a/system/OpenglSystemCommon/HostConnection.cpp b/system/OpenglSystemCommon/HostConnection.cpp
index 417b87e..4afa20e 100644
--- a/system/OpenglSystemCommon/HostConnection.cpp
+++ b/system/OpenglSystemCommon/HostConnection.cpp
@@ -40,6 +40,7 @@
     void setNoHostError(bool) { }
     void setDrawCallFlushInterval(uint32_t) { }
     void setHasAsyncUnmapBuffer(int) { }
+    void setHasSyncBufferData(int) { }
 };
 #else
 #include "GLEncoder.h"
@@ -105,16 +106,18 @@
     return HOST_CONNECTION_ADDRESS_SPACE;
 #else
     char transportValue[PROPERTY_VALUE_MAX] = "";
-    property_get("ro.kernel.qemu.gltransport", transportValue, "");
 
-    bool isValid = transportValue[0] != '\0';
+    do {
+        property_get("ro.boot.qemu.gltransport.name", transportValue, "");
+        if (transportValue[0]) { break; }
 
-    if (!isValid) {
+        property_get("ro.boot.qemu.gltransport", transportValue, "");
+        if (transportValue[0]) { break; }
+
         property_get("ro.boot.hardware.gltransport", transportValue, "");
-        isValid = transportValue[0] != '\0';
-    }
+    } while (false);
 
-    if (!isValid) return HOST_CONNECTION_QEMU_PIPE;
+    if (!transportValue[0]) return HOST_CONNECTION_QEMU_PIPE;
 
     if (!strcmp("tcp", transportValue)) return HOST_CONNECTION_TCP;
     if (!strcmp("pipe", transportValue)) return HOST_CONNECTION_QEMU_PIPE;
@@ -128,29 +131,24 @@
 }
 
 static uint32_t getDrawCallFlushIntervalFromProperty() {
+    constexpr uint32_t kDefaultValue = 800;
+
     char flushValue[PROPERTY_VALUE_MAX] = "";
-    property_get("ro.kernel.qemu.gltransport.drawFlushInterval", flushValue, "");
+    property_get("ro.boot.qemu.gltransport.drawFlushInterval", flushValue, "");
+    if (!flushValue[0]) return kDefaultValue;
 
-    bool isValid = flushValue[0] != '\0';
-    if (!isValid) return 800;
-
-    long interval = strtol(flushValue, 0, 10);
-
-    if (!interval) return 800;
-
-    return (uint32_t)interval;
+    const long interval = strtol(flushValue, 0, 10);
+    return (interval > 0) ? uint32_t(interval) : kDefaultValue;
 }
 
 static GrallocType getGrallocTypeFromProperty() {
-    char prop[PROPERTY_VALUE_MAX] = "";
-    property_get("ro.hardware.gralloc", prop, "");
+    char value[PROPERTY_VALUE_MAX] = "";
+    property_get("ro.hardware.gralloc", value, "");
 
-    bool isValid = prop[0] != '\0';
+    if (!value[0]) return GRALLOC_TYPE_RANCHU;
 
-    if (!isValid) return GRALLOC_TYPE_RANCHU;
-
-    if (!strcmp("ranchu", prop)) return GRALLOC_TYPE_RANCHU;
-    if (!strcmp("minigbm", prop)) return GRALLOC_TYPE_MINIGBM;
+    if (!strcmp("ranchu", value)) return GRALLOC_TYPE_RANCHU;
+    if (!strcmp("minigbm", value)) return GRALLOC_TYPE_MINIGBM;
     return GRALLOC_TYPE_RANCHU;
 }
 
@@ -628,6 +626,7 @@
         m_gl2Enc->setDrawCallFlushInterval(
             getDrawCallFlushIntervalFromProperty());
         m_gl2Enc->setHasAsyncUnmapBuffer(m_rcEnc->hasAsyncUnmapBuffer());
+        m_gl2Enc->setHasSyncBufferData(m_rcEnc->hasSyncBufferData());
     }
     return m_gl2Enc.get();
 }
@@ -672,6 +671,8 @@
         queryAndSetAsyncFrameCommands(rcEnc);
         queryAndSetVulkanQueueSubmitWithCommandsSupport(rcEnc);
         queryAndSetVulkanBatchedDescriptorSetUpdateSupport(rcEnc);
+        queryAndSetSyncBufferData(rcEnc);
+        queryVersion(rcEnc);
         if (m_processPipe) {
             m_processPipe->processPipeInit(m_connectionType, rcEnc);
         }
@@ -962,3 +963,15 @@
         rcEnc->featureInfo()->hasVulkanBatchedDescriptorSetUpdate = true;
     }
 }
+
+void HostConnection::queryAndSetSyncBufferData(ExtendedRCEncoderContext* rcEnc) {
+    std::string glExtensions = queryGLExtensions(rcEnc);
+    if (glExtensions.find(kSyncBufferData) != std::string::npos) {
+        rcEnc->featureInfo()->hasSyncBufferData = true;
+    }
+}
+
+GLint HostConnection::queryVersion(ExtendedRCEncoderContext* rcEnc) {
+    GLint version = m_rcEnc->rcGetRendererVersion(m_rcEnc.get());
+    return version;
+}
diff --git a/system/OpenglSystemCommon/HostConnection.h b/system/OpenglSystemCommon/HostConnection.h
index c1c3f40..7c55629 100644
--- a/system/OpenglSystemCommon/HostConnection.h
+++ b/system/OpenglSystemCommon/HostConnection.h
@@ -75,6 +75,8 @@
     bool hasAsyncFrameCommands() const {
         return m_featureInfo.hasAsyncFrameCommands;
     }
+    bool hasSyncBufferData() const {
+        return m_featureInfo.hasSyncBufferData; }
     DmaImpl getDmaVersion() const { return m_featureInfo.dmaImpl; }
     void bindDmaContext(struct goldfish_dma_context* cxt) { m_dmaCxt = cxt; }
     void bindDmaDirectly(void* dmaPtr, uint64_t dmaPhysAddr) {
@@ -239,6 +241,8 @@
     void queryAndSetAsyncFrameCommands(ExtendedRCEncoderContext *rcEnc);
     void queryAndSetVulkanQueueSubmitWithCommandsSupport(ExtendedRCEncoderContext *rcEnc);
     void queryAndSetVulkanBatchedDescriptorSetUpdateSupport(ExtendedRCEncoderContext *rcEnc);
+    void queryAndSetSyncBufferData(ExtendedRCEncoderContext *rcEnc);
+    GLint queryVersion(ExtendedRCEncoderContext* rcEnc);
 
 private:
     HostConnectionType m_connectionType;
diff --git a/system/OpenglSystemCommon/ProcessPipe.cpp b/system/OpenglSystemCommon/ProcessPipe.cpp
index 047ba34..c7254d1 100644
--- a/system/OpenglSystemCommon/ProcessPipe.cpp
+++ b/system/OpenglSystemCommon/ProcessPipe.cpp
@@ -83,7 +83,7 @@
         return;
     }
 
-    fuchsia_hardware_goldfish::PipeDevice::SyncClient device(
+    fidl::WireSyncClient<fuchsia_hardware_goldfish::PipeDevice> device(
         std::move(channel));
 
     auto pipe_ends =
@@ -93,7 +93,7 @@
         return;
     }
 
-    fuchsia_hardware_goldfish::Pipe::SyncClient pipe(
+    fidl::WireSyncClient<fuchsia_hardware_goldfish::Pipe> pipe(
         std::move(pipe_ends->client));
     device.OpenPipe(std::move(pipe_ends->server));
 
diff --git a/system/OpenglSystemCommon/QemuPipeStream.h b/system/OpenglSystemCommon/QemuPipeStream.h
index 24a4d6f..e6aad15 100644
--- a/system/OpenglSystemCommon/QemuPipeStream.h
+++ b/system/OpenglSystemCommon/QemuPipeStream.h
@@ -59,9 +59,9 @@
     size_t m_read;
     size_t m_readLeft;
 #ifdef __Fuchsia__
-    std::unique_ptr<fuchsia_hardware_goldfish::PipeDevice::SyncClient>
+    std::unique_ptr<::fidl::WireSyncClient<fuchsia_hardware_goldfish::PipeDevice>>
         m_device;
-    std::unique_ptr<fuchsia_hardware_goldfish::Pipe::SyncClient>
+    std::unique_ptr<::fidl::WireSyncClient<fuchsia_hardware_goldfish::Pipe>>
         m_pipe;
     zx::event m_event;
     zx::vmo m_vmo;
diff --git a/system/OpenglSystemCommon/QemuPipeStreamFuchsia.cpp b/system/OpenglSystemCommon/QemuPipeStreamFuchsia.cpp
index c7e7512..f445244 100644
--- a/system/OpenglSystemCommon/QemuPipeStreamFuchsia.cpp
+++ b/system/OpenglSystemCommon/QemuPipeStreamFuchsia.cpp
@@ -81,7 +81,7 @@
     }
 
     m_device = std::make_unique<
-        fuchsia_hardware_goldfish::PipeDevice::SyncClient>(
+        fidl::WireSyncClient<fuchsia_hardware_goldfish::PipeDevice>>(
         std::move(channel));
 
     auto pipe_ends =
@@ -92,7 +92,7 @@
     }
     m_device->OpenPipe(std::move(pipe_ends->server));
     m_pipe =
-        std::make_unique<fuchsia_hardware_goldfish::Pipe::SyncClient>(
+        std::make_unique<fidl::WireSyncClient<fuchsia_hardware_goldfish::Pipe>>(
             std::move(pipe_ends->client));
 
     zx::event event;
@@ -304,14 +304,14 @@
 
         zx_signals_t observed = ZX_SIGNAL_NONE;
         zx_status_t status = m_event.wait_one(
-            fuchsia_hardware_goldfish::wire::SIGNAL_READABLE |
-                fuchsia_hardware_goldfish::wire::SIGNAL_HANGUP,
+            fuchsia_hardware_goldfish::wire::kSignalReadable |
+                fuchsia_hardware_goldfish::wire::kSignalHangup,
             zx::time::infinite(), &observed);
         if (status != ZX_OK) {
             ALOGD("%s: wait_one failed: %d", __FUNCTION__, status);
             return nullptr;
         }
-        if (observed & fuchsia_hardware_goldfish::wire::SIGNAL_HANGUP) {
+        if (observed & fuchsia_hardware_goldfish::wire::kSignalHangup) {
             ALOGD("%s: Remote end hungup", __FUNCTION__);
             return nullptr;
         }
diff --git a/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.cpp b/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.cpp
index b2011b1..a991603 100644
--- a/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.cpp
+++ b/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.cpp
@@ -38,6 +38,8 @@
 #include <goldfish_codec2/store/GoldfishComponentStore.h>
 #include <gralloc_cb_bp.h>
 
+#include <color_buffer_utils.h>
+
 #include "C2GoldfishAvcDec.h"
 
 #define DEBUG 0
@@ -405,12 +407,20 @@
 void C2GoldfishAvcDec::onReset() { (void)onStop(); }
 
 void C2GoldfishAvcDec::onRelease() {
-    (void)deleteDecoder();
+    deleteContext();
     if (mOutBlock) {
         mOutBlock.reset();
     }
 }
 
+void C2GoldfishAvcDec::decodeHeaderAfterFlush() {
+    if (mContext && !mCsd0.empty() && !mCsd1.empty()) {
+        mContext->decodeFrame(&(mCsd0[0]), mCsd0.size(), 0);
+        mContext->decodeFrame(&(mCsd1[0]), mCsd1.size(), 0);
+        DDD("resending csd0 and csd1");
+    }
+}
+
 c2_status_t C2GoldfishAvcDec::onFlush_sm() {
     if (OK != setFlushMode())
         return C2_CORRUPTED;
@@ -428,7 +438,6 @@
         return C2_NO_MEMORY;
     }
 
-    mContext->flush();
     while (true) {
         mPts = 0;
         setDecodeArgs(nullptr, nullptr, 0, 0, 0);
@@ -444,6 +453,7 @@
         mOutBufferFlush = nullptr;
     }
 
+    deleteContext();
     return C2_OK;
 }
 
@@ -467,7 +477,7 @@
 
 status_t C2GoldfishAvcDec::initDecoder() {
     //    if (OK != createDecoder()) return UNKNOWN_ERROR;
-    mStride = ALIGN32(mWidth);
+    mStride = ALIGN16(mWidth);
     mSignalledError = false;
     resetPlugin();
 
@@ -493,8 +503,7 @@
         mInPBuffer = const_cast<uint8_t *>(inBuffer->data() + inOffset);
         mInPBufferSize = inSize;
         mInTsMarker = tsMarker;
-        mIndex2Pts[mInTsMarker] = mPts;
-        mPts2Index[mPts] = mInTsMarker;
+        insertPts(tsMarker, mPts);
     }
 
     // uint32_t displayHeight = mHeight;
@@ -510,12 +519,11 @@
     return true;
 }
 
-bool C2GoldfishAvcDec::getVuiParams() { return true; }
-
 status_t C2GoldfishAvcDec::setFlushMode() {
     if (mContext) {
         mContext->flush();
     }
+    mHeaderDecoded = false;
     return OK;
 }
 
@@ -523,13 +531,7 @@
     mStride = 0;
     mSignalledError = false;
     mHeaderDecoded = false;
-    if (mContext) {
-        // The resolution may have changed, so our safest bet is to just destroy
-        // the current context and recreate another one, with the new width and
-        // height.
-        mContext->destroyH264Context();
-        mContext.reset(nullptr);
-    }
+    deleteContext();
 
     return OK;
 }
@@ -540,12 +542,14 @@
     gettimeofday(&mTimeEnd, nullptr);
 }
 
-status_t C2GoldfishAvcDec::deleteDecoder() {
+void C2GoldfishAvcDec::deleteContext() {
     if (mContext) {
         mContext->destroyH264Context();
         mContext.reset(nullptr);
+        mPts2Index.clear();
+        mOldPts2Index.clear();
+        mIndex2Pts.clear();
     }
-    return OK;
 }
 
 static void fillEmptyWork(const std::unique_ptr<C2Work> &work) {
@@ -554,6 +558,7 @@
         flags |= C2FrameData::FLAG_END_OF_STREAM;
         DDD("signalling eos");
     }
+    DDD("fill empty work");
     work->worklets.front()->output.flags = (C2FrameData::flags_t)flags;
     work->worklets.front()->output.buffers.clear();
     work->worklets.front()->output.ordinal = work->input.ordinal;
@@ -630,21 +635,19 @@
 
 c2_status_t
 C2GoldfishAvcDec::ensureDecoderState(const std::shared_ptr<C2BlockPool> &pool) {
-    if (mOutBlock && (mOutBlock->width() != ALIGN32(mWidth) ||
+    if (mOutBlock && (mOutBlock->width() != ALIGN16(mWidth) ||
                       mOutBlock->height() != mHeight)) {
         mOutBlock.reset();
     }
     if (!mOutBlock) {
-        // uint32_t format = HAL_PIXEL_FORMAT_YCBCR_420_888;//19;
-        // //HAL_PIXEL_FORMAT_YV12;
-        uint32_t format = 19; // HAL_PIXEL_FORMAT_YV12;
+        uint32_t format = HAL_PIXEL_FORMAT_YCBCR_420_888;
         C2MemoryUsage usage = {C2MemoryUsage::CPU_READ,
                                C2MemoryUsage::CPU_WRITE};
         usage.expected = (uint64_t)(BufferUsage::GPU_DATA_BUFFER);
         // C2MemoryUsage usage = {(unsigned
         // int)(BufferUsage::GPU_DATA_BUFFER)};// { C2MemoryUsage::CPU_READ,
         // C2MemoryUsage::CPU_WRITE };
-        c2_status_t err = pool->fetchGraphicBlock(ALIGN32(mWidth), mHeight,
+        c2_status_t err = pool->fetchGraphicBlock(ALIGN16(mWidth), mHeight,
                                                   format, usage, &mOutBlock);
         if (err != C2_OK) {
             ALOGE("fetchGraphicBlock for Output failed with status %d", err);
@@ -654,20 +657,11 @@
             auto c2Handle = mOutBlock->handle();
             native_handle_t *grallocHandle =
                 UnwrapNativeCodec2GrallocHandle(c2Handle);
-            cb_handle_t *cbhandle = (cb_handle_t *)grallocHandle;
-            DDD("found handle %d", cbhandle->hostHandle);
-            mHostColorBufferId = cbhandle->hostHandle;
-        } else {
-            C2GraphicView wView = mOutBlock->map().get();
-            if (wView.error()) {
-                ALOGE("graphic view map failed %d", wView.error());
-                return C2_CORRUPTED;
-            }
-            mByteBuffer =
-                const_cast<uint8_t *>(wView.data()[C2PlanarLayout::PLANE_Y]);
+            mHostColorBufferId = getColorBufferHandle(grallocHandle);
+            DDD("found handle %d", mHostColorBufferId);
         }
         DDD("provided (%dx%d) required (%dx%d)", mOutBlock->width(),
-            mOutBlock->height(), ALIGN32(mWidth), mHeight);
+            mOutBlock->height(), ALIGN16(mWidth), mHeight);
     }
 
     return C2_OK;
@@ -678,7 +672,7 @@
     mHeight = mIntf->height();
     {
         // now get the block
-        constexpr uint32_t format = 19;
+        constexpr uint32_t format = HAL_PIXEL_FORMAT_YCBCR_420_888;
         std::shared_ptr<C2GraphicBlock> block;
         C2MemoryUsage usage = {C2MemoryUsage::CPU_READ,
                                C2MemoryUsage::CPU_WRITE};
@@ -693,8 +687,7 @@
         auto c2Handle = block->handle();
         native_handle_t *grallocHandle =
             UnwrapNativeCodec2GrallocHandle(c2Handle);
-        cb_handle_t *cbhandle = (cb_handle_t *)grallocHandle;
-        int hostColorBufferId = cbhandle->hostHandle;
+        int hostColorBufferId = getColorBufferHandle(grallocHandle);
         if (hostColorBufferId > 0) {
             DDD("decoding to host color buffer");
             mEnableAndroidNativeBuffers = true;
@@ -705,33 +698,125 @@
     }
 }
 
-void C2GoldfishAvcDec::copyImageData(uint8_t *pBuffer, h264_image_t &img) {
+void C2GoldfishAvcDec::getVuiParams(h264_image_t &img) {
+
+    VuiColorAspects vuiColorAspects;
+    vuiColorAspects.primaries = img.color_primaries;
+    vuiColorAspects.transfer = img.color_trc;
+    vuiColorAspects.coeffs = img.colorspace;
+    vuiColorAspects.fullRange = img.color_range == 2 ? true : false;
+
+    // convert vui aspects to C2 values if changed
+    if (!(vuiColorAspects == mBitstreamColorAspects)) {
+        mBitstreamColorAspects = vuiColorAspects;
+        ColorAspects sfAspects;
+        C2StreamColorAspectsInfo::input codedAspects = {0u};
+        ColorUtils::convertIsoColorAspectsToCodecAspects(
+            vuiColorAspects.primaries, vuiColorAspects.transfer,
+            vuiColorAspects.coeffs, vuiColorAspects.fullRange, sfAspects);
+        if (!C2Mapper::map(sfAspects.mPrimaries, &codedAspects.primaries)) {
+            codedAspects.primaries = C2Color::PRIMARIES_UNSPECIFIED;
+        }
+        if (!C2Mapper::map(sfAspects.mRange, &codedAspects.range)) {
+            codedAspects.range = C2Color::RANGE_UNSPECIFIED;
+        }
+        if (!C2Mapper::map(sfAspects.mMatrixCoeffs, &codedAspects.matrix)) {
+            codedAspects.matrix = C2Color::MATRIX_UNSPECIFIED;
+        }
+        if (!C2Mapper::map(sfAspects.mTransfer, &codedAspects.transfer)) {
+            codedAspects.transfer = C2Color::TRANSFER_UNSPECIFIED;
+        }
+        std::vector<std::unique_ptr<C2SettingResult>> failures;
+        (void)mIntf->config({&codedAspects}, C2_MAY_BLOCK, &failures);
+    }
+}
+
+void C2GoldfishAvcDec::copyImageData(h264_image_t &img) {
+    getVuiParams(img);
     if (mEnableAndroidNativeBuffers)
         return;
-    int myStride = mWidth;
-    for (int i = 0; i < mHeight; ++i) {
-        memcpy(pBuffer + i * myStride, img.data + i * mWidth, mWidth);
+
+    auto writeView = mOutBlock->map().get();
+    if (writeView.error()) {
+        ALOGE("graphic view map failed %d", writeView.error());
+        return;
     }
-    int Y = myStride * mHeight;
+    size_t dstYStride = writeView.layout().planes[C2PlanarLayout::PLANE_Y].rowInc;
+    size_t dstUVStride = writeView.layout().planes[C2PlanarLayout::PLANE_U].rowInc;
+
+    uint8_t *pYBuffer = const_cast<uint8_t *>(writeView.data()[C2PlanarLayout::PLANE_Y]);
+    uint8_t *pUBuffer = const_cast<uint8_t *>(writeView.data()[C2PlanarLayout::PLANE_U]);
+    uint8_t *pVBuffer = const_cast<uint8_t *>(writeView.data()[C2PlanarLayout::PLANE_V]);
+
+    for (int i = 0; i < mHeight; ++i) {
+        memcpy(pYBuffer + i * dstYStride, img.data + i * mWidth, mWidth);
+    }
     for (int i = 0; i < mHeight / 2; ++i) {
-        memcpy(pBuffer + Y + i * myStride / 2,
+        memcpy(pUBuffer + i * dstUVStride,
                img.data + mWidth * mHeight + i * mWidth / 2, mWidth / 2);
     }
-    int UV = Y / 4;
     for (int i = 0; i < mHeight / 2; ++i) {
-        memcpy(pBuffer + Y + UV + i * myStride / 2,
+        memcpy(pVBuffer + i * dstUVStride,
                img.data + mWidth * mHeight * 5 / 4 + i * mWidth / 2,
                mWidth / 2);
     }
 }
 
-void C2GoldfishAvcDec::removePts(uint64_t pts) {
+uint64_t C2GoldfishAvcDec::getWorkIndex(uint64_t pts) {
+    if (!mOldPts2Index.empty()) {
+        auto iter = mOldPts2Index.find(pts);
+        if (iter != mOldPts2Index.end()) {
+            auto index = iter->second;
+            DDD("found index %d for pts %" PRIu64, (int)index, pts);
+            return index;
+        }
+    }
     auto iter = mPts2Index.find(pts);
-    if (iter == mPts2Index.end()) return;
+    if (iter != mPts2Index.end()) {
+        auto index = iter->second;
+        DDD("found index %d for pts %" PRIu64, (int)index, pts);
+        return index;
+    }
+    DDD("not found index for pts %" PRIu64, pts);
+    return 0;
+}
 
-    auto index = iter->second;
+void C2GoldfishAvcDec::insertPts(uint32_t work_index, uint64_t pts) {
+    auto iter = mPts2Index.find(pts);
+    if (iter != mPts2Index.end()) {
+        // we have a collision here:
+        // apparently, older session is not done yet,
+        // lets save them
+        DDD("inserted to old pts %" PRIu64 " with index %d", pts, (int)iter->second);
+        mOldPts2Index[iter->first] = iter->second;
+    }
+    DDD("inserted pts %" PRIu64 " with index %d", pts, (int)work_index);
+    mIndex2Pts[work_index] = pts;
+    mPts2Index[pts] = work_index;
+}
 
-    mPts2Index.erase(iter);
+void C2GoldfishAvcDec::removePts(uint64_t pts) {
+    bool found = false;
+    uint64_t index = 0;
+    // note: check old pts first to see
+    // if we have some left over, check them
+    if (!mOldPts2Index.empty()) {
+        auto iter = mOldPts2Index.find(pts);
+        if (iter != mOldPts2Index.end()) {
+            mOldPts2Index.erase(iter);
+            index = iter->second;
+            found = true;
+        }
+    } else {
+        auto iter = mPts2Index.find(pts);
+        if (iter != mPts2Index.end()) {
+            mPts2Index.erase(iter);
+            index = iter->second;
+            found = true;
+        }
+    }
+
+    if (!found) return;
 
     auto iter2 = mIndex2Pts.find(index);
     if (iter2 == mIndex2Pts.end()) return;
@@ -761,6 +846,7 @@
         DDD("creating decoder context to host in process work");
         checkMode(pool);
         createDecoder();
+        decodeHeaderAfterFlush();
     }
 
     size_t inOffset = 0u;
@@ -779,7 +865,7 @@
         }
     }
     bool eos = ((work->input.flags & C2FrameData::FLAG_END_OF_STREAM) != 0);
-    bool hasPicture = false;
+    bool hasPicture = (inSize > 0);
 
     DDD("in buffer attr. size %zu timestamp %d frameindex %d, flags %x", inSize,
         (int)work->input.ordinal.timestamp.peeku(),
@@ -813,6 +899,20 @@
                 setParams(mStride);
             }
 
+            DDD("flag is %x", work->input.flags);
+            if (work->input.flags & C2FrameData::FLAG_CODEC_CONFIG) {
+                hasPicture = false;
+                if (mCsd0.empty()) {
+                    mCsd0.assign(mInPBuffer, mInPBuffer + mInPBufferSize);
+                    DDD("assign to csd0 with %d bytpes", mInPBufferSize);
+                } else if (mCsd1.empty()) {
+                    mCsd1.assign(mInPBuffer, mInPBuffer + mInPBufferSize);
+                    DDD("assign to csd1 with %d bytpes", mInPBufferSize);
+                }
+                // this is not really a valid pts from config
+                removePts(mPts);
+            }
+
             uint32_t delay;
             GETTIME(&mTimeStart, nullptr);
             TIME_DIFF(mTimeEnd, mTimeStart, delay);
@@ -821,6 +921,7 @@
             h264_result_t h264Res =
                 mContext->decodeFrame(mInPBuffer, mInPBufferSize, mIndex2Pts[mInTsMarker]);
             mConsumedBytes = h264Res.bytesProcessed;
+            DDD("decoding consumed %d", (int)mConsumedBytes);
 
             if (mHostColorBufferId > 0) {
                 mImg = mContext->renderOnHostAndReturnImageMetadata(
@@ -845,12 +946,34 @@
             //            (void) ivdec_api_function(mDecHandle, &s_decode_ip,
             //            &s_decode_op);
         }
-        (void)getVuiParams();
         if (mImg.data != nullptr) {
-            DDD("got data %" PRIu64,  mPts2Index[mImg.pts]);
-            hasPicture = true;
-            copyImageData(mByteBuffer, mImg);
-            finishWork(mPts2Index[mImg.pts], work);
+            // check for new width and height
+            auto decodedW = mImg.width;
+            auto decodedH = mImg.height;
+            if (decodedW != mWidth || decodedH != mHeight) {
+                mWidth = decodedW;
+                mHeight = decodedH;
+
+                C2StreamPictureSizeInfo::output size(0u, mWidth, mHeight);
+                std::vector<std::unique_ptr<C2SettingResult>> failures;
+                c2_status_t err = mIntf->config({&size}, C2_MAY_BLOCK, &failures);
+                if (err == OK) {
+                    work->worklets.front()->output.configUpdate.push_back(
+                        C2Param::Copy(size));
+                    ensureDecoderState(pool);
+                } else {
+                    ALOGE("Cannot set width and height");
+                    mSignalledError = true;
+                    work->workletsProcessed = 1u;
+                    work->result = C2_CORRUPTED;
+                    return;
+                }
+            }
+
+            DDD("got data %" PRIu64 " with pts %" PRIu64,  getWorkIndex(mImg.pts), mImg.pts);
+            mHeaderDecoded = true;
+            copyImageData(mImg);
+            finishWork(getWorkIndex(mImg.pts), work);
             removePts(mImg.pts);
         } else {
             work->workletsProcessed = 0u;
@@ -863,8 +986,8 @@
         drainInternal(DRAIN_COMPONENT_WITH_EOS, pool, work);
         mSignalledOutputEos = true;
     } else if (!hasPicture) {
+        DDD("no picture, fill empty work");
         fillEmptyWork(work);
-        work->workletsProcessed = 0u;
     }
 
     work->input.buffers.clear();
@@ -915,9 +1038,9 @@
         // TODO: maybe keep rendering to screen
         //        mImg = mContext->getImage();
         if (mImg.data != nullptr) {
-            DDD("got data in drain mode %" PRIu64, mPts2Index[mImg.pts]);
-            copyImageData(mByteBuffer, mImg);
-            finishWork(mPts2Index[mImg.pts], work);
+            DDD("got data in drain mode %" PRIu64 " with pts %" PRIu64,  getWorkIndex(mImg.pts), mImg.pts);
+            copyImageData(mImg);
+            finishWork(getWorkIndex(mImg.pts), work);
             removePts(mImg.pts);
         } else {
             fillEmptyWork(work);
diff --git a/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.h b/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.h
index 57b1d69..3c5be7f 100644
--- a/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.h
+++ b/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.h
@@ -28,6 +28,7 @@
 
 namespace android {
 
+#define ALIGN16(x) ((((x) + 15) >> 4) << 4)
 #define ALIGN32(x) ((((x) + 31) >> 5) << 5)
 #define MAX_NUM_CORES 4
 #define MIN(a, b) (((a) < (b)) ? (a) : (b))
@@ -65,7 +66,6 @@
     status_t initDecoder();
     bool setDecodeArgs(C2ReadView *inBuffer, C2GraphicView *outBuffer,
                        size_t inOffset, size_t inSize, uint32_t tsMarker);
-    bool getVuiParams();
     c2_status_t ensureDecoderState(const std::shared_ptr<C2BlockPool> &pool);
     void finishWork(uint64_t index, const std::unique_ptr<C2Work> &work);
     status_t setFlushMode();
@@ -74,12 +74,17 @@
                               const std::unique_ptr<C2Work> &work);
     status_t resetDecoder();
     void resetPlugin();
-    status_t deleteDecoder();
+    void deleteContext();
 
     std::shared_ptr<IntfImpl> mIntf;
 
     void removePts(uint64_t pts);
+    void insertPts(uint32_t work_index, uint64_t pts);
+    uint64_t getWorkIndex(uint64_t pts);
 
+    // there are same pts matching to different work indices
+    // this happen during csd0/csd1 switching
+    std::map<uint64_t, uint64_t> mOldPts2Index;
     std::map<uint64_t, uint64_t> mPts2Index;
     std::map<uint64_t, uint64_t> mIndex2Pts;
     uint64_t  mPts {0};
@@ -98,9 +103,9 @@
 
     int mHostColorBufferId{-1};
 
-    void copyImageData(uint8_t *pBuffer, h264_image_t &img);
+    void getVuiParams(h264_image_t &img);
+    void copyImageData(h264_image_t &img);
 
-    uint8_t *mByteBuffer{nullptr};
     h264_image_t mImg{};
     uint32_t mConsumedBytes{0};
     uint8_t *mInPBuffer{nullptr};
@@ -141,6 +146,10 @@
     char mInFile[200];
 #endif /* FILE_DUMP_ENABLE */
 
+    std::vector<uint8_t> mCsd0;
+    std::vector<uint8_t> mCsd1;
+    void decodeHeaderAfterFlush();
+
     C2_DO_NOT_COPY(C2GoldfishAvcDec);
 };
 
diff --git a/system/codecs/c2/decoders/base/Android.bp b/system/codecs/c2/decoders/base/Android.bp
index f4ebb5d..58e26a3 100644
--- a/system/codecs/c2/decoders/base/Android.bp
+++ b/system/codecs/c2/decoders/base/Android.bp
@@ -18,6 +18,7 @@
         "SimpleC2Component.cpp",
         "SimpleC2Interface.cpp",
         "goldfish_media_utils.cpp",
+        "color_buffer_utils.cpp",
     ],
 
     export_include_dirs: [
@@ -33,6 +34,7 @@
         "libcutils", // for properties
         "liblog",    // for ALOG
         "libdrm",    // for ALOG
+        "libbase",   // for properties, parseint
         "libsfplugin_ccodec_utils", // for ImageCopy
         "libstagefright_foundation", // for Mutexed
         "libgoldfish_codec2_store", // for goldfish store
@@ -42,6 +44,10 @@
         "libGoldfishAddressSpace",
     ],
 
+    header_libs: [
+        "libgralloc_cb.ranchu",
+    ],
+
     sanitize: {
         misc_undefined: [
             "unsigned-integer-overflow",
diff --git a/system/codecs/c2/decoders/base/color_buffer_utils.cpp b/system/codecs/c2/decoders/base/color_buffer_utils.cpp
new file mode 100644
index 0000000..36aa336
--- /dev/null
+++ b/system/codecs/c2/decoders/base/color_buffer_utils.cpp
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <inttypes.h>
+#include <android-base/parseint.h>
+#include <android-base/properties.h>
+#include <android-base/strings.h>
+#include <log/log.h>
+#include <gralloc_cb_bp.h>
+#include <drm/virtgpu_drm.h>
+#include <xf86drm.h>
+
+#include "cros_gralloc_handle.h"
+
+static bool isMinigbmFromProperty() {
+  static constexpr const auto kGrallocProp = "ro.hardware.gralloc";
+
+  const auto grallocProp = android::base::GetProperty(kGrallocProp, "");
+  ALOGD("%s:codecs: minigbm query prop value is: %s", __FUNCTION__, grallocProp.c_str());
+
+  if (grallocProp == "minigbm") {
+    ALOGD("%s:codecs: Using minigbm, in minigbm mode.\n", __FUNCTION__);
+    return true;
+  } else {
+    ALOGD("%s:codecs: Is not using minigbm, in goldfish mode.\n", __FUNCTION__);
+    return false;
+  }
+}
+
+class ColorBufferUtilsGlobalState {
+public:
+    ColorBufferUtilsGlobalState() {
+        m_isMinigbm = isMinigbmFromProperty();
+
+        if (m_isMinigbm) {
+            static constexpr int kRendernodeMinor = 128;
+            m_rendernodeFd = drmOpenRender(kRendernodeMinor);
+        }
+    }
+
+    uint32_t getColorBufferHandle(native_handle_t const* handle) {
+        if (m_isMinigbm) {
+            struct drm_virtgpu_resource_info info;
+            if (!getResInfo(handle, &info)) {
+                ALOGE("%s: Error gtting color buffer handle (minigbm case)", __func__);
+                return -1;
+            }
+            return info.res_handle;
+        } else {
+            return cb_handle_t::from(handle)->hostHandle;
+        }
+    }
+
+private:
+
+    bool getResInfo(native_handle_t const* handle,
+                    struct drm_virtgpu_resource_info* info) {
+        memset(info, 0x0, sizeof(*info));
+        if (m_rendernodeFd < 0) {
+            ALOGE("%s: Error, rendernode fd missing\n", __func__);
+            return false;
+        }
+
+        struct drm_gem_close gem_close;
+        memset(&gem_close, 0x0, sizeof(gem_close));
+
+        cros_gralloc_handle const* cros_handle =
+            reinterpret_cast<cros_gralloc_handle const*>(handle);
+
+        uint32_t prime_handle;
+        int ret = drmPrimeFDToHandle(m_rendernodeFd, cros_handle->fds[0], &prime_handle);
+        if (ret) {
+            ALOGE("%s: DRM_IOCTL_PRIME_FD_TO_HANDLE failed: %s (errno %d)\n",
+                  __func__, strerror(errno), errno);
+            return false;
+        }
+
+        info->bo_handle = prime_handle;
+        gem_close.handle = prime_handle;
+
+        ret = drmIoctl(m_rendernodeFd, DRM_IOCTL_VIRTGPU_RESOURCE_INFO, info);
+        if (ret) {
+            ALOGE("%s: DRM_IOCTL_VIRTGPU_RESOURCE_INFO failed: %s (errno %d)\n",
+                  __func__, strerror(errno), errno);
+            drmIoctl(m_rendernodeFd, DRM_IOCTL_GEM_CLOSE, &gem_close);
+            return false;
+        }
+
+        drmIoctl(m_rendernodeFd, DRM_IOCTL_GEM_CLOSE, &gem_close);
+        return true;
+    }
+
+    bool m_isMinigbm;
+    int m_rendernodeFd = -1; // to be closed when this process dies
+};
+
+static ColorBufferUtilsGlobalState* getGlobals() {
+    static ColorBufferUtilsGlobalState* globals = new ColorBufferUtilsGlobalState;
+    return globals;
+}
+
+uint32_t getColorBufferHandle(native_handle_t const* handle) {
+    return getGlobals()->getColorBufferHandle(handle);
+}
diff --git a/system/codecs/c2/decoders/base/cros_gralloc_handle.h b/system/codecs/c2/decoders/base/cros_gralloc_handle.h
new file mode 100644
index 0000000..2b70d4b
--- /dev/null
+++ b/system/codecs/c2/decoders/base/cros_gralloc_handle.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2016 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef CROS_GRALLOC_HANDLE_H
+#define CROS_GRALLOC_HANDLE_H
+
+#include <cstdint>
+#include <cutils/native_handle.h>
+
+#define DRV_MAX_PLANES 4
+#define DRV_MAX_FDS (DRV_MAX_PLANES + 1)
+
+struct cros_gralloc_handle : public native_handle_t {
+	/*
+	 * File descriptors must immediately follow the native_handle_t base and used file
+	 * descriptors must be packed at the beginning of this array to work with
+	 * native_handle_clone().
+	 *
+	 * This field contains 'num_planes' plane file descriptors followed by an optional metadata
+	 * reserved region file descriptor if 'reserved_region_size' is greater than zero.
+	 */
+	int32_t fds[DRV_MAX_FDS];
+	uint32_t strides[DRV_MAX_PLANES];
+	uint32_t offsets[DRV_MAX_PLANES];
+	uint32_t sizes[DRV_MAX_PLANES];
+	uint32_t id;
+	uint32_t width;
+	uint32_t height;
+	uint32_t format; /* DRM format */
+	uint32_t tiling;
+	uint64_t format_modifier;
+	uint64_t use_flags; /* Buffer creation flags */
+	uint32_t magic;
+	uint32_t pixel_stride;
+	int32_t droid_format;
+	int32_t usage; /* Android usage. */
+	uint32_t num_planes;
+	uint64_t reserved_region_size;
+	uint64_t total_size; /* Total allocation size */
+	/*
+	 * Name is a null terminated char array located at handle->base.data[handle->name_offset].
+	 */
+	uint32_t name_offset;
+} __attribute__((packed));
+
+typedef const struct cros_gralloc_handle *cros_gralloc_handle_t;
+
+#endif
diff --git a/system/codecs/c2/decoders/base/include/color_buffer_utils.h b/system/codecs/c2/decoders/base/include/color_buffer_utils.h
new file mode 100644
index 0000000..d0a7876
--- /dev/null
+++ b/system/codecs/c2/decoders/base/include/color_buffer_utils.h
@@ -0,0 +1,18 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <cutils/native_handle.h>
+
+uint32_t getColorBufferHandle(native_handle_t const* handle);
diff --git a/system/codecs/c2/decoders/vpxdec/C2GoldfishVpxDec.cpp b/system/codecs/c2/decoders/vpxdec/C2GoldfishVpxDec.cpp
index a01ae84..7df99ff 100644
--- a/system/codecs/c2/decoders/vpxdec/C2GoldfishVpxDec.cpp
+++ b/system/codecs/c2/decoders/vpxdec/C2GoldfishVpxDec.cpp
@@ -38,6 +38,8 @@
 
 #include <gralloc_cb_bp.h>
 
+#include <color_buffer_utils.h>
+
 #include "C2GoldfishVpxDec.h"
 
 #define DEBUG 0
@@ -87,8 +89,8 @@
             DefineParam(mSize, C2_PARAMKEY_PICTURE_SIZE)
                 .withDefault(new C2StreamPictureSizeInfo::output(0u, 320, 240))
                 .withFields({
-                    C2F(mSize, width).inRange(2, 2048, 2),
-                    C2F(mSize, height).inRange(2, 2048, 2),
+                    C2F(mSize, width).inRange(2, 4096, 2),
+                    C2F(mSize, height).inRange(2, 4096, 2),
                 })
                 .withSetter(SizeSetter)
                 .build());
@@ -176,8 +178,8 @@
                          .withDefault(new C2StreamMaxPictureSizeTuning::output(
                              0u, 320, 240))
                          .withFields({
-                             C2F(mSize, width).inRange(2, 2048, 2),
-                             C2F(mSize, height).inRange(2, 2048, 2),
+                             C2F(mSize, width).inRange(2, 4096, 2),
+                             C2F(mSize, height).inRange(2, 4096, 2),
                          })
                          .withSetter(MaxPictureSizeSetter, mSize)
                          .build());
@@ -240,17 +242,25 @@
                           const C2P<C2StreamPictureSizeInfo::output> &oldMe,
                           C2P<C2StreamPictureSizeInfo::output> &me) {
         (void)mayBlock;
-        DDD("calling sizesetter now %d", oldMe.v.height);
-        DDD("new calling sizesetter now %d", me.v.height);
+        DDD("calling sizesetter old w %d", oldMe.v.width);
+        DDD("calling sizesetter old h %d", oldMe.v.height);
+        DDD("calling sizesetter change to w %d", me.v.width);
+        DDD("calling sizesetter change to h %d", me.v.height);
         C2R res = C2R::Ok();
-        if (!me.F(me.v.width).supportsAtAll(me.v.width)) {
+        auto mewidth = me.F(me.v.width);
+        auto meheight = me.F(me.v.height);
+
+        if (!mewidth.supportsAtAll(me.v.width)) {
             res = res.plus(C2SettingResultBuilder::BadValue(me.F(me.v.width)));
+            DDD("override width with oldMe value");
             me.set().width = oldMe.v.width;
+            DDD("something wrong here %s %d", __func__, __LINE__);
         }
-        if (!me.F(me.v.height).supportsAtAll(me.v.height)) {
+        if (!meheight.supportsAtAll(me.v.height)) {
             res = res.plus(C2SettingResultBuilder::BadValue(me.F(me.v.height)));
-            DDD("override with oldMe value");
+            DDD("override height with oldMe value");
             me.set().height = oldMe.v.height;
+            DDD("something wrong here %s %d", __func__, __LINE__);
         }
         return res;
     }
@@ -262,8 +272,8 @@
         (void)mayBlock;
         // TODO: get max width/height from the size's field helpers vs.
         // hardcoding
-        me.set().width = c2_min(c2_max(me.v.width, size.v.width), 2048u);
-        me.set().height = c2_min(c2_max(me.v.height, size.v.height), 2048u);
+        me.set().width = c2_min(c2_max(me.v.width, size.v.width), 4096u);
+        me.set().height = c2_min(c2_max(me.v.height, size.v.height), 4096u);
         return C2R::Ok();
     }
 
@@ -458,7 +468,7 @@
     // check for decoding mode:
     {
         // now get the block
-        constexpr uint32_t format = 19;
+        constexpr uint32_t format = HAL_PIXEL_FORMAT_YCBCR_420_888;
         std::shared_ptr<C2GraphicBlock> block;
         C2MemoryUsage usage = {C2MemoryUsage::CPU_READ,
                                C2MemoryUsage::CPU_WRITE};
@@ -473,8 +483,7 @@
         auto c2Handle = block->handle();
         native_handle_t *grallocHandle =
             UnwrapNativeCodec2GrallocHandle(c2Handle);
-        cb_handle_t *cbhandle = (cb_handle_t *)grallocHandle;
-        int hostColorBufferId = cbhandle->hostHandle;
+        int hostColorBufferId = getColorBufferHandle(grallocHandle);
         if (hostColorBufferId > 0) {
             DDD("decoding to host color buffer");
             mEnableAndroidNativeBuffers = true;
@@ -699,10 +708,9 @@
         return BAD_VALUE;
 
     // now get the block
-    uint32_t format = HAL_PIXEL_FORMAT_YV12;
     std::shared_ptr<C2GraphicBlock> block;
     C2MemoryUsage usage = {C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE};
-    format = 19; // HAL_PIXEL_FORMAT_YV12;
+    uint32_t format = HAL_PIXEL_FORMAT_YCBCR_420_888;
     usage.expected = (uint64_t)(BufferUsage::GPU_DATA_BUFFER);
 
     c2_status_t err = pool->fetchGraphicBlock(align(mWidth, 2), mHeight, format,
@@ -718,8 +726,7 @@
         auto c2Handle = block->handle();
         native_handle_t *grallocHandle =
             UnwrapNativeCodec2GrallocHandle(c2Handle);
-        cb_handle_t *cbhandle = (cb_handle_t *)grallocHandle;
-        int hostColorBufferId = cbhandle->hostHandle;
+        int hostColorBufferId = getColorBufferHandle(grallocHandle);
         if (hostColorBufferId > 0) {
             DDD("found handle %d", hostColorBufferId);
         } else {
diff --git a/system/codecs/c2/store/GoldfishComponentStore.cpp b/system/codecs/c2/store/GoldfishComponentStore.cpp
index 70e9077..49c5a32 100644
--- a/system/codecs/c2/store/GoldfishComponentStore.cpp
+++ b/system/codecs/c2/store/GoldfishComponentStore.cpp
@@ -237,17 +237,20 @@
     return mTraits;
 }
 
-static bool useAndroidGoldfishComponentInstance(const char *libname) {
-    // We have a property set indicating whether to use the host side codec
-    // or not (ro.kernel.qemu.hwcodec.<mLibNameSuffix>).
-    char propValue[PROP_VALUE_MAX];
-    std::string prop = "ro.kernel.qemu.hwcodec.";
-    prop.append(libname);
+// We have a property set indicating whether to use the host side codec
+// or not (ro.boot.qemu.hwcodec.<mLibNameSuffix>).
+static std::string BuildHWCodecPropName(const char *libname) {
+    using namespace std::literals::string_literals;
+    return "ro.boot.qemu.hwcodec."s + libname;
+}
 
-    bool myret = property_get(prop.c_str(), propValue, "") > 0 &&
+static bool useAndroidGoldfishComponentInstance(const char *libname) {
+    const std::string propName = BuildHWCodecPropName(libname);
+    char propValue[PROP_VALUE_MAX];
+    bool myret = property_get(propName.c_str(), propValue, "") > 0 &&
                  strcmp("2", propValue) == 0;
     if (myret) {
-        ALOGD("%s %d found prop %s val %s", __func__, __LINE__, prop.c_str(),
+        ALOGD("%s %d found prop %s val %s", __func__, __LINE__, propName.c_str(),
               propValue);
     }
     return myret;
diff --git a/system/codecs/omx/plugin/GoldfishOMXPlugin.cpp b/system/codecs/omx/plugin/GoldfishOMXPlugin.cpp
index 52063bd..6843381 100644
--- a/system/codecs/omx/plugin/GoldfishOMXPlugin.cpp
+++ b/system/codecs/omx/plugin/GoldfishOMXPlugin.cpp
@@ -56,32 +56,33 @@
     return myret;
 }
 
-static bool useGoogleGoldfishComponentInstance(const char* libname) {
-    // We have a property set indicating whether to use the host side codec
-    // or not (ro.kernel.qemu.hwcodec.<mLibNameSuffix>).
-    char propValue[PROP_VALUE_MAX];
-    AString prop = "ro.kernel.qemu.hwcodec.";
-    prop.append(libname);
+// We have a property set indicating whether to use the host side codec
+// or not (ro.boot.qemu.hwcodec.<mLibNameSuffix>).
+static std::string BuildHWCodecPropName(const char *libname) {
+    using namespace std::literals::string_literals;
+    return "ro.boot.qemu.hwcodec."s + libname;
+}
 
-    bool myret = property_get(prop.c_str(), propValue, "") > 0 &&
+static bool useGoogleGoldfishComponentInstance(const char* libname) {
+    const std::string propName = BuildHWCodecPropName(libname);
+    char propValue[PROP_VALUE_MAX];
+
+    bool myret = property_get(propName.c_str(), propValue, "") > 0 &&
            strcmp("1", propValue) == 0;
     if (myret) {
-        ALOGD("%s %d found prop %s val %s", __func__, __LINE__, prop.c_str(), propValue);
+        ALOGD("%s %d found prop %s val %s", __func__, __LINE__, propName.c_str(), propValue);
     }
     return myret;
 }
 
 static bool useAndroidGoldfishComponentInstance(const char* libname) {
-    // We have a property set indicating whether to use the host side codec
-    // or not (ro.kernel.qemu.hwcodec.<mLibNameSuffix>).
+    const std::string propName = BuildHWCodecPropName(libname);
     char propValue[PROP_VALUE_MAX];
-    AString prop = "ro.kernel.qemu.hwcodec.";
-    prop.append(libname);
 
-    bool myret = property_get(prop.c_str(), propValue, "") > 0 &&
+    bool myret = property_get(propName.c_str(), propValue, "") > 0 &&
            strcmp("2", propValue) == 0;
     if (myret) {
-        ALOGD("%s %d found prop %s val %s", __func__, __LINE__, prop.c_str(), propValue);
+        ALOGD("%s %d found prop %s val %s", __func__, __LINE__, propName.c_str(), propValue);
     }
     return myret;
 }
diff --git a/system/egl/egl.cpp b/system/egl/egl.cpp
index 7136786..d72fa7f 100644
--- a/system/egl/egl.cpp
+++ b/system/egl/egl.cpp
@@ -297,14 +297,18 @@
 struct app_time_metric_t {
     uint64_t lastLogTime;
     uint64_t lastSwapBuffersReturnTime;
-    uint64_t numSamples;
+    unsigned int numSamples;
     uint64_t totalAppTime;
+    uint64_t minAppTime;
+    uint64_t maxAppTime;
 
     app_time_metric_t() :
         lastLogTime(0),
         lastSwapBuffersReturnTime(0),
         numSamples(0),
-        totalAppTime(0)
+        totalAppTime(0),
+        minAppTime(0),
+        maxAppTime(0)
     {
     }
 
@@ -312,6 +316,10 @@
         lastSwapBuffersReturnTime = currGuestTimeNs();
     }
 
+    static float ns2ms(uint64_t ns) {
+        return (float)ns / 1000000.0;
+    }
+
     void onQueueBufferReturn() {
         if(lastSwapBuffersReturnTime == 0) {
             // First swapBuffers call, or last call failed.
@@ -320,6 +328,14 @@
 
         uint64_t now = currGuestTimeNs();
         uint64_t appTime = now - lastSwapBuffersReturnTime;
+        if(numSamples == 0) {
+          minAppTime = appTime;
+          maxAppTime = appTime;
+        }
+        else {
+          minAppTime = fmin(minAppTime, appTime);
+          maxAppTime = fmax(maxAppTime, appTime);
+        }
         totalAppTime += appTime;
         numSamples++;
         // Reset so we don't record a bad sample if swapBuffers fails
@@ -332,9 +348,13 @@
 
         // Log/reset once every second
         if(now - lastLogTime > 1000000000) {
-            float averageAppTimeMs = (float)totalAppTime / 1000000.0 / numSamples;
-            ALOGD("average app time: %0.2f ms (n=%llu)", averageAppTimeMs, (unsigned long long)numSamples);
+            float avgMs = ns2ms(totalAppTime) / numSamples;
+            float minMs = ns2ms(minAppTime);
+            float maxMs = ns2ms(maxAppTime);
+            ALOGD("app_time_stats: avg=%0.2fms min=%0.2fms max=%0.2fms count=%u", avgMs, minMs, maxMs, numSamples);
             totalAppTime = 0;
+            minAppTime = 0;
+            maxAppTime = 0;
             numSamples = 0;
             lastLogTime = now;
         }
@@ -1196,6 +1216,7 @@
     }
 
     int attribs_size = 0;
+    EGLint backup_attribs[1];
     if (attrib_list) {
         const EGLint * attrib_p = attrib_list;
         while (attrib_p[0] != EGL_NONE) {
@@ -1203,6 +1224,10 @@
             attrib_p += 2;
         }
         attribs_size++; //for the terminating EGL_NONE
+    } else {
+        attribs_size = 1;
+        backup_attribs[0] = EGL_NONE;
+        attrib_list = backup_attribs;
     }
 
     // API 19 passes EGL_SWAP_BEHAVIOR_PRESERVED_BIT to surface type,
@@ -1228,7 +1253,7 @@
             attribs_size * sizeof(EGLint), (uint32_t*)tempConfigs, config_size);
 
     if (local_attrib_list) delete [] local_attrib_list;
-    if (*num_config <= 0) {
+    if (*num_config < 0) {
         EGLint err = -(*num_config);
         *num_config = 0;
         switch (err) {
@@ -2255,6 +2280,8 @@
         image->dpy = dpy;
         image->target = target;
         image->native_buffer = native_buffer;
+        image->width = native_buffer->width;
+        image->height = native_buffer->width;
 
         return (EGLImageKHR)image;
     }
@@ -2271,6 +2298,8 @@
         image->dpy = dpy;
         image->target = target;
         image->host_egl_image = img;
+        image->width = context->getClientState()->queryTexWidth(0, texture);
+        image->height = context->getClientState()->queryTexHeight(0, texture);
 
         return (EGLImageKHR)image;
     }
@@ -2356,17 +2385,17 @@
 
         // Validate and input attribs
         for (int i = 0; i < num_actual_attribs; i += 2) {
-            if (attrib_list[i] == EGL_SYNC_TYPE_KHR) {
-                DPRINT("ERROR: attrib key = EGL_SYNC_TYPE_KHR");
-            }
-            if (attrib_list[i] == EGL_SYNC_STATUS_KHR) {
-                DPRINT("ERROR: attrib key = EGL_SYNC_STATUS_KHR");
-            }
-            if (attrib_list[i] == EGL_SYNC_CONDITION_KHR) {
-                DPRINT("ERROR: attrib key = EGL_SYNC_CONDITION_KHR");
-            }
             EGLint attrib_key = attrib_list[i];
             EGLint attrib_val = attrib_list[i + 1];
+            switch (attrib_key) {
+                case EGL_SYNC_TYPE_KHR:
+                case EGL_SYNC_STATUS_KHR:
+                case EGL_SYNC_CONDITION_KHR:
+                case EGL_SYNC_NATIVE_FENCE_FD_ANDROID:
+                    break;
+                default:
+                    setErrorReturn(EGL_BAD_ATTRIBUTE, EGL_NO_SYNC_KHR);
+            }
             if (attrib_key == EGL_SYNC_NATIVE_FENCE_FD_ANDROID) {
                 if (attrib_val != EGL_NO_NATIVE_FENCE_FD_ANDROID) {
                     inputFenceFd = attrib_val;
@@ -2435,8 +2464,8 @@
     (void)dpy;
 
     if (!eglsync) {
-        DPRINT("WARNING: null sync object")
-        return EGL_TRUE;
+        ALOGE("%s: null sync object!", __FUNCTION__);
+        setErrorReturn(EGL_BAD_PARAMETER, EGL_FALSE);
     }
 
     EGLSync_t* sync = static_cast<EGLSync_t*>(eglsync);
@@ -2467,8 +2496,8 @@
     (void)dpy;
 
     if (!eglsync) {
-        DPRINT("WARNING: null sync object");
-        return EGL_CONDITION_SATISFIED_KHR;
+        ALOGE("%s: null sync object!", __FUNCTION__);
+        setErrorReturn(EGL_BAD_PARAMETER, EGL_FALSE);
     }
 
     EGLSync_t* sync = (EGLSync_t*)eglsync;
@@ -2507,6 +2536,14 @@
 
     EGLSync_t* sync = (EGLSync_t*)eglsync;
 
+    if (!sync) {
+        setErrorReturn(EGL_BAD_PARAMETER, EGL_FALSE);
+    }
+
+    if (!value) {
+        setErrorReturn(EGL_BAD_PARAMETER, EGL_FALSE);
+    }
+
     switch (attribute) {
     case EGL_SYNC_TYPE_KHR:
         *value = sync->type;
@@ -2554,12 +2591,12 @@
 
     if (!eglsync) {
         ALOGE("%s: null sync object!", __FUNCTION__);
-        return EGL_FALSE;
+        setErrorReturn(EGL_BAD_PARAMETER, EGL_FALSE);
     }
 
     if (flags) {
         ALOGE("%s: flags must be 0, got 0x%x", __FUNCTION__, flags);
-        return EGL_FALSE;
+        setErrorReturn(EGL_BAD_PARAMETER, EGL_FALSE);
     }
 
     DEFINE_HOST_CONNECTION;
diff --git a/system/gralloc/gralloc_old.cpp b/system/gralloc/gralloc_old.cpp
index b8f610b..2cae482 100644
--- a/system/gralloc/gralloc_old.cpp
+++ b/system/gralloc/gralloc_old.cpp
@@ -1587,7 +1587,7 @@
     // qemu.gles=0 -> no GLES 2.x support (only 1.x through software).
     // qemu.gles=1 -> host-side GPU emulation through EmuGL
     // qemu.gles=2 -> guest-side GPU emulation.
-    property_get("ro.kernel.qemu.gles", prop, "999");
+    property_get("ro.boot.qemu.gles", prop, "999");
 
     bool useFallback = false;
     switch (atoi(prop)) {
diff --git a/system/hals/allocator3.cpp b/system/hals/allocator3.cpp
index c91bafd..5c103a5 100644
--- a/system/hals/allocator3.cpp
+++ b/system/hals/allocator3.cpp
@@ -323,6 +323,12 @@
             return false;
         }
 
+        // b/186585177
+        if ((usage & (BufferUsage::CPU_READ_MASK | BufferUsage::CPU_WRITE_MASK)) &&
+                (0 == (usage & ~(BufferUsage::CPU_READ_MASK | BufferUsage::CPU_WRITE_MASK)))) {
+            return false;
+        }
+
         return ((usage & BufferUsage::GPU_DATA_BUFFER)
                    || (format != PixelFormat::BLOB &&
                        format != PixelFormat::RAW16 &&
diff --git a/system/hals/mapper3.cpp b/system/hals/mapper3.cpp
index f2116fe..6903f9b 100644
--- a/system/hals/mapper3.cpp
+++ b/system/hals/mapper3.cpp
@@ -393,7 +393,8 @@
 
         // camera delivers bits to the buffer directly and does not require
         // an explicit read.
-        if (usageSwRead && !usageHwCamera) {
+        const bool cbReadable = cb.usage & BufferUsage::CPU_READ_MASK;
+        if (usageSwRead && !usageHwCamera && cbReadable) {
             if (gralloc_is_yuv_format(cb.format)) {
                 if (rcEnc->hasYUVCache()) {
                     uint32_t bufferSize;
diff --git a/system/hwc2/Android.mk b/system/hwc2/Android.mk
index e8f53f9..4d207ff 100644
--- a/system/hwc2/Android.mk
+++ b/system/hwc2/Android.mk
@@ -19,16 +19,25 @@
 include $(CLEAR_VARS)
 LOCAL_VENDOR_MODULE := true
 emulator_hwcomposer_shared_libraries := \
-    liblog \
-    libutils \
-    libcutils \
-    libdrm \
+    android.hardware.graphics.mapper@2.0 \
+    android.hardware.graphics.mapper@4.0 \
+    libbase \
     libEGL \
-    libutils \
+    libcutils \
+    libcuttlefish_device_config \
+    libcuttlefish_device_config_proto \
+    libcuttlefish_utils \
+    libcuttlefish_fs \
+    libdrm \
+    libgralloctypes \
     libhardware \
+    libhidlbase \
+    libjpeg \
+    liblog \
     libsync \
     libui \
-    android.hardware.graphics.mapper@2.0 \
+    libutils \
+    libutils \
 
 emulator_hwcomposer_cflags += \
     -DLOG_TAG=\"hwc2\" \
@@ -36,23 +45,32 @@
     -DANDROID_BASE_UNIQUE_FD_DISABLE_IMPLICIT_CONVERSION
 
 emulator_hwcomposer_c_includes += \
+    device/generic/goldfish-opengl/host/include/libOpenglRender \
+    device/generic/goldfish-opengl/android-emu \
+    device/generic/goldfish-opengl/shared/OpenglCodecCommon \
+    device/generic/goldfish-opengl/system/OpenglSystemCommon \
+    device/generic/goldfish-opengl/system/include \
+    device/generic/goldfish-opengl/system/renderControl_enc \
+    external/libdrm \
     system/core/libsync \
     system/core/libsync/include \
-    device/generic/goldfish-opengl/system/include \
-    device/generic/goldfish-opengl/system/OpenglSystemCommon \
-    device/generic/goldfish-opengl/host/include/libOpenglRender \
-    device/generic/goldfish-opengl/shared/OpenglCodecCommon \
-    device/generic/goldfish-opengl/system/renderControl_enc \
-    external/libdrm
 
 emulator_hwcomposer_relative_path := hw
 
 emulator_hwcomposer2_src_files := \
-    EmuHWC2.cpp
+    Device.cpp \
+    Display.cpp \
+    Drm.cpp \
+    DrmPresenter.cpp \
+    Gralloc.cpp \
+    GuestComposer.cpp \
+    HostComposer.cpp \
+    Layer.cpp \
 
 include $(CLEAR_VARS)
 
 LOCAL_VENDOR_MODULE := true
+LOCAL_STATIC_LIBRARIES := libyuv_static
 LOCAL_SHARED_LIBRARIES := $(emulator_hwcomposer_shared_libraries)
 LOCAL_SHARED_LIBRARIES += libOpenglSystemCommon lib_renderControl_enc
 LOCAL_SHARED_LIBRARIES += libui
@@ -82,4 +100,7 @@
 LOCAL_C_INCLUDES += external/drm_hwcomposer
 LOCAL_C_INCLUDES += external/minigbm/cros_gralloc
 LOCAL_MODULE := emulatorDrmTest
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../LICENSE
 include $(BUILD_EXECUTABLE)
diff --git a/system/hwc2/Common.h b/system/hwc2/Common.h
new file mode 100644
index 0000000..949708d
--- /dev/null
+++ b/system/hwc2/Common.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_HWC_COMMON_H
+#define ANDROID_HWC_COMMON_H
+
+#undef LOG_TAG
+#define LOG_TAG "RanchuHwc"
+
+#include <android-base/logging.h>
+#include <inttypes.h>
+#include <log/log.h>
+
+// Uncomment to enable additional debug logging.
+//#define DEBUG_RANCHU_HWC
+
+#if defined(DEBUG_RANCHU_HWC)
+#define DEBUG_LOG ALOGE
+#else
+#define DEBUG_LOG(...) ((void)0)
+#endif
+
+#define HWC2_INCLUDE_STRINGIFICATION
+#define HWC2_USE_CPP11
+#include <hardware/hwcomposer2.h>
+#undef HWC2_INCLUDE_STRINGIFICATION
+#undef HWC2_USE_CPP11
+
+#endif
diff --git a/system/hwc2/Composer.h b/system/hwc2/Composer.h
new file mode 100644
index 0000000..fdbb6b0
--- /dev/null
+++ b/system/hwc2/Composer.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_HWC_COMPOSER_H
+#define ANDROID_HWC_COMPOSER_H
+
+#include <functional>
+#include <unordered_map>
+#include <vector>
+
+#include "Common.h"
+
+namespace android {
+class Device;
+class Display;
+
+class Composer {
+ public:
+  virtual ~Composer() {}
+
+  using HotplugCallback = std::function<void(
+      bool /*connected*/, uint32_t /*id*/, uint32_t /*width*/,
+      uint32_t /*height*/, uint32_t /*dpiX*/, uint32_t /*dpiY*/,
+      uint32_t /*refreshRate*/)>;
+
+  virtual HWC2::Error init(const HotplugCallback& cb) = 0;
+
+  using AddDisplayToDeviceFunction =
+      std::function<HWC2::Error(std::unique_ptr<Display>)>;
+
+  // Queries Cuttlefish/Goldfish/System configurations and creates displays
+  // for the given Device.
+  virtual HWC2::Error createDisplays(
+      Device* device,
+      const AddDisplayToDeviceFunction& addDisplayToDeviceFn) = 0;
+
+  virtual HWC2::Error createDisplay(
+      Device* device, uint32_t displayId, uint32_t width, uint32_t height,
+      uint32_t dpiX, uint32_t dpiY, uint32_t refreshRateHz,
+      const AddDisplayToDeviceFunction& addDisplayToDeviceFn) = 0;
+
+  virtual HWC2::Error onDisplayDestroy(Display* display) = 0;
+
+  virtual HWC2::Error onDisplayClientTargetSet(Display* display) = 0;
+
+  // Determines if this composer can compose the given layers and requests
+  // changes for layers that can't not be composed.
+  virtual HWC2::Error validateDisplay(
+      Display* display, std::unordered_map<hwc2_layer_t, HWC2::Composition>*
+                            outLayerCompositionChanges) = 0;
+
+  // Performs the actual composition of layers and presents the composed result
+  // to the display.
+  virtual HWC2::Error presentDisplay(Display* display,
+                                     int32_t* outPresentFence) = 0;
+};
+
+}  // namespace android
+
+#endif
diff --git a/system/hwc2/Device.cpp b/system/hwc2/Device.cpp
new file mode 100644
index 0000000..24df956
--- /dev/null
+++ b/system/hwc2/Device.cpp
@@ -0,0 +1,589 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Device.h"
+
+#include <android-base/properties.h>
+
+#include "GuestComposer.h"
+#include "HostComposer.h"
+
+namespace android {
+namespace {
+
+template <typename PFN, typename T>
+static hwc2_function_pointer_t asFP(T function) {
+  static_assert(std::is_same<PFN, T>::value, "Incompatible function pointer");
+  return reinterpret_cast<hwc2_function_pointer_t>(function);
+}
+
+static int CloseHook(hw_device_t* dev) {
+  Device* device = Device::fromDevice(dev);
+  delete device;
+  return 0;
+}
+
+bool IsCuttlefish() {
+  return android::base::GetProperty("ro.hardware.vulkan", "") == "pastel";
+}
+
+}  // namespace
+
+Device::Device() {
+  DEBUG_LOG("%s", __FUNCTION__);
+
+  common.tag = HARDWARE_DEVICE_TAG;
+  common.version = HWC_DEVICE_API_VERSION_2_0;
+  common.close = CloseHook;
+  hwc2_device_t::getCapabilities = getCapabilitiesHook;
+  hwc2_device_t::getFunction = getFunctionHook;
+}
+
+HWC2::Error Device::init() {
+  DEBUG_LOG("%s", __FUNCTION__);
+
+  if (IsCuttlefish()) {
+    mComposer = std::make_unique<GuestComposer>();
+  } else {
+    mComposer = std::make_unique<HostComposer>();
+  }
+
+  HWC2::Error error = mComposer->init(
+      [this](bool connected, uint32_t id, uint32_t width, uint32_t height,
+             uint32_t dpiX, uint32_t dpiY, uint32_t refreshRate) {
+        handleHotplug(connected, id, width, height, dpiX, dpiY, refreshRate);
+      });
+
+  if (error != HWC2::Error::None) {
+    ALOGE("%s failed to initialize Composer", __FUNCTION__);
+    return HWC2::Error::NoResources;
+  }
+
+  return HWC2::Error::None;
+}
+
+Device::~Device() {
+  DEBUG_LOG("%s", __FUNCTION__);
+
+  HWC2::Error error = HWC2::Error::None;
+
+  error = destroyDisplays();
+  if (error != HWC2::Error::None) {
+    ALOGE("%s failed to destroy displays", __FUNCTION__);
+  }
+}
+
+HWC2::Error Device::createDisplays() {
+  DEBUG_LOG("%s", __FUNCTION__);
+
+  std::unique_lock<std::mutex> lock(mStateMutex);
+
+  if (!mComposer) {
+    ALOGE("%s composer not initialized!", __FUNCTION__);
+    return HWC2::Error::NoResources;
+  }
+
+  auto addDisplayLockedFn = [this](std::unique_ptr<Display> display) {
+    auto displayId = display->getId();
+    DEBUG_LOG("%s: adding display:%" PRIu64, __FUNCTION__, displayId);
+    mDisplays.emplace(displayId, std::move(display));
+    return HWC2::Error::None;
+  };
+
+  HWC2::Error error = mComposer->createDisplays(this, addDisplayLockedFn);
+  if (error != HWC2::Error::None) {
+    ALOGE("%s composer failed to create displays", __FUNCTION__);
+    return error;
+  }
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error Device::createDisplay(uint32_t displayId, uint32_t width,
+                                  uint32_t height, uint32_t dpiX, uint32_t dpiY,
+                                  uint32_t refreshRate) {
+  if (!mComposer) {
+    ALOGE("%s composer not initialized!", __FUNCTION__);
+    return HWC2::Error::NoResources;
+  }
+
+  auto addDisplayLockedFn = [this](std::unique_ptr<Display> display) {
+    auto displayId = display->getId();
+    DEBUG_LOG("%s: adding display:%" PRIu64, __FUNCTION__, displayId);
+    mDisplays.emplace(displayId, std::move(display));
+    return HWC2::Error::None;
+  };
+
+  HWC2::Error error =
+      mComposer->createDisplay(this, displayId, width, height, dpiX, dpiY,
+                               refreshRate, addDisplayLockedFn);
+  if (error != HWC2::Error::None) {
+    ALOGE("%s composer failed to create displays", __FUNCTION__);
+    return error;
+  }
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error Device::destroyDisplays() {
+  DEBUG_LOG("%s", __FUNCTION__);
+
+  std::unique_lock<std::mutex> lock(mStateMutex);
+
+  if (!mComposer) {
+    ALOGE("%s composer not initialized!", __FUNCTION__);
+    return HWC2::Error::NoResources;
+  }
+
+  for (auto& [displayId, displayPtr] : mDisplays) {
+    HWC2::Error error = mComposer->onDisplayDestroy(displayPtr.get());
+    if (error != HWC2::Error::None) {
+      ALOGE("%s composer failed to destroy displays", __FUNCTION__);
+      return error;
+    }
+
+    displayPtr.reset();
+  }
+
+  mDisplays.clear();
+
+  return HWC2::Error::None;
+}
+
+void Device::getCapabilities(uint32_t* outCount, int32_t* outCapabilities) {
+  DEBUG_LOG("%s", __FUNCTION__);
+
+  if (outCapabilities == nullptr) {
+    *outCount = mCapabilities.size();
+    return;
+  }
+
+  auto capabilityIter = mCapabilities.cbegin();
+  for (size_t i = 0; i < *outCount; ++i) {
+    if (capabilityIter == mCapabilities.cend()) {
+      return;
+    }
+    outCapabilities[i] = static_cast<int32_t>(*capabilityIter);
+    ++capabilityIter;
+  }
+}
+
+/*static*/
+void Device::getCapabilitiesHook(hwc2_device_t* dev, uint32_t* outCount,
+                                 int32_t* outCapabilities) {
+  DEBUG_LOG("%s", __FUNCTION__);
+
+  Device* device = Device::fromDevice(dev);
+  device->getCapabilities(outCount, outCapabilities);
+}
+
+hwc2_function_pointer_t Device::getFunction(int32_t desc) {
+  const auto func = static_cast<HWC2::FunctionDescriptor>(desc);
+  const auto funcString = to_string(func);
+  DEBUG_LOG("%s(%s)", __FUNCTION__, funcString.c_str());
+
+  switch (func) {
+    // Device functions.
+    case HWC2::FunctionDescriptor::CreateVirtualDisplay:
+      return asFP<HWC2_PFN_CREATE_VIRTUAL_DISPLAY>(
+          DeviceHook<int32_t, decltype(&Device::createVirtualDisplay),
+                     &Device::createVirtualDisplay, uint32_t, uint32_t,
+                     int32_t*, hwc2_display_t*>);
+    case HWC2::FunctionDescriptor::DestroyVirtualDisplay:
+      return asFP<HWC2_PFN_DESTROY_VIRTUAL_DISPLAY>(
+          DeviceHook<int32_t, decltype(&Device::destroyVirtualDisplay),
+                     &Device::destroyVirtualDisplay, hwc2_display_t>);
+    case HWC2::FunctionDescriptor::Dump:
+      return asFP<HWC2_PFN_DUMP>(DeviceHook<void, decltype(&Device::dump),
+                                            &Device::dump, uint32_t*, char*>);
+    case HWC2::FunctionDescriptor::GetMaxVirtualDisplayCount:
+      return asFP<HWC2_PFN_GET_MAX_VIRTUAL_DISPLAY_COUNT>(
+          DeviceHook<uint32_t, decltype(&Device::getMaxVirtualDisplayCount),
+                     &Device::getMaxVirtualDisplayCount>);
+    case HWC2::FunctionDescriptor::RegisterCallback:
+      return asFP<HWC2_PFN_REGISTER_CALLBACK>(
+          DeviceHook<int32_t, decltype(&Device::registerCallback),
+                     &Device::registerCallback, int32_t, hwc2_callback_data_t,
+                     hwc2_function_pointer_t>);
+
+    // Display functions
+    case HWC2::FunctionDescriptor::AcceptDisplayChanges:
+      return asFP<HWC2_PFN_ACCEPT_DISPLAY_CHANGES>(
+          displayHook<decltype(&Display::acceptChanges),
+                      &Display::acceptChanges>);
+    case HWC2::FunctionDescriptor::CreateLayer:
+      return asFP<HWC2_PFN_CREATE_LAYER>(
+          displayHook<decltype(&Display::createLayer), &Display::createLayer,
+                      hwc2_layer_t*>);
+    case HWC2::FunctionDescriptor::DestroyLayer:
+      return asFP<HWC2_PFN_DESTROY_LAYER>(
+          displayHook<decltype(&Display::destroyLayer), &Display::destroyLayer,
+                      hwc2_layer_t>);
+    case HWC2::FunctionDescriptor::GetActiveConfig:
+      return asFP<HWC2_PFN_GET_ACTIVE_CONFIG>(
+          displayHook<decltype(&Display::getActiveConfig),
+                      &Display::getActiveConfig, hwc2_config_t*>);
+    case HWC2::FunctionDescriptor::GetChangedCompositionTypes:
+      return asFP<HWC2_PFN_GET_CHANGED_COMPOSITION_TYPES>(
+          displayHook<decltype(&Display::getChangedCompositionTypes),
+                      &Display::getChangedCompositionTypes, uint32_t*,
+                      hwc2_layer_t*, int32_t*>);
+    case HWC2::FunctionDescriptor::GetColorModes:
+      return asFP<HWC2_PFN_GET_COLOR_MODES>(
+          displayHook<decltype(&Display::getColorModes),
+                      &Display::getColorModes, uint32_t*, int32_t*>);
+    case HWC2::FunctionDescriptor::GetDisplayAttribute:
+      return asFP<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
+          displayHook<decltype(&Display::getDisplayAttribute),
+                      &Display::getDisplayAttribute, hwc2_config_t, int32_t,
+                      int32_t*>);
+    case HWC2::FunctionDescriptor::GetDisplayConfigs:
+      return asFP<HWC2_PFN_GET_DISPLAY_CONFIGS>(
+          displayHook<decltype(&Display::getConfigs), &Display::getConfigs,
+                      uint32_t*, hwc2_config_t*>);
+    case HWC2::FunctionDescriptor::GetDisplayName:
+      return asFP<HWC2_PFN_GET_DISPLAY_NAME>(
+          displayHook<decltype(&Display::getName), &Display::getName, uint32_t*,
+                      char*>);
+    case HWC2::FunctionDescriptor::GetDisplayRequests:
+      return asFP<HWC2_PFN_GET_DISPLAY_REQUESTS>(
+          displayHook<decltype(&Display::getRequests), &Display::getRequests,
+                      int32_t*, uint32_t*, hwc2_layer_t*, int32_t*>);
+    case HWC2::FunctionDescriptor::GetDisplayType:
+      return asFP<HWC2_PFN_GET_DISPLAY_TYPE>(
+          displayHook<decltype(&Display::getType), &Display::getType,
+                      int32_t*>);
+    case HWC2::FunctionDescriptor::GetDozeSupport:
+      return asFP<HWC2_PFN_GET_DOZE_SUPPORT>(
+          displayHook<decltype(&Display::getDozeSupport),
+                      &Display::getDozeSupport, int32_t*>);
+    case HWC2::FunctionDescriptor::GetHdrCapabilities:
+      return asFP<HWC2_PFN_GET_HDR_CAPABILITIES>(
+          displayHook<decltype(&Display::getHdrCapabilities),
+                      &Display::getHdrCapabilities, uint32_t*, int32_t*, float*,
+                      float*, float*>);
+    case HWC2::FunctionDescriptor::GetReleaseFences:
+      return asFP<HWC2_PFN_GET_RELEASE_FENCES>(
+          displayHook<decltype(&Display::getReleaseFences),
+                      &Display::getReleaseFences, uint32_t*, hwc2_layer_t*,
+                      int32_t*>);
+    case HWC2::FunctionDescriptor::PresentDisplay:
+      return asFP<HWC2_PFN_PRESENT_DISPLAY>(
+          displayHook<decltype(&Display::present), &Display::present,
+                      int32_t*>);
+    case HWC2::FunctionDescriptor::SetActiveConfig:
+      return asFP<HWC2_PFN_SET_ACTIVE_CONFIG>(
+          displayHook<decltype(&Display::setActiveConfig),
+                      &Display::setActiveConfig, hwc2_config_t>);
+    case HWC2::FunctionDescriptor::SetClientTarget:
+      return asFP<HWC2_PFN_SET_CLIENT_TARGET>(
+          displayHook<decltype(&Display::setClientTarget),
+                      &Display::setClientTarget, buffer_handle_t, int32_t,
+                      int32_t, hwc_region_t>);
+    case HWC2::FunctionDescriptor::SetColorMode:
+      return asFP<HWC2_PFN_SET_COLOR_MODE>(
+          displayHook<decltype(&Display::setColorMode), &Display::setColorMode,
+                      int32_t>);
+    case HWC2::FunctionDescriptor::SetColorTransform:
+      return asFP<HWC2_PFN_SET_COLOR_TRANSFORM>(
+          displayHook<decltype(&Display::setColorTransform),
+                      &Display::setColorTransform, const float*, int32_t>);
+    case HWC2::FunctionDescriptor::SetOutputBuffer:
+      return asFP<HWC2_PFN_SET_OUTPUT_BUFFER>(
+          displayHook<decltype(&Display::setOutputBuffer),
+                      &Display::setOutputBuffer, buffer_handle_t, int32_t>);
+    case HWC2::FunctionDescriptor::SetPowerMode:
+      return asFP<HWC2_PFN_SET_POWER_MODE>(
+          displayHook<decltype(&Display::setPowerMode), &Display::setPowerMode,
+                      int32_t>);
+    case HWC2::FunctionDescriptor::SetVsyncEnabled:
+      return asFP<HWC2_PFN_SET_VSYNC_ENABLED>(
+          displayHook<decltype(&Display::setVsyncEnabled),
+                      &Display::setVsyncEnabled, int32_t>);
+    case HWC2::FunctionDescriptor::ValidateDisplay:
+      return asFP<HWC2_PFN_VALIDATE_DISPLAY>(
+          displayHook<decltype(&Display::validate), &Display::validate,
+                      uint32_t*, uint32_t*>);
+    case HWC2::FunctionDescriptor::GetClientTargetSupport:
+      return asFP<HWC2_PFN_GET_CLIENT_TARGET_SUPPORT>(
+          displayHook<decltype(&Display::getClientTargetSupport),
+                      &Display::getClientTargetSupport, uint32_t, uint32_t,
+                      int32_t, int32_t>);
+    case HWC2::FunctionDescriptor::GetDisplayIdentificationData:
+      return asFP<HWC2_PFN_GET_DISPLAY_IDENTIFICATION_DATA>(
+          displayHook<decltype(&Display::getDisplayIdentificationData),
+                      &Display::getDisplayIdentificationData, uint8_t*,
+                      uint32_t*, uint8_t*>);
+    case HWC2::FunctionDescriptor::GetDisplayCapabilities:
+      return asFP<HWC2_PFN_GET_DISPLAY_CAPABILITIES>(
+          displayHook<decltype(&Display::getDisplayCapabilities),
+                      &Display::getDisplayCapabilities, uint32_t*, uint32_t*>);
+    case HWC2::FunctionDescriptor::GetDisplayBrightnessSupport:
+      return asFP<HWC2_PFN_GET_DISPLAY_BRIGHTNESS_SUPPORT>(
+          displayHook<decltype(&Display::getDisplayBrightnessSupport),
+                      &Display::getDisplayBrightnessSupport, bool*>);
+    case HWC2::FunctionDescriptor::SetDisplayBrightness:
+      return asFP<HWC2_PFN_SET_DISPLAY_BRIGHTNESS>(
+          displayHook<decltype(&Display::setDisplayBrightness),
+                      &Display::setDisplayBrightness, float>);
+
+    // Layer functions
+    case HWC2::FunctionDescriptor::SetCursorPosition:
+      return asFP<HWC2_PFN_SET_CURSOR_POSITION>(
+          layerHook<decltype(&Layer::setCursorPosition),
+                    &Layer::setCursorPosition, int32_t, int32_t>);
+    case HWC2::FunctionDescriptor::SetLayerBuffer:
+      return asFP<HWC2_PFN_SET_LAYER_BUFFER>(
+          layerHook<decltype(&Layer::setBuffer), &Layer::setBuffer,
+                    buffer_handle_t, int32_t>);
+    case HWC2::FunctionDescriptor::SetLayerSurfaceDamage:
+      return asFP<HWC2_PFN_SET_LAYER_SURFACE_DAMAGE>(
+          layerHook<decltype(&Layer::setSurfaceDamage),
+                    &Layer::setSurfaceDamage, hwc_region_t>);
+    case HWC2::FunctionDescriptor::SetLayerBlendMode:
+      return asFP<HWC2_PFN_SET_LAYER_BLEND_MODE>(
+          layerHook<decltype(&Layer::setBlendMode), &Layer::setBlendMode,
+                    int32_t>);
+    case HWC2::FunctionDescriptor::SetLayerColor:
+      return asFP<HWC2_PFN_SET_LAYER_COLOR>(
+          layerHook<decltype(&Layer::setColor), &Layer::setColor, hwc_color_t>);
+    case HWC2::FunctionDescriptor::SetLayerCompositionType:
+      return asFP<HWC2_PFN_SET_LAYER_COMPOSITION_TYPE>(
+          layerHook<decltype(&Layer::setCompositionType),
+                    &Layer::setCompositionType, int32_t>);
+    case HWC2::FunctionDescriptor::SetLayerDataspace:
+      return asFP<HWC2_PFN_SET_LAYER_DATASPACE>(
+          layerHook<decltype(&Layer::setDataspace), &Layer::setDataspace,
+                    int32_t>);
+    case HWC2::FunctionDescriptor::SetLayerDisplayFrame:
+      return asFP<HWC2_PFN_SET_LAYER_DISPLAY_FRAME>(
+          layerHook<decltype(&Layer::setDisplayFrame), &Layer::setDisplayFrame,
+                    hwc_rect_t>);
+    case HWC2::FunctionDescriptor::SetLayerPlaneAlpha:
+      return asFP<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(
+          layerHook<decltype(&Layer::setPlaneAlpha), &Layer::setPlaneAlpha,
+                    float>);
+    case HWC2::FunctionDescriptor::SetLayerSidebandStream:
+      return asFP<HWC2_PFN_SET_LAYER_SIDEBAND_STREAM>(
+          layerHook<decltype(&Layer::setSidebandStream),
+                    &Layer::setSidebandStream, const native_handle_t*>);
+    case HWC2::FunctionDescriptor::SetLayerSourceCrop:
+      return asFP<HWC2_PFN_SET_LAYER_SOURCE_CROP>(
+          layerHook<decltype(&Layer::setSourceCrop), &Layer::setSourceCrop,
+                    hwc_frect_t>);
+    case HWC2::FunctionDescriptor::SetLayerTransform:
+      return asFP<HWC2_PFN_SET_LAYER_TRANSFORM>(
+          layerHook<decltype(&Layer::setTransform), &Layer::setTransform,
+                    int32_t>);
+    case HWC2::FunctionDescriptor::SetLayerVisibleRegion:
+      return asFP<HWC2_PFN_SET_LAYER_VISIBLE_REGION>(
+          layerHook<decltype(&Layer::setVisibleRegion),
+                    &Layer::setVisibleRegion, hwc_region_t>);
+    case HWC2::FunctionDescriptor::SetLayerZOrder:
+      return asFP<HWC2_PFN_SET_LAYER_Z_ORDER>(
+          displayHook<decltype(&Display::updateLayerZ), &Display::updateLayerZ,
+                      hwc2_layer_t, uint32_t>);
+
+    default:
+      ALOGE("GetFunction: Unknown function descriptor: %d",
+            static_cast<int32_t>(desc));
+      return nullptr;
+  }
+}
+
+/*static*/
+hwc2_function_pointer_t Device::getFunctionHook(hwc2_device_t* dev,
+                                                int32_t desc) {
+  Device* device = Device::fromDevice(dev);
+  return device->getFunction(desc);
+}
+
+// Device functions
+
+HWC2::Error Device::createVirtualDisplay(uint32_t /*width*/,
+                                         uint32_t /*height*/,
+                                         int32_t* /*format*/,
+                                         hwc2_display_t* /*outDisplay*/) {
+  DEBUG_LOG("%s", __FUNCTION__);
+  // TODO: VirtualDisplay support
+  return HWC2::Error::None;
+}
+
+HWC2::Error Device::destroyVirtualDisplay(hwc2_display_t /*displayId*/) {
+  DEBUG_LOG("%s", __FUNCTION__);
+  // TODO: VirtualDisplay support
+  return HWC2::Error::None;
+}
+
+void Device::dump(uint32_t* /*outSize*/, char* /*outBuffer*/) {
+  DEBUG_LOG("%s", __FUNCTION__);
+  // TODO:
+  return;
+}
+
+uint32_t Device::getMaxVirtualDisplayCount() {
+  DEBUG_LOG("%s", __FUNCTION__);
+  // TODO: VirtualDisplay support
+  return 0;
+}
+
+static bool IsHandledCallback(HWC2::Callback descriptor) {
+  switch (descriptor) {
+    case HWC2::Callback::Hotplug: {
+      return true;
+    }
+    case HWC2::Callback::Refresh: {
+      return true;
+    }
+    case HWC2::Callback::Vsync: {
+      return true;
+    }
+    case HWC2::Callback::Vsync_2_4: {
+      return false;
+    }
+    case HWC2::Callback::VsyncPeriodTimingChanged: {
+      return false;
+    }
+    case HWC2::Callback::Invalid: {
+      return false;
+    }
+    case HWC2::Callback::SeamlessPossible: {
+      return false;
+    }
+  }
+  return false;
+}
+
+HWC2::Error Device::registerCallback(int32_t desc,
+                                     hwc2_callback_data_t callbackData,
+                                     hwc2_function_pointer_t pointer) {
+  const auto callbackType = static_cast<HWC2::Callback>(desc);
+  const auto callbackTypeString = to_string(callbackType);
+  DEBUG_LOG("%s callback %s", __FUNCTION__, callbackTypeString.c_str());
+
+  if (!IsHandledCallback(callbackType)) {
+    ALOGE("%s unhandled callback: %s", __FUNCTION__,
+          callbackTypeString.c_str());
+    return HWC2::Error::BadParameter;
+  }
+
+  std::unique_lock<std::mutex> lock(mStateMutex);
+
+  if (pointer != nullptr) {
+    mCallbacks[callbackType] = {callbackData, pointer};
+  } else {
+    mCallbacks.erase(callbackType);
+    return HWC2::Error::None;
+  }
+
+  if (callbackType == HWC2::Callback::Hotplug) {
+    // Callback without the state lock held
+    lock.unlock();
+    auto hotplug = reinterpret_cast<HWC2_PFN_HOTPLUG>(pointer);
+    auto hotplugConnect = static_cast<int32_t>(HWC2::Connection::Connected);
+    for (const auto& [displayId, display] : mDisplays) {
+      ALOGI("%s hotplug connecting display:%" PRIu64, __FUNCTION__, displayId);
+      hotplug(callbackData, displayId, hotplugConnect);
+    }
+  }
+
+  return HWC2::Error::None;
+}
+
+bool Device::handleHotplug(bool connected, uint32_t id, uint32_t width,
+                           uint32_t height, uint32_t dpiX, uint32_t dpiY,
+                           uint32_t refreshRate) {
+  std::unique_lock<std::mutex> lock(mStateMutex);
+  if (mCallbacks[HWC2::Callback::Hotplug].pointer == nullptr) {
+    return false;
+  }
+  auto hotplug = reinterpret_cast<HWC2_PFN_HOTPLUG>(
+      mCallbacks[HWC2::Callback::Hotplug].pointer);
+  auto hotplugConnect = static_cast<int32_t>(HWC2::Connection::Connected);
+  auto hotplugDisconnect = static_cast<int32_t>(HWC2::Connection::Disconnected);
+  Display* display = getDisplay(id);
+  if (display) {
+    // if existed, disconnect first
+    ALOGD("callback hotplugDisconnect display %" PRIu32, id);
+    hotplug(mCallbacks[HWC2::Callback::Hotplug].data, id, hotplugDisconnect);
+    display->lock();
+    mComposer->onDisplayDestroy(display);
+    display->unlock();
+  }
+  if (connected) {
+    createDisplay(id, width, height, dpiX, dpiY, refreshRate);
+    ALOGD("callback hotplugConnect display %" PRIu32 " width %" PRIu32
+          " height %" PRIu32 " dpiX %" PRIu32 " dpiY %" PRIu32
+          "fps %" PRIu32, id, width, height, dpiX, dpiY, refreshRate);
+    hotplug(mCallbacks[HWC2::Callback::Hotplug].data, id, hotplugConnect);
+  };
+
+  return true;
+}
+
+Display* Device::getDisplay(hwc2_display_t id) {
+  auto display = mDisplays.find(id);
+  if (display == mDisplays.end()) {
+    ALOGW("Failed to get display for id=%d", (uint32_t)id);
+    return nullptr;
+  }
+  return display->second.get();
+}
+
+static int OpenDevice(const struct hw_module_t* module, const char* name,
+                      struct hw_device_t** dev) {
+  DEBUG_LOG("%s ", __FUNCTION__);
+
+  if (strcmp(name, HWC_HARDWARE_COMPOSER)) {
+    ALOGE("Invalid module name- %s", name);
+    return -EINVAL;
+  }
+
+  std::unique_ptr<Device> device = std::make_unique<Device>();
+  HWC2::Error error = device->init();
+  if (error != HWC2::Error::None) {
+    ALOGE("%s: failed to initialize device", __FUNCTION__);
+    return -EINVAL;
+  }
+
+  error = device->createDisplays();
+  if (error != HWC2::Error::None) {
+    ALOGE("%s: failed to initialize device displays.", __FUNCTION__);
+    return -EINVAL;
+  }
+
+  device->common.module = const_cast<hw_module_t*>(module);
+  *dev = &device.release()->common;
+  return 0;
+}
+
+}  // namespace android
+
+static struct hw_module_methods_t hwc2_module_methods = {
+    .open = android::OpenDevice,
+};
+
+hw_module_t HAL_MODULE_INFO_SYM = {
+    .tag = HARDWARE_MODULE_TAG,
+    .version_major = 2,
+    .version_minor = 3,
+    .id = HWC_HARDWARE_MODULE_ID,
+    .name = "goldfish HWC2 module",
+    .author = "The Android Open Source Project",
+    .methods = &hwc2_module_methods,
+    .dso = NULL,
+    .reserved = {0},
+};
diff --git a/system/hwc2/Device.h b/system/hwc2/Device.h
new file mode 100644
index 0000000..7c990b9
--- /dev/null
+++ b/system/hwc2/Device.h
@@ -0,0 +1,151 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_HWC_DEVICE_H
+#define ANDROID_HWC_DEVICE_H
+
+#include <atomic>
+#include <map>
+#include <memory>
+#include <mutex>
+#include <set>
+#include <unordered_map>
+#include <unordered_set>
+#include <vector>
+
+#include "Common.h"
+#include "Composer.h"
+#include "Display.h"
+#include "Layer.h"
+
+namespace android {
+
+class Composer;
+class Display;
+
+class Device : public hwc2_device_t {
+ public:
+  static inline Device* fromDevice(hw_device_t* device) {
+    return reinterpret_cast<Device*>(device);
+  }
+
+  static inline Device* fromDevice(hwc2_device_t* device) {
+    return static_cast<Device*>(device);
+  }
+
+  Device();
+  ~Device();
+
+  HWC2::Error init();
+
+  HWC2::Error createDisplays();
+
+  HWC2::Error createDisplay(uint32_t displayId, uint32_t width, uint32_t height,
+                            uint32_t dpiX, uint32_t dpiY, uint32_t refreshRate);
+
+  Display* getDisplay(hwc2_display_t displayId);
+
+ private:
+  HWC2::Error destroyDisplays();
+
+  bool handleHotplug(bool connected, uint32_t id, uint32_t width,
+                     uint32_t height, uint32_t dpiX, uint32_t dpiY,
+                     uint32_t refreshRate);
+
+  void getCapabilities(uint32_t* outCount, int32_t* outCapabilities);
+  static void getCapabilitiesHook(hwc2_device_t* device, uint32_t* outCount,
+                                  int32_t* outCapabilities);
+
+  hwc2_function_pointer_t getFunction(int32_t descriptor);
+  static hwc2_function_pointer_t getFunctionHook(hwc2_device_t* device,
+                                                 int32_t descriptor);
+
+  // Wrapper to call a specific function on a specific device.
+  template <typename T, typename HookType, HookType func, typename... Args>
+  static T DeviceHook(hwc2_device_t* dev, Args... args) {
+    Device* device = Device::fromDevice(dev);
+    return static_cast<T>(((*device).*func)(std::forward<Args>(args)...));
+  }
+
+  // Wrapper to call a specific function on a specific display.
+  template <typename HookType, HookType func, typename... Args>
+  static int32_t displayHook(hwc2_device_t* dev, hwc2_display_t displayId,
+                             Args... args) {
+    Device* device = Device::fromDevice(dev);
+
+    Display* display = device->getDisplay(displayId);
+    if (display == nullptr) {
+      return static_cast<int32_t>(HWC2::Error::BadDisplay);
+    }
+
+    return static_cast<int32_t>((display->*func)(std::forward<Args>(args)...));
+  }
+
+  // Wrapper to call a specific function on a specific layer.
+  template <typename HookType, HookType func, typename... Args>
+  static int32_t layerHook(hwc2_device_t* dev, hwc2_display_t displayId,
+                           hwc2_layer_t layerId, Args... args) {
+    Device* device = Device::fromDevice(dev);
+
+    Display* display = device->getDisplay(displayId);
+    if (display == nullptr) {
+      return static_cast<int32_t>(HWC2::Error::BadDisplay);
+    }
+
+    Layer* layer = display->getLayer(layerId);
+    if (layer == nullptr) {
+      return static_cast<int32_t>(HWC2::Error::BadLayer);
+    }
+
+    return static_cast<int32_t>((layer->*func)(std::forward<Args>(args)...));
+  }
+
+  // Device functions
+  HWC2::Error createVirtualDisplay(uint32_t width, uint32_t height,
+                                   int32_t* format, hwc2_display_t* outDisplay);
+
+  HWC2::Error destroyVirtualDisplay(hwc2_display_t display);
+
+  void dump(uint32_t* outSize, char* outBuffer);
+
+  uint32_t getMaxVirtualDisplayCount();
+
+  HWC2::Error registerCallback(int32_t descriptor,
+                               hwc2_callback_data_t callbackData,
+                               hwc2_function_pointer_t pointer);
+
+  // These are potentially accessed from multiple threads, and are protected
+  // by this mutex.
+  std::mutex mStateMutex;
+
+  std::unique_ptr<Composer> mComposer;
+
+  std::unordered_set<HWC2::Capability> mCapabilities;
+
+  // For sharing Vsync callback with each displays Vsync thread.
+  friend class Display;
+
+  struct CallbackInfo {
+    hwc2_callback_data_t data;
+    hwc2_function_pointer_t pointer;
+  };
+  std::unordered_map<HWC2::Callback, CallbackInfo> mCallbacks;
+
+  std::map<hwc2_display_t, std::unique_ptr<Display>> mDisplays;
+};
+
+}  // namespace android
+#endif
diff --git a/system/hwc2/Display.cpp b/system/hwc2/Display.cpp
new file mode 100644
index 0000000..d187050
--- /dev/null
+++ b/system/hwc2/Display.cpp
@@ -0,0 +1,1012 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Display.h"
+
+#include <sync/sync.h>
+
+#include <atomic>
+#include <numeric>
+
+#include "Device.h"
+
+namespace android {
+namespace {
+
+using android::hardware::graphics::common::V1_0::ColorTransform;
+
+std::atomic<hwc2_config_t> sNextConfigId{0};
+
+bool IsValidColorMode(android_color_mode_t mode) {
+  switch (mode) {
+    case HAL_COLOR_MODE_NATIVE:                         // Fall-through
+    case HAL_COLOR_MODE_STANDARD_BT601_625:             // Fall-through
+    case HAL_COLOR_MODE_STANDARD_BT601_625_UNADJUSTED:  // Fall-through
+    case HAL_COLOR_MODE_STANDARD_BT601_525:             // Fall-through
+    case HAL_COLOR_MODE_STANDARD_BT601_525_UNADJUSTED:  // Fall-through
+    case HAL_COLOR_MODE_STANDARD_BT709:                 // Fall-through
+    case HAL_COLOR_MODE_DCI_P3:                         // Fall-through
+    case HAL_COLOR_MODE_SRGB:                           // Fall-through
+    case HAL_COLOR_MODE_ADOBE_RGB:                      // Fall-through
+    case HAL_COLOR_MODE_DISPLAY_P3:
+      return true;
+    default:
+      return false;
+  }
+}
+
+bool isValidPowerMode(HWC2::PowerMode mode) {
+  switch (mode) {
+    case HWC2::PowerMode::Off:          // Fall-through
+    case HWC2::PowerMode::DozeSuspend:  // Fall-through
+    case HWC2::PowerMode::Doze:         // Fall-through
+    case HWC2::PowerMode::On:
+      return true;
+    default:
+      return false;
+  }
+}
+
+}  // namespace
+
+Display::Display(Device& device, Composer* composer, hwc2_display_t id)
+    : mDevice(device),
+      mComposer(composer),
+      mId(id),
+      mVsyncThread(new VsyncThread(*this)) {}
+
+Display::~Display() {}
+
+HWC2::Error Display::init(uint32_t width, uint32_t height, uint32_t dpiX,
+                          uint32_t dpiY, uint32_t refreshRateHz,
+                          const std::optional<std::vector<uint8_t>>& edid) {
+  ALOGD("%s initializing display:%" PRIu64
+        " width:%d height:%d dpiX:%d dpiY:%d refreshRateHz:%d",
+        __FUNCTION__, mId, width, height, dpiX, dpiY, refreshRateHz);
+
+  std::unique_lock<std::recursive_mutex> lock(mStateMutex);
+
+  mVsyncPeriod = 1000 * 1000 * 1000 / refreshRateHz;
+  mVsyncThread->run("", ANDROID_PRIORITY_URGENT_DISPLAY);
+
+  hwc2_config_t configId = sNextConfigId++;
+
+  Config config(configId);
+  config.setAttribute(HWC2::Attribute::VsyncPeriod, mVsyncPeriod);
+  config.setAttribute(HWC2::Attribute::Width, width);
+  config.setAttribute(HWC2::Attribute::Height, height);
+  config.setAttribute(HWC2::Attribute::DpiX, dpiX * 1000);
+  config.setAttribute(HWC2::Attribute::DpiY, dpiY * 1000);
+  mConfigs.emplace(configId, config);
+
+  mActiveConfigId = configId;
+  mActiveColorMode = HAL_COLOR_MODE_NATIVE;
+  mColorModes.emplace((android_color_mode_t)HAL_COLOR_MODE_NATIVE);
+  mEdid = edid;
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::updateParameters(
+    uint32_t width, uint32_t height, uint32_t dpiX, uint32_t dpiY,
+    uint32_t refreshRateHz, const std::optional<std::vector<uint8_t>>& edid) {
+  DEBUG_LOG("%s updating display:%" PRIu64
+            " width:%d height:%d dpiX:%d dpiY:%d refreshRateHz:%d",
+            __FUNCTION__, mId, width, height, dpiX, dpiY, refreshRateHz);
+
+  std::unique_lock<std::recursive_mutex> lock(mStateMutex);
+
+  mVsyncPeriod = 1000 * 1000 * 1000 / refreshRateHz;
+
+  auto it = mConfigs.find(*mActiveConfigId);
+  if (it == mConfigs.end()) {
+    ALOGE("%s: failed to find config %" PRIu32, __func__, *mActiveConfigId);
+    return HWC2::Error::NoResources;
+  }
+  it->second.setAttribute(HWC2::Attribute::VsyncPeriod, mVsyncPeriod);
+  it->second.setAttribute(HWC2::Attribute::Width, width);
+  it->second.setAttribute(HWC2::Attribute::Height, height);
+  it->second.setAttribute(HWC2::Attribute::DpiX, dpiX * 1000);
+  it->second.setAttribute(HWC2::Attribute::DpiY, dpiY * 1000);
+
+  mEdid = edid;
+
+  return HWC2::Error::None;
+}
+
+Layer* Display::getLayer(hwc2_layer_t layerId) {
+  auto it = mLayers.find(layerId);
+  if (it == mLayers.end()) {
+    ALOGE("%s Unknown layer:%" PRIu64, __FUNCTION__, layerId);
+    return nullptr;
+  }
+
+  return it->second.get();
+}
+
+buffer_handle_t Display::waitAndGetClientTargetBuffer() {
+  DEBUG_LOG("%s: display:%" PRIu64, __FUNCTION__, mId);
+
+  int fence = mClientTarget.getFence();
+  if (fence != -1) {
+    int err = sync_wait(fence, 3000);
+    if (err < 0 && errno == ETIME) {
+      ALOGE("%s waited on fence %" PRId32 " for 3000 ms", __FUNCTION__, fence);
+    }
+    close(fence);
+  }
+
+  return mClientTarget.getBuffer();
+}
+
+HWC2::Error Display::acceptChanges() {
+  DEBUG_LOG("%s: display:%" PRIu64, __FUNCTION__, mId);
+
+  std::unique_lock<std::recursive_mutex> lock(mStateMutex);
+
+  if (!mChanges) {
+    ALOGE("%s: display %" PRIu64 " failed, not validated", __FUNCTION__, mId);
+    return HWC2::Error::NotValidated;
+  }
+
+  for (auto& [layerId, layerCompositionType] : mChanges->getTypeChanges()) {
+    auto* layer = getLayer(layerId);
+    if (layer == nullptr) {
+      ALOGE("%s: display:%" PRIu64 " layer:%" PRIu64
+            " dropped before AcceptChanges?",
+            __FUNCTION__, mId, layerId);
+      continue;
+    }
+
+    layer->setCompositionTypeEnum(layerCompositionType);
+  }
+  mChanges->clearTypeChanges();
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::createLayer(hwc2_layer_t* outLayerId) {
+  DEBUG_LOG("%s: display:%" PRIu64, __FUNCTION__, mId);
+
+  std::unique_lock<std::recursive_mutex> lock(mStateMutex);
+
+  auto layer = std::make_unique<Layer>();
+  auto layerId = layer->getId();
+  DEBUG_LOG("%s created layer:%" PRIu64, __FUNCTION__, layerId);
+
+  *outLayerId = layerId;
+
+  mLayers.emplace(layerId, std::move(layer));
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::destroyLayer(hwc2_layer_t layerId) {
+  DEBUG_LOG("%s destroy layer:%" PRIu64, __FUNCTION__, layerId);
+
+  std::unique_lock<std::recursive_mutex> lock(mStateMutex);
+
+  auto it = mLayers.find(layerId);
+  if (it == mLayers.end()) {
+    ALOGE("%s display:%" PRIu64 " has no such layer:%." PRIu64, __FUNCTION__,
+          mId, layerId);
+    return HWC2::Error::BadLayer;
+  }
+
+  mOrderedLayers.erase(std::remove_if(mOrderedLayers.begin(),  //
+                                      mOrderedLayers.end(),    //
+                                      [layerId](Layer* layer) {
+                                        return layer->getId() == layerId;
+                                      }),
+                       mOrderedLayers.end());
+
+  mLayers.erase(it);
+
+  DEBUG_LOG("%s destroyed layer:%" PRIu64, __FUNCTION__, layerId);
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::getActiveConfig(hwc2_config_t* outConfig) {
+  DEBUG_LOG("%s: display:%" PRIu64, __FUNCTION__, mId);
+
+  std::unique_lock<std::recursive_mutex> lock(mStateMutex);
+
+  if (!mActiveConfigId) {
+    ALOGW("%s: display:%" PRIu64 " has no active config.", __FUNCTION__, mId);
+    return HWC2::Error::BadConfig;
+  }
+
+  *outConfig = *mActiveConfigId;
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::getDisplayAttributeEnum(hwc2_config_t configId,
+                                             HWC2::Attribute attribute,
+                                             int32_t* outValue) {
+  auto attributeString = to_string(attribute);
+  DEBUG_LOG("%s: display:%" PRIu64 " attribute:%s", __FUNCTION__, mId,
+            attributeString.c_str());
+
+  std::unique_lock<std::recursive_mutex> lock(mStateMutex);
+
+  auto it = mConfigs.find(configId);
+  if (it == mConfigs.end()) {
+    ALOGW("%s: display:%" PRIu64 "bad config:%" PRIu32, __FUNCTION__, mId,
+          configId);
+    return HWC2::Error::BadConfig;
+  }
+
+  const Config& config = it->second;
+  *outValue = config.getAttribute(attribute);
+  DEBUG_LOG("%s: display:%" PRIu64 " attribute:%s value is %" PRIi32,
+            __FUNCTION__, mId, attributeString.c_str(), *outValue);
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::getDisplayAttribute(hwc2_config_t configId,
+                                         int32_t attribute, int32_t* outValue) {
+  return getDisplayAttributeEnum(
+      configId, static_cast<HWC2::Attribute>(attribute), outValue);
+}
+
+HWC2::Error Display::getChangedCompositionTypes(uint32_t* outNumElements,
+                                                hwc2_layer_t* outLayers,
+                                                int32_t* outTypes) {
+  DEBUG_LOG("%s: display:%" PRIu64, __FUNCTION__, mId);
+
+  std::unique_lock<std::recursive_mutex> lock(mStateMutex);
+
+  if (!mChanges) {
+    ALOGE("%s: for display:%" PRIu64 " failed, display not validated",
+          __FUNCTION__, mId);
+    return HWC2::Error::NotValidated;
+  }
+
+  if ((outLayers == nullptr) || (outTypes == nullptr)) {
+    *outNumElements = mChanges->getTypeChanges().size();
+    return HWC2::Error::None;
+  }
+
+  uint32_t numWritten = 0;
+  for (const auto& element : mChanges->getTypeChanges()) {
+    if (numWritten == *outNumElements) {
+      break;
+    }
+
+    auto layerId = element.first;
+    const auto layerCompositionType = element.second;
+    const auto layerCompositionTypeString = to_string(layerCompositionType);
+    DEBUG_LOG("%s: display:%" PRIu64 " layer:%" PRIu64 " changed to %s",
+              __FUNCTION__, mId, layerId, layerCompositionTypeString.c_str());
+
+    outLayers[numWritten] = layerId;
+    outTypes[numWritten] = static_cast<int32_t>(layerCompositionType);
+    ++numWritten;
+  }
+  *outNumElements = numWritten;
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::getColorModes(uint32_t* outNumModes, int32_t* outModes) {
+  DEBUG_LOG("%s: display:%" PRIu64, __FUNCTION__, mId);
+
+  std::unique_lock<std::recursive_mutex> lock(mStateMutex);
+
+  if (!outModes) {
+    *outNumModes = mColorModes.size();
+    return HWC2::Error::None;
+  }
+
+  // we only support HAL_COLOR_MODE_NATIVE so far
+  uint32_t numModes = std::min<uint32_t>(
+      *outNumModes, static_cast<uint32_t>(mColorModes.size()));
+  std::copy_n(mColorModes.cbegin(), numModes, outModes);
+  *outNumModes = numModes;
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::getConfigs(uint32_t* outNumConfigs,
+                                hwc2_config_t* outConfigs) {
+  DEBUG_LOG("%s: display:%" PRIu64, __FUNCTION__, mId);
+
+  std::unique_lock<std::recursive_mutex> lock(mStateMutex);
+
+  if (!outConfigs) {
+    *outNumConfigs = mConfigs.size();
+    return HWC2::Error::None;
+  }
+
+  uint32_t numWritten = 0;
+  for (const auto& [configId, config] : mConfigs) {
+    if (numWritten == *outNumConfigs) {
+      break;
+    }
+    outConfigs[numWritten] = configId;
+    ++numWritten;
+  }
+
+  *outNumConfigs = numWritten;
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::getDozeSupport(int32_t* outSupport) {
+  DEBUG_LOG("%s: display:%" PRIu64, __FUNCTION__, mId);
+
+  // We don't support so far
+  *outSupport = 0;
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::getHdrCapabilities(uint32_t* outNumTypes,
+                                        int32_t* /*outTypes*/,
+                                        float* /*outMaxLuminance*/,
+                                        float* /*outMaxAverageLuminance*/,
+                                        float* /*outMinLuminance*/) {
+  DEBUG_LOG("%s: display:%" PRIu64, __FUNCTION__, mId);
+
+  // We don't support so far
+  *outNumTypes = 0;
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::getName(uint32_t* outSize, char* outName) {
+  DEBUG_LOG("%s: display:%" PRIu64, __FUNCTION__, mId);
+
+  std::unique_lock<std::recursive_mutex> lock(mStateMutex);
+
+  if (!outName) {
+    *outSize = mName.size();
+    return HWC2::Error::None;
+  }
+  auto numCopied = mName.copy(outName, *outSize);
+  *outSize = numCopied;
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::addReleaseFenceLocked(int32_t fence) {
+  DEBUG_LOG("%s: display:%" PRIu64 " fence:%d", __FUNCTION__, mId, fence);
+
+  mReleaseFences.push_back(fence);
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::addReleaseLayerLocked(hwc2_layer_t layerId) {
+  DEBUG_LOG("%s: display:%" PRIu64 " layer:%" PRIu64, __FUNCTION__, mId,
+            layerId);
+
+  mReleaseLayerIds.push_back(layerId);
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::getReleaseFences(uint32_t* outNumElements,
+                                      hwc2_layer_t* outLayers,
+                                      int32_t* outFences) {
+  DEBUG_LOG("%s: display:%" PRIu64, __FUNCTION__, mId);
+
+  std::unique_lock<std::recursive_mutex> lock(mStateMutex);
+
+  *outNumElements = mReleaseLayerIds.size();
+
+  if (*outNumElements && outLayers) {
+    DEBUG_LOG("%s export release layers", __FUNCTION__);
+    memcpy(outLayers, mReleaseLayerIds.data(),
+           sizeof(hwc2_layer_t) * (*outNumElements));
+  }
+
+  if (*outNumElements && outFences) {
+    DEBUG_LOG("%s export release fences", __FUNCTION__);
+    memcpy(outFences, mReleaseFences.data(),
+           sizeof(int32_t) * (*outNumElements));
+  }
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::clearReleaseFencesAndIdsLocked() {
+  DEBUG_LOG("%s: display:%" PRIu64, __FUNCTION__, mId);
+
+  mReleaseLayerIds.clear();
+  mReleaseFences.clear();
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::getRequests(int32_t* outDisplayRequests,
+                                 uint32_t* outNumElements,
+                                 hwc2_layer_t* outLayers,
+                                 int32_t* outLayerRequests) {
+  DEBUG_LOG("%s: display:%" PRIu64, __FUNCTION__, mId);
+
+  std::unique_lock<std::recursive_mutex> lock(mStateMutex);
+
+  if (!mChanges) {
+    return HWC2::Error::NotValidated;
+  }
+
+  if (outLayers == nullptr || outLayerRequests == nullptr) {
+    *outNumElements = mChanges->getNumLayerRequests();
+    return HWC2::Error::None;
+  }
+
+  // TODO
+  //  Display requests (HWC2::DisplayRequest) are not supported so far:
+  *outDisplayRequests = 0;
+
+  uint32_t numWritten = 0;
+  for (const auto& request : mChanges->getLayerRequests()) {
+    if (numWritten == *outNumElements) {
+      break;
+    }
+    outLayers[numWritten] = request.first;
+    outLayerRequests[numWritten] = static_cast<int32_t>(request.second);
+    ++numWritten;
+  }
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::getType(int32_t* outType) {
+  DEBUG_LOG("%s: display:%" PRIu64, __FUNCTION__, mId);
+
+  std::unique_lock<std::recursive_mutex> lock(mStateMutex);
+
+  *outType = (int32_t)mType;
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::present(int32_t* outRetireFence) {
+  DEBUG_LOG("%s: display:%" PRIu64, __FUNCTION__, mId);
+
+  *outRetireFence = -1;
+
+  std::unique_lock<std::recursive_mutex> lock(mStateMutex);
+
+  if (!mChanges || (mChanges->getNumTypes() > 0)) {
+    ALOGE("%s: display:%" PRIu64 " failed, not validated", __FUNCTION__, mId);
+    return HWC2::Error::NotValidated;
+  }
+  mChanges.reset();
+
+  if (mComposer == nullptr) {
+    ALOGE("%s: display:%" PRIu64 " missing composer", __FUNCTION__, mId);
+    return HWC2::Error::NoResources;
+  }
+
+  HWC2::Error error = mComposer->presentDisplay(this, outRetireFence);
+  if (error != HWC2::Error::None) {
+    ALOGE("%s: display:%" PRIu64 " failed to present", __FUNCTION__, mId);
+    return error;
+  }
+
+  DEBUG_LOG("%s: display:%" PRIu64 " present done!", __FUNCTION__, mId);
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::setActiveConfig(hwc2_config_t configId) {
+  DEBUG_LOG("%s: display:%" PRIu64 " setting active config to %" PRIu32,
+            __FUNCTION__, mId, configId);
+
+  std::unique_lock<std::recursive_mutex> lock(mStateMutex);
+
+  if (mConfigs.find(configId) == mConfigs.end()) {
+    ALOGE("%s: display:%" PRIu64 " bad config:%" PRIu32, __FUNCTION__, mId,
+          configId);
+    return HWC2::Error::BadConfig;
+  }
+
+  mActiveConfigId = configId;
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::setClientTarget(buffer_handle_t target,
+                                     int32_t acquireFence,
+                                     int32_t /*dataspace*/,
+                                     hwc_region_t /*damage*/) {
+  DEBUG_LOG("%s: display:%" PRIu64, __FUNCTION__, mId);
+
+  std::unique_lock<std::recursive_mutex> lock(mStateMutex);
+  mClientTarget.setBuffer(target);
+  mClientTarget.setFence(acquireFence);
+  mComposer->onDisplayClientTargetSet(this);
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::setColorMode(int32_t intMode) {
+  DEBUG_LOG("%s: display:%" PRIu64 " setting color mode to %" PRId32,
+            __FUNCTION__, mId, intMode);
+
+  auto mode = static_cast<android_color_mode_t>(intMode);
+  if (!IsValidColorMode(mode)) {
+    ALOGE("%s: display:%" PRIu64 " invalid color mode %" PRId32, __FUNCTION__,
+          mId, intMode);
+    return HWC2::Error::BadParameter;
+  }
+
+  std::unique_lock<std::recursive_mutex> lock(mStateMutex);
+
+  if (mColorModes.count(mode) == 0) {
+    ALOGE("%s: display %" PRIu64 " mode %d not found", __FUNCTION__, mId,
+          intMode);
+    return HWC2::Error::Unsupported;
+  }
+  mActiveColorMode = mode;
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::setColorTransform(const float* transformMatrix,
+                                       int transformTypeRaw) {
+  const auto transformType = static_cast<ColorTransform>(transformTypeRaw);
+  return setColorTransformEnum(transformMatrix, transformType);
+}
+
+HWC2::Error Display::setColorTransformEnum(
+    const float* transformMatrix, ColorTransform transformType) {
+  const auto transformTypeString = toString(transformType);
+  DEBUG_LOG("%s: display:%" PRIu64 " color transform type %s", __FUNCTION__, mId,
+            transformTypeString.c_str());
+
+  if (transformType == ColorTransform::ARBITRARY_MATRIX &&
+      transformMatrix == nullptr) {
+    return HWC2::Error::BadParameter;
+  }
+
+  std::unique_lock<std::recursive_mutex> lock(mStateMutex);
+
+  if (transformType == ColorTransform::IDENTITY) {
+    mColorTransform.reset();
+  } else {
+    ColorTransformWithMatrix& colorTransform = mColorTransform.emplace();
+    colorTransform.transformType = transformType;
+
+    if (transformType == ColorTransform::ARBITRARY_MATRIX) {
+      auto& colorTransformMatrix = colorTransform.transformMatrixOpt.emplace();
+      std::copy_n(transformMatrix, colorTransformMatrix.size(),
+                  colorTransformMatrix.begin());
+    }
+  }
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::setOutputBuffer(buffer_handle_t /*buffer*/,
+                                     int32_t /*releaseFence*/) {
+  DEBUG_LOG("%s: display:%" PRIu64, __FUNCTION__, mId);
+  // TODO: for virtual display
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::setPowerMode(int32_t intMode) {
+  auto mode = static_cast<HWC2::PowerMode>(intMode);
+  auto modeString = to_string(mode);
+  DEBUG_LOG("%s: display:%" PRIu64 " setting power mode to %s", __FUNCTION__,
+            mId, modeString.c_str());
+
+  if (!isValidPowerMode(mode)) {
+    return HWC2::Error::BadParameter;
+  }
+
+  if (mode == HWC2::PowerMode::Doze || mode == HWC2::PowerMode::DozeSuspend) {
+    ALOGE("%s display %" PRIu64 " power mode %s not supported", __FUNCTION__,
+          mId, modeString.c_str());
+    return HWC2::Error::Unsupported;
+  }
+
+  std::unique_lock<std::recursive_mutex> lock(mStateMutex);
+
+  mPowerMode = mode;
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::setVsyncEnabled(int32_t intEnable) {
+  auto enable = static_cast<HWC2::Vsync>(intEnable);
+  auto enableString = to_string(enable);
+  DEBUG_LOG("%s: display:%" PRIu64 " setting vsync to %s", __FUNCTION__, mId,
+            enableString.c_str());
+
+  if (enable == HWC2::Vsync::Invalid) {
+    return HWC2::Error::BadParameter;
+  }
+
+  std::unique_lock<std::recursive_mutex> lock(mStateMutex);
+  DEBUG_LOG("%s: display:%" PRIu64 " setting vsync locked to %s", __FUNCTION__,
+            mId, enableString.c_str());
+
+  mVsyncEnabled = enable;
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::setVsyncPeriod(uint32_t period) {
+  DEBUG_LOG("%s: display:%" PRIu64 " setting vsync period to %d", __FUNCTION__,
+            mId, period);
+
+  mVsyncPeriod = period;
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::validate(uint32_t* outNumTypes, uint32_t* outNumRequests) {
+  DEBUG_LOG("%s: display:%" PRIu64, __FUNCTION__, mId);
+
+  std::unique_lock<std::recursive_mutex> lock(mStateMutex);
+
+  mOrderedLayers.clear();
+  mOrderedLayers.reserve(mLayers.size());
+  for (auto& [_, layerPtr] : mLayers) {
+    mOrderedLayers.push_back(layerPtr.get());
+  }
+
+  std::sort(mOrderedLayers.begin(), mOrderedLayers.end(),
+            [](const Layer* layerA, const Layer* layerB) {
+              const auto zA = layerA->getZ();
+              const auto zB = layerB->getZ();
+              if (zA != zB) {
+                return zA < zB;
+              }
+              return layerA->getId() < layerB->getId();
+            });
+
+  if (!mChanges) {
+    mChanges.reset(new Changes);
+  } else {
+    ALOGE("Validate was called more than once!");
+  }
+
+  if (mComposer == nullptr) {
+    ALOGE("%s: display:%" PRIu64 " missing composer", __FUNCTION__, mId);
+    return HWC2::Error::NoResources;
+  }
+
+  std::unordered_map<hwc2_layer_t, HWC2::Composition> changes;
+
+  HWC2::Error error = mComposer->validateDisplay(this, &changes);
+  if (error != HWC2::Error::None) {
+    ALOGE("%s: display:%" PRIu64 " failed to validate", __FUNCTION__, mId);
+    return error;
+  }
+
+  for (const auto& [layerId, changedCompositionType] : changes) {
+    mChanges->addTypeChange(layerId, changedCompositionType);
+  }
+
+  *outNumTypes = mChanges->getNumTypes();
+  *outNumRequests = mChanges->getNumLayerRequests();
+  return *outNumTypes > 0 ? HWC2::Error::HasChanges : HWC2::Error::None;
+}
+
+HWC2::Error Display::updateLayerZ(hwc2_layer_t layerId, uint32_t z) {
+  DEBUG_LOG("%s: display:%" PRIu64 " update layer:%" PRIu64 " z:%d",
+            __FUNCTION__, mId, layerId, z);
+
+  std::unique_lock<std::recursive_mutex> lock(mStateMutex);
+
+  const auto layerIt = mLayers.find(layerId);
+  if (layerIt == mLayers.end()) {
+    ALOGE("%s failed to find layer %" PRIu64, __FUNCTION__, layerId);
+    return HWC2::Error::BadLayer;
+  }
+
+  auto& layer = layerIt->second;
+  layer->setZ(z);
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::getClientTargetSupport(uint32_t width, uint32_t height,
+                                            int32_t format, int32_t dataspace) {
+  DEBUG_LOG("%s: display:%" PRIu64, __FUNCTION__, mId);
+  std::unique_lock<std::recursive_mutex> lock(mStateMutex);
+
+  if (!mActiveConfigId) {
+    return HWC2::Error::Unsupported;
+  }
+
+  const auto it = mConfigs.find(*mActiveConfigId);
+  if (it == mConfigs.end()) {
+    ALOGE("%s failed to find active config:%" PRIu32, __FUNCTION__,
+          *mActiveConfigId);
+    return HWC2::Error::Unsupported;
+  }
+
+  const Config& activeConfig = it->second;
+  const uint32_t activeConfigWidth =
+      static_cast<uint32_t>(activeConfig.getAttribute(HWC2::Attribute::Width));
+  const uint32_t activeConfigHeight =
+      static_cast<uint32_t>(activeConfig.getAttribute(HWC2::Attribute::Height));
+  if (width == activeConfigWidth && height == activeConfigHeight &&
+      format == HAL_PIXEL_FORMAT_RGBA_8888 &&
+      dataspace == HAL_DATASPACE_UNKNOWN) {
+    return HWC2::Error::None;
+  }
+
+  return HWC2::Error::None;
+}
+
+// thess EDIDs are carefully generated according to the EDID spec version 1.3,
+// more info can be found from the following file:
+//   frameworks/native/services/surfaceflinger/DisplayHardware/DisplayIdentification.cpp
+// approved pnp ids can be found here: https://uefi.org/pnp_id_list
+// pnp id: GGL, name: EMU_display_0, last byte is checksum
+// display id is local:8141603649153536
+static const uint8_t sEDID0[] = {
+    0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x1c, 0xec, 0x01, 0x00,
+    0x01, 0x00, 0x00, 0x00, 0x1b, 0x10, 0x01, 0x03, 0x80, 0x50, 0x2d, 0x78,
+    0x0a, 0x0d, 0xc9, 0xa0, 0x57, 0x47, 0x98, 0x27, 0x12, 0x48, 0x4c, 0x00,
+    0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x3a, 0x80, 0x18, 0x71, 0x38,
+    0x2d, 0x40, 0x58, 0x2c, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0xfc, 0x00, 0x45, 0x4d, 0x55, 0x5f, 0x64, 0x69, 0x73,
+    0x70, 0x6c, 0x61, 0x79, 0x5f, 0x30, 0x00, 0x4b};
+
+// pnp id: GGL, name: EMU_display_1
+// display id is local:8140900251843329
+static const uint8_t sEDID1[] = {
+    0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x1c, 0xec, 0x01, 0x00,
+    0x01, 0x00, 0x00, 0x00, 0x1b, 0x10, 0x01, 0x03, 0x80, 0x50, 0x2d, 0x78,
+    0x0a, 0x0d, 0xc9, 0xa0, 0x57, 0x47, 0x98, 0x27, 0x12, 0x48, 0x4c, 0x00,
+    0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x3a, 0x80, 0x18, 0x71, 0x38,
+    0x2d, 0x40, 0x58, 0x2c, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0xfc, 0x00, 0x45, 0x4d, 0x55, 0x5f, 0x64, 0x69, 0x73,
+    0x70, 0x6c, 0x61, 0x79, 0x5f, 0x31, 0x00, 0x3b};
+
+// pnp id: GGL, name: EMU_display_2
+// display id is local:8140940453066754
+static const uint8_t sEDID2[] = {
+    0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x1c, 0xec, 0x01, 0x00,
+    0x01, 0x00, 0x00, 0x00, 0x1b, 0x10, 0x01, 0x03, 0x80, 0x50, 0x2d, 0x78,
+    0x0a, 0x0d, 0xc9, 0xa0, 0x57, 0x47, 0x98, 0x27, 0x12, 0x48, 0x4c, 0x00,
+    0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x3a, 0x80, 0x18, 0x71, 0x38,
+    0x2d, 0x40, 0x58, 0x2c, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0xfc, 0x00, 0x45, 0x4d, 0x55, 0x5f, 0x64, 0x69, 0x73,
+    0x70, 0x6c, 0x61, 0x79, 0x5f, 0x32, 0x00, 0x49};
+
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
+
+HWC2::Error Display::getDisplayIdentificationData(uint8_t* outPort,
+                                                  uint32_t* outDataSize,
+                                                  uint8_t* outData) {
+  DEBUG_LOG("%s: display:%" PRIu64, __FUNCTION__, mId);
+
+  if (outPort == nullptr || outDataSize == nullptr) {
+    return HWC2::Error::BadParameter;
+  }
+
+  if (mEdid) {
+    if (outData) {
+      *outDataSize = std::min<uint32_t>(*outDataSize, (*mEdid).size());
+      memcpy(outData, (*mEdid).data(), *outDataSize);
+    } else {
+      *outDataSize = (*mEdid).size();
+    }
+    *outPort = mId;
+    return HWC2::Error::None;
+  }
+
+  // fallback to legacy EDID implementation
+  uint32_t len = std::min(*outDataSize, (uint32_t)ARRAY_SIZE(sEDID0));
+  if (outData != nullptr && len < (uint32_t)ARRAY_SIZE(sEDID0)) {
+    ALOGW("%s: display:%" PRIu64 " small buffer size: %u is specified",
+          __FUNCTION__, mId, len);
+  }
+  *outDataSize = ARRAY_SIZE(sEDID0);
+  switch (mId) {
+    case 0:
+      *outPort = 0;
+      if (outData) memcpy(outData, sEDID0, len);
+      break;
+
+    case 1:
+      *outPort = 1;
+      if (outData) memcpy(outData, sEDID1, len);
+      break;
+
+    case 2:
+      *outPort = 2;
+      if (outData) memcpy(outData, sEDID2, len);
+      break;
+
+    default:
+      *outPort = (uint8_t)mId;
+      if (outData) {
+        memcpy(outData, sEDID2, len);
+        uint32_t size = ARRAY_SIZE(sEDID0);
+        // change the name to EMU_display_<mID>
+        // note the 3rd char from back is the number, _0, _1, _2, etc.
+        if (len >= size - 2) outData[size - 3] = '0' + (uint8_t)mId;
+        if (len >= size) {
+          // update the last byte, which is checksum byte
+          uint8_t checksum = -(uint8_t)std::accumulate(
+              outData, outData + size - 1, static_cast<uint8_t>(0));
+          outData[size - 1] = checksum;
+        }
+      }
+      break;
+  }
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::getDisplayCapabilities(uint32_t* outNumCapabilities,
+                                            uint32_t* outCapabilities) {
+  DEBUG_LOG("%s: display:%" PRIu64, __FUNCTION__, mId);
+  if (outNumCapabilities == nullptr) {
+    return HWC2::Error::None;
+  }
+
+  bool brightness_support = false;
+  bool doze_support = false;
+
+  uint32_t count = 1 + (doze_support ? 1 : 0) + (brightness_support ? 1 : 0);
+  int index = 0;
+  if (outCapabilities != nullptr && (*outNumCapabilities >= count)) {
+    outCapabilities[index++] =
+        HWC2_DISPLAY_CAPABILITY_SKIP_CLIENT_COLOR_TRANSFORM;
+    if (doze_support) {
+      outCapabilities[index++] = HWC2_DISPLAY_CAPABILITY_DOZE;
+    }
+    if (brightness_support) {
+      outCapabilities[index++] = HWC2_DISPLAY_CAPABILITY_BRIGHTNESS;
+    }
+  }
+
+  *outNumCapabilities = count;
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::getDisplayBrightnessSupport(bool* out_support) {
+  DEBUG_LOG("%s: display:%" PRIu64, __FUNCTION__, mId);
+
+  *out_support = false;
+  return HWC2::Error::None;
+}
+
+HWC2::Error Display::setDisplayBrightness(float brightness) {
+  DEBUG_LOG("%s: display:%" PRIu64 " brightness %f", __FUNCTION__, mId,
+            brightness);
+
+  ALOGW("TODO: setDisplayBrightness() is not implemented yet: brightness=%f",
+        brightness);
+  return HWC2::Error::Unsupported;
+}
+
+void Display::Config::setAttribute(HWC2::Attribute attribute, int32_t value) {
+  mAttributes[attribute] = value;
+}
+
+int32_t Display::Config::getAttribute(HWC2::Attribute attribute) const {
+  if (mAttributes.count(attribute) == 0) {
+    return -1;
+  }
+  return mAttributes.at(attribute);
+}
+
+std::string Display::Config::toString() const {
+  std::string output;
+
+  auto widthIt = mAttributes.find(HWC2::Attribute::Width);
+  if (widthIt != mAttributes.end()) {
+    output += " w:" + std::to_string(widthIt->second);
+  }
+
+  auto heightIt = mAttributes.find(HWC2::Attribute::Height);
+  if (heightIt != mAttributes.end()) {
+    output += " h:" + std::to_string(heightIt->second);
+  }
+
+  auto vsyncIt = mAttributes.find(HWC2::Attribute::VsyncPeriod);
+  if (vsyncIt != mAttributes.end()) {
+    output += " vsync:" + std::to_string(1e9 / vsyncIt->second);
+  }
+
+  auto dpiXIt = mAttributes.find(HWC2::Attribute::DpiX);
+  if (dpiXIt != mAttributes.end()) {
+    output += " dpi-x:" + std::to_string(dpiXIt->second / 1000.0f);
+  }
+
+  auto dpiYIt = mAttributes.find(HWC2::Attribute::DpiY);
+  if (dpiYIt != mAttributes.end()) {
+    output += " dpi-y:" + std::to_string(dpiYIt->second / 1000.0f);
+  }
+
+  return output;
+}
+
+// VsyncThread function
+bool Display::VsyncThread::threadLoop() {
+  struct timespec rt;
+  if (clock_gettime(CLOCK_MONOTONIC, &rt) == -1) {
+    ALOGE("%s: error in vsync thread clock_gettime: %s", __FUNCTION__,
+          strerror(errno));
+    return true;
+  }
+  const int logInterval = 60;
+  int64_t lastLogged = rt.tv_sec;
+  int sent = 0;
+  int lastSent = 0;
+  bool vsyncEnabled = false;
+
+  struct timespec wait_time;
+  wait_time.tv_sec = 0;
+  wait_time.tv_nsec = mDisplay.mVsyncPeriod;
+  const int64_t kOneRefreshNs = mDisplay.mVsyncPeriod;
+  const int64_t kOneSecondNs = 1000ULL * 1000ULL * 1000ULL;
+  int64_t lastTimeNs = -1;
+  int64_t phasedWaitNs = 0;
+  int64_t currentNs = 0;
+
+  while (true) {
+    clock_gettime(CLOCK_MONOTONIC, &rt);
+    currentNs = rt.tv_nsec + rt.tv_sec * kOneSecondNs;
+
+    if (lastTimeNs < 0) {
+      phasedWaitNs = currentNs + kOneRefreshNs;
+    } else {
+      phasedWaitNs =
+          kOneRefreshNs * ((currentNs - lastTimeNs) / kOneRefreshNs + 1) +
+          lastTimeNs;
+    }
+
+    wait_time.tv_sec = phasedWaitNs / kOneSecondNs;
+    wait_time.tv_nsec = phasedWaitNs - wait_time.tv_sec * kOneSecondNs;
+
+    int ret;
+    do {
+      ret = clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &wait_time, NULL);
+    } while (ret == -1 && errno == EINTR);
+
+    lastTimeNs = phasedWaitNs;
+
+    std::unique_lock<std::recursive_mutex> lock(mDisplay.mStateMutex);
+    vsyncEnabled = (mDisplay.mVsyncEnabled == HWC2::Vsync::Enable);
+    lock.unlock();
+
+    if (!vsyncEnabled) {
+      continue;
+    }
+
+    lock.lock();
+    const auto& callbackInfo =
+        mDisplay.mDevice.mCallbacks[HWC2::Callback::Vsync];
+    auto vsync = reinterpret_cast<HWC2_PFN_VSYNC>(callbackInfo.pointer);
+    lock.unlock();
+
+    if (vsync) {
+      DEBUG_LOG("%s: display:%" PRIu64 " calling vsync", __FUNCTION__,
+                mDisplay.mId);
+      vsync(callbackInfo.data, mDisplay.mId, lastTimeNs);
+    }
+
+    int64_t lastSentInterval = rt.tv_sec - lastLogged;
+    if (lastSentInterval >= logInterval) {
+      DEBUG_LOG("sent %d syncs in %" PRId64 "s", sent - lastSent,
+                lastSentInterval);
+      lastLogged = rt.tv_sec;
+      lastSent = sent;
+    }
+    ++sent;
+  }
+  return false;
+}
+
+}  // namespace android
diff --git a/system/hwc2/Display.h b/system/hwc2/Display.h
new file mode 100644
index 0000000..dc2439a
--- /dev/null
+++ b/system/hwc2/Display.h
@@ -0,0 +1,249 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_HWC_DISPLAY_H
+#define ANDROID_HWC_DISPLAY_H
+
+#include <android/hardware/graphics/common/1.0/types.h>
+#include <utils/Thread.h>
+
+#include <array>
+#include <optional>
+#include <set>
+#include <thread>
+#include <unordered_map>
+#include <vector>
+
+#include "Common.h"
+#include "Composer.h"
+#include "FencedBuffer.h"
+#include "Layer.h"
+
+namespace android {
+
+class Composer;
+class Device;
+
+struct ColorTransformWithMatrix {
+  android::hardware::graphics::common::V1_0::ColorTransform transformType;
+  std::optional<std::array<float, 16>> transformMatrixOpt;
+};
+
+class Display {
+ public:
+  Display(Device& device, Composer* composer, hwc2_display_t id);
+  ~Display();
+
+  Display(const Display& display) = delete;
+  Display& operator=(const Display& display) = delete;
+
+  Display(Display&& display) = delete;
+  Display& operator=(Display&& display) = delete;
+
+  HWC2::Error init(
+      uint32_t width, uint32_t height, uint32_t dpiX, uint32_t dpiY,
+      uint32_t refreshRateHz,
+      const std::optional<std::vector<uint8_t>>& edid = std::nullopt);
+
+  HWC2::Error updateParameters(
+      uint32_t width, uint32_t height, uint32_t dpiX, uint32_t dpiY,
+      uint32_t refreshRateHz,
+      const std::optional<std::vector<uint8_t>>& edid = std::nullopt);
+
+  hwc2_display_t getId() const { return mId; }
+
+  Layer* getLayer(hwc2_layer_t layerHandle);
+
+  FencedBuffer& getClientTarget() { return mClientTarget; }
+  buffer_handle_t waitAndGetClientTargetBuffer();
+
+  const std::vector<Layer*>& getOrderedLayers() { return mOrderedLayers; }
+
+  HWC2::Error acceptChanges();
+  HWC2::Error createLayer(hwc2_layer_t* outLayerId);
+  HWC2::Error destroyLayer(hwc2_layer_t layerId);
+  HWC2::Error getActiveConfig(hwc2_config_t* outConfigId);
+  HWC2::Error getDisplayAttribute(hwc2_config_t configId, int32_t attribute,
+                                  int32_t* outValue);
+  HWC2::Error getDisplayAttributeEnum(hwc2_config_t configId,
+                                      HWC2::Attribute attribute,
+                                      int32_t* outValue);
+  HWC2::Error getChangedCompositionTypes(uint32_t* outNumElements,
+                                         hwc2_layer_t* outLayers,
+                                         int32_t* outTypes);
+  HWC2::Error getColorModes(uint32_t* outNumModes, int32_t* outModes);
+  HWC2::Error getConfigs(uint32_t* outNumConfigs, hwc2_config_t* outConfigIds);
+  HWC2::Error getDozeSupport(int32_t* outSupport);
+  HWC2::Error getHdrCapabilities(uint32_t* outNumTypes, int32_t* outTypes,
+                                 float* outMaxLuminance,
+                                 float* outMaxAverageLuminance,
+                                 float* outMinLuminance);
+  HWC2::Error getName(uint32_t* outSize, char* outName);
+  HWC2::Error addReleaseFenceLocked(int32_t fence);
+  HWC2::Error addReleaseLayerLocked(hwc2_layer_t layerId);
+  HWC2::Error getReleaseFences(uint32_t* outNumElements,
+                               hwc2_layer_t* outLayers, int32_t* outFences);
+  HWC2::Error clearReleaseFencesAndIdsLocked();
+  HWC2::Error getRequests(int32_t* outDisplayRequests, uint32_t* outNumElements,
+                          hwc2_layer_t* outLayers, int32_t* outLayerRequests);
+  HWC2::Error getType(int32_t* outType);
+  HWC2::Error present(int32_t* outRetireFence);
+  HWC2::Error setActiveConfig(hwc2_config_t configId);
+  HWC2::Error setClientTarget(buffer_handle_t target, int32_t acquireFence,
+                              int32_t dataspace, hwc_region_t damage);
+  HWC2::Error setColorMode(int32_t mode);
+  HWC2::Error setColorTransform(const float* matrix, int transform);
+  HWC2::Error setColorTransformEnum(const float* matrix,
+                                    android::hardware::graphics::common::V1_0::ColorTransform transform);
+  bool hasColorTransform() const { return mColorTransform.has_value(); }
+  ColorTransformWithMatrix getColorTransform() const { return *mColorTransform; }
+
+  HWC2::Error setOutputBuffer(buffer_handle_t buffer, int32_t releaseFence);
+  HWC2::Error setPowerMode(int32_t mode);
+  HWC2::Error setVsyncEnabled(int32_t enabled);
+  HWC2::Error setVsyncPeriod(uint32_t period);
+  HWC2::Error validate(uint32_t* outNumTypes, uint32_t* outNumRequests);
+  HWC2::Error updateLayerZ(hwc2_layer_t layerId, uint32_t z);
+  HWC2::Error getClientTargetSupport(uint32_t width, uint32_t height,
+                                     int32_t format, int32_t dataspace);
+  HWC2::Error getDisplayIdentificationData(uint8_t* outPort,
+                                           uint32_t* outDataSize,
+                                           uint8_t* outData);
+  HWC2::Error getDisplayCapabilities(uint32_t* outNumCapabilities,
+                                     uint32_t* outCapabilities);
+  HWC2::Error getDisplayBrightnessSupport(bool* out_support);
+  HWC2::Error setDisplayBrightness(float brightness);
+  void lock() { mStateMutex.lock(); }
+  void unlock() { mStateMutex.unlock(); }
+
+ private:
+  class Config {
+   public:
+    Config(hwc2_config_t configId) : mId(configId) {}
+
+    Config(const Config& display) = default;
+    Config& operator=(const Config& display) = default;
+
+    Config(Config&& display) = default;
+    Config& operator=(Config&& display) = default;
+
+    hwc2_config_t getId() const { return mId; }
+    void setId(hwc2_config_t id) { mId = id; }
+
+    int32_t getAttribute(HWC2::Attribute attribute) const;
+    void setAttribute(HWC2::Attribute attribute, int32_t value);
+
+    std::string toString() const;
+
+   private:
+    hwc2_config_t mId;
+    std::unordered_map<HWC2::Attribute, int32_t> mAttributes;
+  };
+
+  // Stores changes requested from the device upon calling prepare().
+  // Handles change request to:
+  //   - Layer composition type.
+  //   - Layer hints.
+  class Changes {
+   public:
+    uint32_t getNumTypes() const {
+      return static_cast<uint32_t>(mTypeChanges.size());
+    }
+
+    uint32_t getNumLayerRequests() const {
+      return static_cast<uint32_t>(mLayerRequests.size());
+    }
+
+    const std::unordered_map<hwc2_layer_t, HWC2::Composition>& getTypeChanges()
+        const {
+      return mTypeChanges;
+    }
+
+    const std::unordered_map<hwc2_layer_t, HWC2::LayerRequest>&
+    getLayerRequests() const {
+      return mLayerRequests;
+    }
+
+    void addTypeChange(hwc2_layer_t layerId, HWC2::Composition type) {
+      mTypeChanges.insert({layerId, type});
+    }
+
+    void clearTypeChanges() { mTypeChanges.clear(); }
+
+    void addLayerRequest(hwc2_layer_t layerId, HWC2::LayerRequest request) {
+      mLayerRequests.insert({layerId, request});
+    }
+
+   private:
+    std::unordered_map<hwc2_layer_t, HWC2::Composition> mTypeChanges;
+    std::unordered_map<hwc2_layer_t, HWC2::LayerRequest> mLayerRequests;
+  };
+
+  // Generate sw vsync signal
+  class VsyncThread : public Thread {
+   public:
+    VsyncThread(Display& display) : mDisplay(display) {}
+    virtual ~VsyncThread() {}
+
+    VsyncThread(const VsyncThread&) = default;
+    VsyncThread& operator=(const VsyncThread&) = default;
+
+    VsyncThread(VsyncThread&&) = default;
+    VsyncThread& operator=(VsyncThread&&) = default;
+
+   private:
+    Display& mDisplay;
+    bool threadLoop() final;
+  };
+
+ private:
+  // The state of this display should only be modified from
+  // SurfaceFlinger's main loop, with the exception of when dump is
+  // called. To prevent a bad state from crashing us during a dump
+  // call, all public calls into Display must acquire this mutex.
+  mutable std::recursive_mutex mStateMutex;
+
+  Device& mDevice;
+  Composer* mComposer = nullptr;
+  const hwc2_display_t mId;
+  std::string mName;
+  HWC2::DisplayType mType = HWC2::DisplayType::Physical;
+  HWC2::PowerMode mPowerMode = HWC2::PowerMode::Off;
+  HWC2::Vsync mVsyncEnabled = HWC2::Vsync::Invalid;
+  uint32_t mVsyncPeriod;
+  sp<VsyncThread> mVsyncThread;
+  FencedBuffer mClientTarget;
+  // Will only be non-null after the Display has been validated and
+  // before it has been presented
+  std::unique_ptr<Changes> mChanges;
+
+  std::unordered_map<hwc2_layer_t, std::unique_ptr<Layer>> mLayers;
+  // Ordered layers available after validate().
+  std::vector<Layer*> mOrderedLayers;
+
+  std::vector<hwc2_display_t> mReleaseLayerIds;
+  std::vector<int32_t> mReleaseFences;
+  std::optional<hwc2_config_t> mActiveConfigId;
+  std::unordered_map<hwc2_config_t, Config> mConfigs;
+  std::set<android_color_mode_t> mColorModes;
+  android_color_mode_t mActiveColorMode;
+  std::optional<ColorTransformWithMatrix> mColorTransform;
+  std::optional<std::vector<uint8_t>> mEdid;
+};
+
+}  // namespace android
+
+#endif
diff --git a/system/hwc2/Drm.cpp b/system/hwc2/Drm.cpp
new file mode 100644
index 0000000..4b27fa2
--- /dev/null
+++ b/system/hwc2/Drm.cpp
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Drm.h"
+
+#include <drm_fourcc.h>
+#include <log/log.h>
+#include <system/graphics.h>
+
+namespace android {
+
+const char* GetDrmFormatString(uint32_t drm_format) {
+  switch (drm_format) {
+    case DRM_FORMAT_ABGR1555:
+      return "DRM_FORMAT_ABGR1555";
+    case DRM_FORMAT_ABGR2101010:
+      return "DRM_FORMAT_ABGR2101010";
+    case DRM_FORMAT_ABGR4444:
+      return "DRM_FORMAT_ABGR4444";
+    case DRM_FORMAT_ABGR8888:
+      return "DRM_FORMAT_ABGR8888";
+    case DRM_FORMAT_ARGB1555:
+      return "DRM_FORMAT_ARGB1555";
+    case DRM_FORMAT_ARGB2101010:
+      return "DRM_FORMAT_ARGB2101010";
+    case DRM_FORMAT_ARGB4444:
+      return "DRM_FORMAT_ARGB4444";
+    case DRM_FORMAT_ARGB8888:
+      return "DRM_FORMAT_ARGB8888";
+    case DRM_FORMAT_AYUV:
+      return "DRM_FORMAT_AYUV";
+    case DRM_FORMAT_BGR233:
+      return "DRM_FORMAT_BGR233";
+    case DRM_FORMAT_BGR565:
+      return "DRM_FORMAT_BGR565";
+    case DRM_FORMAT_BGR888:
+      return "DRM_FORMAT_BGR888";
+    case DRM_FORMAT_BGRA1010102:
+      return "DRM_FORMAT_BGRA1010102";
+    case DRM_FORMAT_BGRA4444:
+      return "DRM_FORMAT_BGRA4444";
+    case DRM_FORMAT_BGRA5551:
+      return "DRM_FORMAT_BGRA5551";
+    case DRM_FORMAT_BGRA8888:
+      return "DRM_FORMAT_BGRA8888";
+    case DRM_FORMAT_BGRX1010102:
+      return "DRM_FORMAT_BGRX1010102";
+    case DRM_FORMAT_BGRX4444:
+      return "DRM_FORMAT_BGRX4444";
+    case DRM_FORMAT_BGRX5551:
+      return "DRM_FORMAT_BGRX5551";
+    case DRM_FORMAT_BGRX8888:
+      return "DRM_FORMAT_BGRX8888";
+    case DRM_FORMAT_C8:
+      return "DRM_FORMAT_C8";
+    case DRM_FORMAT_GR88:
+      return "DRM_FORMAT_GR88";
+    case DRM_FORMAT_NV12:
+      return "DRM_FORMAT_NV12";
+    case DRM_FORMAT_NV21:
+      return "DRM_FORMAT_NV21";
+    case DRM_FORMAT_R8:
+      return "DRM_FORMAT_R8";
+    case DRM_FORMAT_RG88:
+      return "DRM_FORMAT_RG88";
+    case DRM_FORMAT_RGB332:
+      return "DRM_FORMAT_RGB332";
+    case DRM_FORMAT_RGB565:
+      return "DRM_FORMAT_RGB565";
+    case DRM_FORMAT_RGB888:
+      return "DRM_FORMAT_RGB888";
+    case DRM_FORMAT_RGBA1010102:
+      return "DRM_FORMAT_RGBA1010102";
+    case DRM_FORMAT_RGBA4444:
+      return "DRM_FORMAT_RGBA4444";
+    case DRM_FORMAT_RGBA5551:
+      return "DRM_FORMAT_RGBA5551";
+    case DRM_FORMAT_RGBA8888:
+      return "DRM_FORMAT_RGBA8888";
+    case DRM_FORMAT_RGBX1010102:
+      return "DRM_FORMAT_RGBX1010102";
+    case DRM_FORMAT_RGBX4444:
+      return "DRM_FORMAT_RGBX4444";
+    case DRM_FORMAT_RGBX5551:
+      return "DRM_FORMAT_RGBX5551";
+    case DRM_FORMAT_RGBX8888:
+      return "DRM_FORMAT_RGBX8888";
+    case DRM_FORMAT_UYVY:
+      return "DRM_FORMAT_UYVY";
+    case DRM_FORMAT_VYUY:
+      return "DRM_FORMAT_VYUY";
+    case DRM_FORMAT_XBGR1555:
+      return "DRM_FORMAT_XBGR1555";
+    case DRM_FORMAT_XBGR2101010:
+      return "DRM_FORMAT_XBGR2101010";
+    case DRM_FORMAT_XBGR4444:
+      return "DRM_FORMAT_XBGR4444";
+    case DRM_FORMAT_XBGR8888:
+      return "DRM_FORMAT_XBGR8888";
+    case DRM_FORMAT_XRGB1555:
+      return "DRM_FORMAT_XRGB1555";
+    case DRM_FORMAT_XRGB2101010:
+      return "DRM_FORMAT_XRGB2101010";
+    case DRM_FORMAT_XRGB4444:
+      return "DRM_FORMAT_XRGB4444";
+    case DRM_FORMAT_XRGB8888:
+      return "DRM_FORMAT_XRGB8888";
+    case DRM_FORMAT_YUYV:
+      return "DRM_FORMAT_YUYV";
+    case DRM_FORMAT_YVU420:
+      return "DRM_FORMAT_YVU420";
+    case DRM_FORMAT_YVYU:
+      return "DRM_FORMAT_YVYU";
+  }
+  return "Unknown";
+}
+
+int GetDrmFormatBytesPerPixel(uint32_t drm_format) {
+  switch (drm_format) {
+    case DRM_FORMAT_ABGR8888:
+    case DRM_FORMAT_ARGB8888:
+    case DRM_FORMAT_XBGR8888:
+      return 4;
+    case DRM_FORMAT_BGR888:
+      return 3;
+    case DRM_FORMAT_RGB565:
+    case DRM_FORMAT_YVU420:
+#ifdef GRALLOC_MODULE_API_VERSION_0_2
+    case DRM_FORMAT_FLEX_YCbCr_420_888:
+#endif
+      return 2;
+    case DRM_FORMAT_R8:
+      return 1;
+  }
+  ALOGE("%s: format size unknown %d(%s)", __FUNCTION__, drm_format,
+        GetDrmFormatString(drm_format));
+  return 8;
+}
+
+int GetDrmFormatFromHalFormat(int hal_format) {
+  switch (hal_format) {
+    case HAL_PIXEL_FORMAT_RGBA_FP16:
+      return DRM_FORMAT_ABGR16161616F;
+    case HAL_PIXEL_FORMAT_RGBA_8888:
+      return DRM_FORMAT_ABGR8888;
+    case HAL_PIXEL_FORMAT_RGBX_8888:
+      return DRM_FORMAT_XBGR8888;
+    case HAL_PIXEL_FORMAT_BGRA_8888:
+      return DRM_FORMAT_ARGB8888;
+    case HAL_PIXEL_FORMAT_RGB_888:
+      return DRM_FORMAT_BGR888;
+    case HAL_PIXEL_FORMAT_RGB_565:
+      return DRM_FORMAT_BGR565;
+    case HAL_PIXEL_FORMAT_YV12:
+      return DRM_FORMAT_YVU420;
+    case HAL_PIXEL_FORMAT_YCbCr_420_888:
+      return DRM_FORMAT_YVU420;
+    case HAL_PIXEL_FORMAT_BLOB:
+      return DRM_FORMAT_R8;
+    default:
+      break;
+  }
+  ALOGE("%s unhandled hal format: %d", __FUNCTION__, hal_format);
+  return 0;
+}
+
+}  // namespace android
\ No newline at end of file
diff --git a/system/hwc2/Drm.h b/system/hwc2/Drm.h
new file mode 100644
index 0000000..9bc18b3
--- /dev/null
+++ b/system/hwc2/Drm.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef ANDROID_HWC_DRM_H
+#define ANDROID_HWC_DRM_H
+
+#include <cstdlib>
+
+namespace android {
+
+const char* GetDrmFormatString(uint32_t drm_format);
+
+int GetDrmFormatBytesPerPixel(uint32_t drm_format);
+
+int GetDrmFormatFromHalFormat(int hal_format);
+
+}  // namespace android
+
+#endif
\ No newline at end of file
diff --git a/system/hwc2/DrmPresenter.cpp b/system/hwc2/DrmPresenter.cpp
new file mode 100644
index 0000000..4d63c58
--- /dev/null
+++ b/system/hwc2/DrmPresenter.cpp
@@ -0,0 +1,641 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "DrmPresenter.h"
+
+#include <cros_gralloc_handle.h>
+#include <linux/netlink.h>
+#include <sys/socket.h>
+
+using android::base::guest::AutoReadLock;
+using android::base::guest::AutoWriteLock;
+using android::base::guest::ReadWriteLock;
+
+namespace android {
+
+bool DrmPresenter::init(const HotplugCallback& cb) {
+  DEBUG_LOG("%s", __FUNCTION__);
+
+  mHotplugCallback = cb;
+  mFd = android::base::unique_fd(open("/dev/dri/card0", O_RDWR | O_CLOEXEC));
+  if (mFd < 0) {
+    ALOGE("%s HWC2::Error opening DrmPresenter device: %d", __FUNCTION__,
+          errno);
+    return false;
+  }
+
+  int univRet = drmSetClientCap(mFd.get(), DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
+  if (univRet) {
+    ALOGE("%s: fail to set universal plane %d\n", __FUNCTION__, univRet);
+    return false;
+  }
+
+  int atomicRet = drmSetClientCap(mFd.get(), DRM_CLIENT_CAP_ATOMIC, 1);
+  if (atomicRet) {
+    ALOGE("%s: fail to set atomic operation %d, %d\n", __FUNCTION__, atomicRet,
+          errno);
+    return false;
+  }
+
+  {
+    AutoWriteLock lock(mStateMutex);
+    bool initDrmRet = initDrmElementsLocked();
+    if (initDrmRet) {
+      ALOGD("%s: Successfully initialized DRM backend", __FUNCTION__);
+    } else {
+      ALOGE("%s: Failed to initialize DRM backend", __FUNCTION__);
+      return false;
+    }
+  }
+
+  mDrmEventListener = sp<DrmEventListener>::make(*this);
+  if (mDrmEventListener->init()) {
+    ALOGD("%s: Successfully initialized DRM event listener", __FUNCTION__);
+  } else {
+    ALOGE("%s: Failed to initialize DRM event listener", __FUNCTION__);
+  }
+  mDrmEventListener->run("", ANDROID_PRIORITY_URGENT_DISPLAY);
+
+  return true;
+}
+
+bool DrmPresenter::initDrmElementsLocked() {
+  drmModeRes* res;
+  static const int32_t kUmPerInch = 25400;
+
+  res = drmModeGetResources(mFd.get());
+  if (res == nullptr) {
+    ALOGE("%s HWC2::Error reading drm resources: %d", __FUNCTION__, errno);
+    mFd.reset();
+    return false;
+  }
+
+  ALOGD(
+      "drmModeRes count fbs %d crtc %d connector %d encoder %d min w %d max w "
+      "%d min h %d max h %d",
+      res->count_fbs, res->count_crtcs, res->count_connectors,
+      res->count_encoders, res->min_width, res->max_width, res->min_height,
+      res->max_height);
+
+  for (uint32_t i = 0; i < res->count_crtcs; i++) {
+    DrmCrtc crtc = {};
+
+    drmModeCrtcPtr c = drmModeGetCrtc(mFd.get(), res->crtcs[i]);
+    crtc.mId = c->crtc_id;
+
+    drmModeObjectPropertiesPtr crtcProps =
+        drmModeObjectGetProperties(mFd.get(), c->crtc_id, DRM_MODE_OBJECT_CRTC);
+
+    for (uint32_t crtcPropsIndex = 0; crtcPropsIndex < crtcProps->count_props;
+         crtcPropsIndex++) {
+      drmModePropertyPtr crtcProp =
+          drmModeGetProperty(mFd.get(), crtcProps->props[crtcPropsIndex]);
+
+      if (!strcmp(crtcProp->name, "OUT_FENCE_PTR")) {
+        crtc.mFencePropertyId = crtcProp->prop_id;
+      } else if (!strcmp(crtcProp->name, "ACTIVE")) {
+        crtc.mActivePropertyId = crtcProp->prop_id;
+      } else if (!strcmp(crtcProp->name, "MODE_ID")) {
+        crtc.mModePropertyId = crtcProp->prop_id;
+      }
+
+      drmModeFreeProperty(crtcProp);
+    }
+
+    drmModeFreeObjectProperties(crtcProps);
+
+    mCrtcs.push_back(crtc);
+  }
+
+  drmModePlaneResPtr planeRes = drmModeGetPlaneResources(mFd.get());
+  for (uint32_t i = 0; i < planeRes->count_planes; ++i) {
+    DrmPlane plane = {};
+
+    drmModePlanePtr p = drmModeGetPlane(mFd.get(), planeRes->planes[i]);
+    plane.mId = p->plane_id;
+
+    ALOGD(
+        "%s: plane id: %u crtcid %u fbid %u crtc xy %d %d xy %d %d "
+        "possible ctrcs 0x%x",
+        __FUNCTION__, p->plane_id, p->crtc_id, p->fb_id, p->crtc_x, p->crtc_y,
+        p->x, p->y, p->possible_crtcs);
+
+    drmModeObjectPropertiesPtr planeProps =
+        drmModeObjectGetProperties(mFd.get(), plane.mId, DRM_MODE_OBJECT_PLANE);
+
+    for (uint32_t planePropIndex = 0; planePropIndex < planeProps->count_props;
+         ++planePropIndex) {
+      drmModePropertyPtr planeProp =
+          drmModeGetProperty(mFd.get(), planeProps->props[planePropIndex]);
+
+      if (!strcmp(planeProp->name, "CRTC_ID")) {
+        plane.mCrtcPropertyId = planeProp->prop_id;
+      } else if (!strcmp(planeProp->name, "FB_ID")) {
+        plane.mFbPropertyId = planeProp->prop_id;
+      } else if (!strcmp(planeProp->name, "CRTC_X")) {
+        plane.mCrtcXPropertyId = planeProp->prop_id;
+      } else if (!strcmp(planeProp->name, "CRTC_Y")) {
+        plane.mCrtcYPropertyId = planeProp->prop_id;
+      } else if (!strcmp(planeProp->name, "CRTC_W")) {
+        plane.mCrtcWPropertyId = planeProp->prop_id;
+      } else if (!strcmp(planeProp->name, "CRTC_H")) {
+        plane.mCrtcHPropertyId = planeProp->prop_id;
+      } else if (!strcmp(planeProp->name, "SRC_X")) {
+        plane.mSrcXPropertyId = planeProp->prop_id;
+      } else if (!strcmp(planeProp->name, "SRC_Y")) {
+        plane.mSrcYPropertyId = planeProp->prop_id;
+      } else if (!strcmp(planeProp->name, "SRC_W")) {
+        plane.mSrcWPropertyId = planeProp->prop_id;
+      } else if (!strcmp(planeProp->name, "SRC_H")) {
+        plane.mSrcHPropertyId = planeProp->prop_id;
+      } else if (!strcmp(planeProp->name, "type")) {
+        plane.mTypePropertyId = planeProp->prop_id;
+        uint64_t type = planeProp->values[0];
+        switch (type) {
+          case DRM_PLANE_TYPE_OVERLAY:
+            plane.mType = type;
+            ALOGD("%s: plane %" PRIu32 " is DRM_PLANE_TYPE_OVERLAY",
+                  __FUNCTION__, plane.mId);
+            break;
+          case DRM_PLANE_TYPE_PRIMARY:
+            plane.mType = type;
+            ALOGD("%s: plane %" PRIu32 " is DRM_PLANE_TYPE_PRIMARY",
+                  __FUNCTION__, plane.mId);
+            break;
+          default:
+            break;
+        }
+      }
+
+      drmModeFreeProperty(planeProp);
+    }
+
+    drmModeFreeObjectProperties(planeProps);
+
+    bool isPrimaryOrOverlay = plane.mType == DRM_PLANE_TYPE_OVERLAY ||
+                              plane.mType == DRM_PLANE_TYPE_PRIMARY;
+    if (isPrimaryOrOverlay) {
+      for (uint32_t j = 0; j < mCrtcs.size(); j++) {
+        if ((0x1 << j) & p->possible_crtcs) {
+          ALOGD("%s: plane %" PRIu32 " compatible with crtc mask %" PRIu32,
+                __FUNCTION__, plane.mId, p->possible_crtcs);
+          if (mCrtcs[j].mPlaneId == -1) {
+            mCrtcs[j].mPlaneId = plane.mId;
+            ALOGD("%s: plane %" PRIu32 " associated with crtc %" PRIu32,
+                  __FUNCTION__, plane.mId, j);
+            break;
+          }
+        }
+      }
+    }
+
+    drmModeFreePlane(p);
+    mPlanes[plane.mId] = plane;
+  }
+  drmModeFreePlaneResources(planeRes);
+
+  for (uint32_t i = 0; i < res->count_connectors; ++i) {
+    DrmConnector connector = {};
+    connector.mId = res->connectors[i];
+
+    {
+      drmModeObjectPropertiesPtr connectorProps = drmModeObjectGetProperties(
+          mFd.get(), connector.mId, DRM_MODE_OBJECT_CONNECTOR);
+
+      for (uint32_t connectorPropIndex = 0;
+           connectorPropIndex < connectorProps->count_props;
+           ++connectorPropIndex) {
+        drmModePropertyPtr connectorProp = drmModeGetProperty(
+            mFd.get(), connectorProps->props[connectorPropIndex]);
+        if (!strcmp(connectorProp->name, "CRTC_ID")) {
+          connector.mCrtcPropertyId = connectorProp->prop_id;
+        } else if (!strcmp(connectorProp->name, "EDID")) {
+          connector.mEdidBlobId = connectorProps->prop_values[connectorPropIndex];
+        }
+        drmModeFreeProperty(connectorProp);
+      }
+
+      drmModeFreeObjectProperties(connectorProps);
+    }
+    {
+      drmModeConnector* c = drmModeGetConnector(mFd.get(), connector.mId);
+      if (c == nullptr) {
+        ALOGE("%s: Failed to get connector %" PRIu32 ": %d", __FUNCTION__,
+              connector.mId, errno);
+        return false;
+      }
+      connector.connection = c->connection;
+      if (c->count_modes > 0) {
+        memcpy(&connector.mMode, &c->modes[0], sizeof(drmModeModeInfo));
+        drmModeCreatePropertyBlob(mFd.get(), &connector.mMode,
+                                  sizeof(connector.mMode),
+                                  &connector.mModeBlobId);
+
+        // Dots per 1000 inches
+        connector.dpiX =
+            c->mmWidth ? (c->modes[0].hdisplay * kUmPerInch) / (c->mmWidth)
+                       : -1;
+        // Dots per 1000 inches
+        connector.dpiY =
+            c->mmHeight ? (c->modes[0].vdisplay * kUmPerInch) / (c->mmHeight)
+                        : -1;
+      }
+      ALOGD("%s connector %" PRIu32 " dpiX %" PRIi32 " dpiY %" PRIi32
+            " connection %d",
+            __FUNCTION__, connector.mId, connector.dpiX, connector.dpiY,
+            connector.connection);
+
+      drmModeFreeConnector(c);
+
+      connector.mRefreshRateAsFloat =
+          1000.0f * connector.mMode.clock /
+          ((float)connector.mMode.vtotal * (float)connector.mMode.htotal);
+      connector.mRefreshRateAsInteger =
+          (uint32_t)(connector.mRefreshRateAsFloat + 0.5f);
+    }
+
+    mConnectors.push_back(connector);
+  }
+
+  drmModeFreeResources(res);
+  return true;
+}
+
+void DrmPresenter::resetDrmElementsLocked() {
+  for (auto& c : mConnectors) {
+    if (c.mModeBlobId) {
+      if (drmModeDestroyPropertyBlob(mFd.get(), c.mModeBlobId)) {
+        ALOGE("%s: Error destroy PropertyBlob %" PRIu32, __func__,
+              c.mModeBlobId);
+      }
+    }
+  }
+  mConnectors.clear();
+  mCrtcs.clear();
+  mPlanes.clear();
+}
+
+int DrmPresenter::getDrmFB(hwc_drm_bo_t& bo) {
+  int ret = drmPrimeFDToHandle(mFd.get(), bo.prime_fds[0], &bo.gem_handles[0]);
+  if (ret) {
+    ALOGE("%s: drmPrimeFDToHandle failed: %s (errno %d)", __FUNCTION__,
+          strerror(errno), errno);
+    return -1;
+  }
+  ret = drmModeAddFB2(mFd.get(), bo.width, bo.height, bo.format, bo.gem_handles,
+                      bo.pitches, bo.offsets, &bo.fb_id, 0);
+  if (ret) {
+    ALOGE("%s: drmModeAddFB2 failed: %s (errno %d)", __FUNCTION__,
+          strerror(errno), errno);
+    return -1;
+  }
+  return 0;
+}
+
+int DrmPresenter::clearDrmFB(hwc_drm_bo_t& bo) {
+  int ret = 0;
+  if (bo.fb_id) {
+    if (drmModeRmFB(mFd.get(), bo.fb_id)) {
+      ALOGE("%s: drmModeRmFB failed: %s (errno %d)", __FUNCTION__,
+            strerror(errno), errno);
+    }
+    ret = -1;
+  }
+  if (bo.gem_handles[0]) {
+    struct drm_gem_close gem_close = {};
+    gem_close.handle = bo.gem_handles[0];
+    if (drmIoctl(mFd.get(), DRM_IOCTL_GEM_CLOSE, &gem_close)) {
+      ALOGE("%s: DRM_IOCTL_GEM_CLOSE failed: %s (errno %d)", __FUNCTION__,
+            strerror(errno), errno);
+    }
+    ret = -1;
+  }
+  ALOGV("%s: drm FB %d", __FUNCTION__, bo.fb_id);
+  return ret;
+}
+
+bool DrmPresenter::handleHotplug() {
+  std::vector<DrmConnector> oldConnectors(mConnectors);
+  {
+    AutoReadLock lock(mStateMutex);
+    oldConnectors.assign(mConnectors.begin(), mConnectors.end());
+  }
+  {
+    AutoWriteLock lock(mStateMutex);
+    resetDrmElementsLocked();
+    if (!initDrmElementsLocked()) {
+      ALOGE(
+          "%s: failed to initialize drm elements during hotplug. Displays may "
+          "not function correctly!",
+          __FUNCTION__);
+      return false;
+    }
+  }
+
+  AutoReadLock lock(mStateMutex);
+  for (int i = 0; i < mConnectors.size(); i++) {
+    bool changed =
+        oldConnectors[i].dpiX != mConnectors[i].dpiX ||
+        oldConnectors[i].dpiY != mConnectors[i].dpiY ||
+        oldConnectors[i].connection != mConnectors[i].connection ||
+        oldConnectors[i].mMode.hdisplay != mConnectors[i].mMode.hdisplay ||
+        oldConnectors[i].mMode.vdisplay != mConnectors[i].mMode.vdisplay;
+    if (changed) {
+      if (i == 0) {
+        ALOGE(
+            "%s: Ignoring changes to display:0 which is not configurable by "
+            "multi-display interface.",
+            __FUNCTION__);
+        continue;
+      }
+
+      bool connected =
+          mConnectors[i].connection == DRM_MODE_CONNECTED ? true : false;
+      if (mHotplugCallback) {
+        mHotplugCallback(connected, i, mConnectors[i].mMode.hdisplay,
+                         mConnectors[i].mMode.vdisplay, mConnectors[i].dpiX,
+                         mConnectors[i].dpiY,
+                         mConnectors[i].mRefreshRateAsInteger);
+      }
+    }
+  }
+  return true;
+}
+
+HWC2::Error DrmPresenter::flushToDisplay(int display, hwc_drm_bo_t& bo,
+                                         int* outSyncFd) {
+  AutoReadLock lock(mStateMutex);
+
+  DrmConnector& connector = mConnectors[display];
+  DrmCrtc& crtc = mCrtcs[display];
+
+  HWC2::Error error = HWC2::Error::None;
+
+  *outSyncFd = -1;
+
+  drmModeAtomicReqPtr pset = drmModeAtomicAlloc();
+
+  int ret;
+
+  if (!crtc.mDidSetCrtc) {
+    DEBUG_LOG("%s: Setting crtc.\n", __FUNCTION__);
+    ret = drmModeAtomicAddProperty(pset, crtc.mId, crtc.mActivePropertyId, 1);
+    if (ret < 0) {
+      ALOGE("%s:%d: failed %d errno %d\n", __FUNCTION__, __LINE__, ret, errno);
+    }
+    ret = drmModeAtomicAddProperty(pset, crtc.mId, crtc.mModePropertyId,
+                                   connector.mModeBlobId);
+    if (ret < 0) {
+      ALOGE("%s:%d: failed %d errno %d\n", __FUNCTION__, __LINE__, ret, errno);
+    }
+    ret = drmModeAtomicAddProperty(pset, connector.mId,
+                                   connector.mCrtcPropertyId, crtc.mId);
+    if (ret < 0) {
+      ALOGE("%s:%d: failed %d errno %d\n", __FUNCTION__, __LINE__, ret, errno);
+    }
+
+    crtc.mDidSetCrtc = true;
+  } else {
+    DEBUG_LOG("%s: Already set crtc\n", __FUNCTION__);
+  }
+
+  uint64_t outSyncFdUint = (uint64_t)outSyncFd;
+
+  ret = drmModeAtomicAddProperty(pset, crtc.mId, crtc.mFencePropertyId,
+                                 outSyncFdUint);
+  if (ret < 0) {
+    ALOGE("%s:%d: failed %d errno %d\n", __FUNCTION__, __LINE__, ret, errno);
+  }
+
+  if (crtc.mPlaneId == -1) {
+    ALOGE("%s:%d: no plane available for crtc id %" PRIu32, __FUNCTION__,
+          __LINE__, crtc.mId);
+    return HWC2::Error::NoResources;
+  }
+
+  DrmPlane& plane = mPlanes[crtc.mPlaneId];
+
+  DEBUG_LOG("%s: set plane: plane id %d crtc id %d fbid %d bo w h %d %d\n",
+            __FUNCTION__, plane.mId, crtc.mId, bo.fb_id, bo.width, bo.height);
+
+  ret = drmModeAtomicAddProperty(pset, plane.mId, plane.mCrtcPropertyId,
+                                 crtc.mId);
+  if (ret < 0) {
+    ALOGE("%s:%d: failed %d errno %d\n", __FUNCTION__, __LINE__, ret, errno);
+  }
+  ret =
+      drmModeAtomicAddProperty(pset, plane.mId, plane.mFbPropertyId, bo.fb_id);
+  if (ret < 0) {
+    ALOGE("%s:%d: failed %d errno %d\n", __FUNCTION__, __LINE__, ret, errno);
+  }
+  ret = drmModeAtomicAddProperty(pset, plane.mId, plane.mCrtcXPropertyId, 0);
+  if (ret < 0) {
+    ALOGE("%s:%d: failed %d errno %d\n", __FUNCTION__, __LINE__, ret, errno);
+  }
+  ret = drmModeAtomicAddProperty(pset, plane.mId, plane.mCrtcYPropertyId, 0);
+  if (ret < 0) {
+    ALOGE("%s:%d: failed %d errno %d\n", __FUNCTION__, __LINE__, ret, errno);
+  }
+  ret = drmModeAtomicAddProperty(pset, plane.mId, plane.mCrtcWPropertyId,
+                                 bo.width);
+  if (ret < 0) {
+    ALOGE("%s:%d: failed %d errno %d\n", __FUNCTION__, __LINE__, ret, errno);
+  }
+  ret = drmModeAtomicAddProperty(pset, plane.mId, plane.mCrtcHPropertyId,
+                                 bo.height);
+  if (ret < 0) {
+    ALOGE("%s:%d: failed %d errno %d\n", __FUNCTION__, __LINE__, ret, errno);
+  }
+  ret = drmModeAtomicAddProperty(pset, plane.mId, plane.mSrcXPropertyId, 0);
+  if (ret < 0) {
+    ALOGE("%s:%d: failed %d errno %d\n", __FUNCTION__, __LINE__, ret, errno);
+  }
+  ret = drmModeAtomicAddProperty(pset, plane.mId, plane.mSrcYPropertyId, 0);
+  if (ret < 0) {
+    ALOGE("%s:%d: failed %d errno %d\n", __FUNCTION__, __LINE__, ret, errno);
+  }
+  ret = drmModeAtomicAddProperty(pset, plane.mId, plane.mSrcWPropertyId,
+                                 bo.width << 16);
+  if (ret < 0) {
+    ALOGE("%s:%d: failed %d errno %d\n", __FUNCTION__, __LINE__, ret, errno);
+  }
+  ret = drmModeAtomicAddProperty(pset, plane.mId, plane.mSrcHPropertyId,
+                                 bo.height << 16);
+  if (ret < 0) {
+    ALOGE("%s:%d: failed %d errno %d\n", __FUNCTION__, __LINE__, ret, errno);
+  }
+
+  uint32_t flags = DRM_MODE_ATOMIC_ALLOW_MODESET;
+  ret = drmModeAtomicCommit(mFd.get(), pset, flags, 0);
+
+  if (ret) {
+    ALOGE("%s: Atomic commit failed with %d %d\n", __FUNCTION__, ret, errno);
+    error = HWC2::Error::NoResources;
+  }
+
+  if (pset) {
+    drmModeAtomicFree(pset);
+  }
+
+  DEBUG_LOG("%s: out fence: %d\n", __FUNCTION__, *outSyncFd);
+  return error;
+}
+
+std::optional<std::vector<uint8_t>> DrmPresenter::getEdid(uint32_t id) {
+  AutoReadLock lock(mStateMutex);
+
+  if (mConnectors[id].mEdidBlobId == -1) {
+    ALOGW("%s: EDID not supported", __func__);
+    return std::nullopt;
+  }
+  drmModePropertyBlobPtr blob = drmModeGetPropertyBlob(mFd.get(),
+                                                       mConnectors[id].mEdidBlobId);
+  if (!blob) {
+    ALOGE("%s: fail to read EDID from DRM", __func__);
+    return std::nullopt;
+  }
+
+  std::vector<uint8_t> edid;
+  uint8_t* start = static_cast<uint8_t*>(blob->data);
+  edid.insert(edid.begin(), start, start + blob->length);
+
+  drmModeFreePropertyBlob(blob);
+
+  return edid;
+}
+
+DrmBuffer::DrmBuffer(const native_handle_t* handle, DrmPresenter& DrmPresenter)
+    : mDrmPresenter(DrmPresenter), mBo({}) {
+  if (!convertBoInfo(handle)) {
+    mDrmPresenter.getDrmFB(mBo);
+  }
+}
+
+DrmBuffer::~DrmBuffer() { mDrmPresenter.clearDrmFB(mBo); }
+
+int DrmBuffer::convertBoInfo(const native_handle_t* handle) {
+  cros_gralloc_handle* gr_handle = (cros_gralloc_handle*)handle;
+  if (!gr_handle) {
+    ALOGE("%s: Null buffer handle", __FUNCTION__);
+    return -1;
+  }
+  mBo.width = gr_handle->width;
+  mBo.height = gr_handle->height;
+  mBo.hal_format = gr_handle->droid_format;
+  mBo.format = gr_handle->format;
+  mBo.usage = gr_handle->usage;
+  mBo.prime_fds[0] = gr_handle->fds[0];
+  mBo.pitches[0] = gr_handle->strides[0];
+  return 0;
+}
+
+HWC2::Error DrmBuffer::flushToDisplay(int display, int* outFlushDoneSyncFd) {
+  return mDrmPresenter.flushToDisplay(display, mBo, outFlushDoneSyncFd);
+}
+
+DrmPresenter::DrmEventListener::DrmEventListener(DrmPresenter& presenter)
+    : mPresenter(presenter) {}
+
+DrmPresenter::DrmEventListener::~DrmEventListener() {}
+
+bool DrmPresenter::DrmEventListener::init() {
+  mEventFd = android::base::unique_fd(
+      socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT));
+  if (!mEventFd.ok()) {
+    ALOGE("Failed to open uevent socket: %s", strerror(errno));
+    return false;
+  }
+  struct sockaddr_nl addr;
+  memset(&addr, 0, sizeof(addr));
+  addr.nl_family = AF_NETLINK;
+  addr.nl_pid = 0;
+  addr.nl_groups = 0xFFFFFFFF;
+
+  int ret = bind(mEventFd, (struct sockaddr*)&addr, sizeof(addr));
+  if (ret) {
+    ALOGE("Failed to bind uevent socket: %s", strerror(errno));
+    return false;
+  }
+
+  FD_ZERO(&mMonitoredFds);
+  FD_SET(mPresenter.mFd.get(), &mMonitoredFds);
+  FD_SET(mEventFd.get(), &mMonitoredFds);
+  mMaxFd = std::max(mPresenter.mFd.get(), mEventFd.get());
+
+  return true;
+}
+
+bool DrmPresenter::DrmEventListener::threadLoop() {
+  int ret;
+  do {
+    ret = select(mMaxFd + 1, &mMonitoredFds, NULL, NULL, NULL);
+  } while (ret == -1 && errno == EINTR);
+
+  // if (FD_ISSET(mPresenter.mFd, &mFds)) {
+  //   TODO: handle drm related events
+  // }
+
+  if (FD_ISSET(mEventFd.get(), &mMonitoredFds)) {
+    eventThreadLoop();
+  }
+  return true;
+}
+
+void DrmPresenter::DrmEventListener::eventThreadLoop() {
+  char buffer[1024];
+  int ret;
+
+  struct timespec ts;
+  uint64_t timestamp = 0;
+  ret = clock_gettime(CLOCK_MONOTONIC, &ts);
+  if (!ret) {
+    timestamp = ts.tv_sec * 1000 * 1000 * 1000 + ts.tv_nsec;
+  } else {
+    ALOGE("Failed to get monotonic clock on hotplug %d", ret);
+  }
+
+  while (true) {
+    ret = read(mEventFd.get(), &buffer, sizeof(buffer));
+    if (ret == 0) {
+      return;
+    } else if (ret < 0) {
+      ALOGE("Got error reading uevent %d", ret);
+      return;
+    }
+
+    bool drmEvent = false, hotplugEvent = false;
+    for (int i = 0; i < ret;) {
+      char* event = buffer + i;
+      if (strcmp(event, "DEVTYPE=drm_minor")) {
+        drmEvent = true;
+      } else if (strcmp(event, "HOTPLUG=1")) {
+        hotplugEvent = true;
+      }
+
+      i += strlen(event) + 1;
+    }
+
+    if (drmEvent && hotplugEvent) {
+      processHotplug(timestamp);
+    }
+  }
+}
+
+void DrmPresenter::DrmEventListener::processHotplug(uint64_t timestamp) {
+  ALOGD("DrmEventListener detected hotplug event %" PRIu64, timestamp);
+  mPresenter.handleHotplug();
+}
+}  // namespace android
diff --git a/system/hwc2/DrmPresenter.h b/system/hwc2/DrmPresenter.h
new file mode 100644
index 0000000..7f9edb2
--- /dev/null
+++ b/system/hwc2/DrmPresenter.h
@@ -0,0 +1,167 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_HWC_DRMPRESENTER_H
+#define ANDROID_HWC_DRMPRESENTER_H
+
+#include <android-base/unique_fd.h>
+#include <include/drmhwcgralloc.h>
+#include <utils/Thread.h>
+#include <xf86drm.h>
+#include <xf86drmMode.h>
+
+#include <map>
+#include <memory>
+#include <vector>
+
+#include "Common.h"
+#include "android/base/synchronization/AndroidLock.h"
+
+namespace android {
+
+class DrmBuffer;
+class DrmPresenter;
+
+// A RAII object that will clear a drm framebuffer upon destruction.
+class DrmBuffer {
+ public:
+  DrmBuffer(const native_handle_t* handle, DrmPresenter& drmPresenter);
+  ~DrmBuffer();
+
+  DrmBuffer(const DrmBuffer&) = delete;
+  DrmBuffer& operator=(const DrmBuffer&) = delete;
+
+  DrmBuffer(DrmBuffer&&) = delete;
+  DrmBuffer& operator=(DrmBuffer&&) = delete;
+
+  HWC2::Error flushToDisplay(int display, int* outFlushDoneSyncFd);
+
+ private:
+  int convertBoInfo(const native_handle_t* handle);
+
+  DrmPresenter& mDrmPresenter;
+  hwc_drm_bo_t mBo;
+};
+
+class DrmPresenter {
+ public:
+  DrmPresenter() = default;
+  ~DrmPresenter() = default;
+
+  DrmPresenter(const DrmPresenter&) = delete;
+  DrmPresenter& operator=(const DrmPresenter&) = delete;
+
+  DrmPresenter(DrmPresenter&&) = delete;
+  DrmPresenter& operator=(DrmPresenter&&) = delete;
+
+  using HotplugCallback = std::function<void(
+      bool /*connected*/, uint32_t /*id*/, uint32_t /*width*/,
+      uint32_t /*height*/, uint32_t /*dpiX*/, uint32_t /*dpiY*/,
+      uint32_t /*refreshRate*/)>;
+
+  bool init(const HotplugCallback& cb);
+
+  uint32_t refreshRate() const { return mConnectors[0].mRefreshRateAsInteger; }
+
+  HWC2::Error flushToDisplay(int display, hwc_drm_bo_t& fb, int* outSyncFd);
+
+  std::optional<std::vector<uint8_t>> getEdid(uint32_t id);
+
+ private:
+  // Grant visibility for getDrmFB and clearDrmFB to DrmBuffer.
+  friend class DrmBuffer;
+  int getDrmFB(hwc_drm_bo_t& bo);
+  int clearDrmFB(hwc_drm_bo_t& bo);
+
+  // Grant visibility for handleHotplug to DrmEventListener.
+  bool handleHotplug();
+
+  bool initDrmElementsLocked();
+  void resetDrmElementsLocked();
+
+  // Drm device.
+  android::base::unique_fd mFd;
+
+  HotplugCallback mHotplugCallback;
+
+  // Protects access to the below drm structs.
+  android::base::guest::ReadWriteLock mStateMutex;
+
+  struct DrmPlane {
+    uint32_t mId = -1;
+    uint32_t mCrtcPropertyId = -1;
+    uint32_t mFbPropertyId = -1;
+    uint32_t mCrtcXPropertyId = -1;
+    uint32_t mCrtcYPropertyId = -1;
+    uint32_t mCrtcWPropertyId = -1;
+    uint32_t mCrtcHPropertyId = -1;
+    uint32_t mSrcXPropertyId = -1;
+    uint32_t mSrcYPropertyId = -1;
+    uint32_t mSrcWPropertyId = -1;
+    uint32_t mSrcHPropertyId = -1;
+    uint32_t mTypePropertyId = -1;
+    uint64_t mType = -1;
+  };
+  std::map<uint32_t, DrmPlane> mPlanes;
+
+  struct DrmCrtc {
+    uint32_t mId = -1;
+    uint32_t mActivePropertyId = -1;
+    uint32_t mModePropertyId = -1;
+    uint32_t mFencePropertyId = -1;
+    uint32_t mPlaneId = -1;
+
+    bool mDidSetCrtc = false;
+  };
+  std::vector<DrmCrtc> mCrtcs;
+
+  struct DrmConnector {
+    uint32_t mId = -1;
+    uint32_t mCrtcPropertyId = -1;
+    drmModeModeInfo mMode;
+    int32_t dpiX;
+    int32_t dpiY;
+    drmModeConnection connection;
+    uint32_t mModeBlobId = 0;
+    float mRefreshRateAsFloat;
+    uint32_t mRefreshRateAsInteger;
+    uint64_t mEdidBlobId = -1;
+  };
+  std::vector<DrmConnector> mConnectors;
+
+  class DrmEventListener : public Thread {
+   public:
+    DrmEventListener(DrmPresenter& presenter);
+    virtual ~DrmEventListener();
+
+    bool init();
+
+   private:
+    bool threadLoop() final;
+    void eventThreadLoop();
+    void processHotplug(uint64_t timestamp);
+
+    DrmPresenter& mPresenter;
+    android::base::unique_fd mEventFd;
+    int mMaxFd;
+    fd_set mMonitoredFds;
+  };
+  android::sp<DrmEventListener> mDrmEventListener;
+};
+
+}  // namespace android
+
+#endif
diff --git a/system/hwc2/EmuHWC2.cpp b/system/hwc2/EmuHWC2.cpp
deleted file mode 100644
index 5faec36..0000000
--- a/system/hwc2/EmuHWC2.cpp
+++ /dev/null
@@ -1,2226 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "EmuHWC2.h"
-//#define LOG_NDEBUG 0
-//#define LOG_NNDEBUG 0
-#undef LOG_TAG
-#define LOG_TAG "EmuHWC2"
-
-#include <errno.h>
-#include <cutils/properties.h>
-#include <log/log.h>
-#include <sync/sync.h>
-
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-#include <ui/GraphicBuffer.h>
-#include <ui/GraphicBufferAllocator.h>
-#include <ui/GraphicBufferMapper.h>
-
-#include "cros_gralloc_handle.h"
-#include "../egl/goldfish_sync.h"
-
-#include "ThreadInfo.h"
-
-#include <drm/virtgpu_drm.h>
-#include <xf86drm.h>
-#include <poll.h>
-
-#if defined(LOG_NNDEBUG) && LOG_NNDEBUG == 0
-#define ALOGVV ALOGV
-#else
-#define ALOGVV(...) ((void)0)
-#endif
-
-template <typename PFN, typename T>
-static hwc2_function_pointer_t asFP(T function)
-{
-    static_assert(std::is_same<PFN, T>::value, "Incompatible function pointer");
-    return reinterpret_cast<hwc2_function_pointer_t>(function);
-}
-
-static std::unique_ptr<HostConnection> sHostCon;
-
-static HostConnection* createOrGetHostConnection() {
-    if (!sHostCon) {
-        sHostCon = HostConnection::createUnique();
-    }
-    return sHostCon.get();
-}
-
-#define DEFINE_AND_VALIDATE_HOST_CONNECTION \
-    HostConnection *hostCon = createOrGetHostConnection(); \
-    if (!hostCon) { \
-        ALOGE("EmuHWC2: Failed to get host connection\n"); \
-        return Error::NoResources; \
-    } \
-    ExtendedRCEncoderContext *rcEnc = hostCon->rcEncoder(); \
-    if (!rcEnc) { \
-        ALOGE("EmuHWC2: Failed to get renderControl encoder context\n"); \
-        return Error::NoResources; \
-    }
-
-using namespace HWC2;
-
-namespace android {
-
-EmuHWC2::EmuHWC2()
-  : mStateMutex()
-{
-    common.tag = HARDWARE_DEVICE_TAG;
-    common.version = HWC_DEVICE_API_VERSION_2_0;
-    common.close = closeHook;
-    getCapabilities = getCapabilitiesHook;
-    getFunction = getFunctionHook;
-    populateCapabilities();
-    initDisplayParameters();
-}
-
-Error EmuHWC2::initDisplayParameters() {
-    DEFINE_AND_VALIDATE_HOST_CONNECTION
-    hostCon->lock();
-
-    mDisplayWidth = rcEnc->rcGetFBParam(rcEnc, FB_WIDTH);
-    mDisplayHeight = rcEnc->rcGetFBParam(rcEnc, FB_HEIGHT);
-    mDisplayDpiX = rcEnc->rcGetFBParam(rcEnc, FB_XDPI);
-    mDisplayDpiY = rcEnc->rcGetFBParam(rcEnc, FB_YDPI);
-
-    hostCon->unlock();
-
-    return HWC2::Error::None;
-}
-
-void EmuHWC2::doGetCapabilities(uint32_t* outCount, int32_t* outCapabilities) {
-    if (outCapabilities == nullptr) {
-        *outCount = mCapabilities.size();
-        return;
-    }
-
-    auto capabilityIter = mCapabilities.cbegin();
-    for (size_t i = 0; i < *outCount; ++i) {
-        if (capabilityIter == mCapabilities.cend()) {
-            return;
-        }
-        outCapabilities[i] = static_cast<int32_t>(*capabilityIter);
-        ++capabilityIter;
-    }
-}
-
-hwc2_function_pointer_t EmuHWC2::doGetFunction(
-        FunctionDescriptor descriptor) {
-    switch(descriptor) {
-        case FunctionDescriptor::CreateVirtualDisplay:
-            return asFP<HWC2_PFN_CREATE_VIRTUAL_DISPLAY>(
-                    createVirtualDisplayHook);
-        case FunctionDescriptor::DestroyVirtualDisplay:
-            return asFP<HWC2_PFN_DESTROY_VIRTUAL_DISPLAY>(
-                    destroyVirtualDisplayHook);
-        case FunctionDescriptor::Dump:
-            return asFP<HWC2_PFN_DUMP>(dumpHook);
-        case FunctionDescriptor::GetMaxVirtualDisplayCount:
-            return asFP<HWC2_PFN_GET_MAX_VIRTUAL_DISPLAY_COUNT>(
-                    getMaxVirtualDisplayCountHook);
-        case FunctionDescriptor::RegisterCallback:
-            return asFP<HWC2_PFN_REGISTER_CALLBACK>(registerCallbackHook);
-
-            // Display functions
-        case FunctionDescriptor::AcceptDisplayChanges:
-            return asFP<HWC2_PFN_ACCEPT_DISPLAY_CHANGES>(
-                    displayHook<decltype(&Display::acceptChanges),
-                    &Display::acceptChanges>);
-        case FunctionDescriptor::CreateLayer:
-            return asFP<HWC2_PFN_CREATE_LAYER>(
-                    displayHook<decltype(&Display::createLayer),
-                    &Display::createLayer, hwc2_layer_t*>);
-        case FunctionDescriptor::DestroyLayer:
-            return asFP<HWC2_PFN_DESTROY_LAYER>(
-                    displayHook<decltype(&Display::destroyLayer),
-                    &Display::destroyLayer, hwc2_layer_t>);
-        case FunctionDescriptor::GetActiveConfig:
-            return asFP<HWC2_PFN_GET_ACTIVE_CONFIG>(
-                    displayHook<decltype(&Display::getActiveConfig),
-                    &Display::getActiveConfig, hwc2_config_t*>);
-        case FunctionDescriptor::GetChangedCompositionTypes:
-            return asFP<HWC2_PFN_GET_CHANGED_COMPOSITION_TYPES>(
-                    displayHook<decltype(&Display::getChangedCompositionTypes),
-                    &Display::getChangedCompositionTypes, uint32_t*,
-                    hwc2_layer_t*, int32_t*>);
-        case FunctionDescriptor::GetColorModes:
-            return asFP<HWC2_PFN_GET_COLOR_MODES>(
-                    displayHook<decltype(&Display::getColorModes),
-                    &Display::getColorModes, uint32_t*, int32_t*>);
-        case FunctionDescriptor::GetDisplayAttribute:
-            return asFP<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
-                    displayHook<decltype(&Display::getDisplayAttribute),
-                    &Display::getDisplayAttribute, hwc2_config_t,
-                    int32_t, int32_t*>);
-        case FunctionDescriptor::GetDisplayConfigs:
-            return asFP<HWC2_PFN_GET_DISPLAY_CONFIGS>(
-                    displayHook<decltype(&Display::getConfigs),
-                    &Display::getConfigs, uint32_t*, hwc2_config_t*>);
-        case FunctionDescriptor::GetDisplayName:
-            return asFP<HWC2_PFN_GET_DISPLAY_NAME>(
-                    displayHook<decltype(&Display::getName),
-                    &Display::getName, uint32_t*, char*>);
-        case FunctionDescriptor::GetDisplayRequests:
-            return asFP<HWC2_PFN_GET_DISPLAY_REQUESTS>(
-                    displayHook<decltype(&Display::getRequests),
-                    &Display::getRequests, int32_t*, uint32_t*, hwc2_layer_t*,
-                    int32_t*>);
-        case FunctionDescriptor::GetDisplayType:
-            return asFP<HWC2_PFN_GET_DISPLAY_TYPE>(
-                    displayHook<decltype(&Display::getType),
-                    &Display::getType, int32_t*>);
-        case FunctionDescriptor::GetDozeSupport:
-            return asFP<HWC2_PFN_GET_DOZE_SUPPORT>(
-                    displayHook<decltype(&Display::getDozeSupport),
-                    &Display::getDozeSupport, int32_t*>);
-        case FunctionDescriptor::GetHdrCapabilities:
-            return asFP<HWC2_PFN_GET_HDR_CAPABILITIES>(
-                    displayHook<decltype(&Display::getHdrCapabilities),
-                    &Display::getHdrCapabilities, uint32_t*, int32_t*, float*,
-                    float*, float*>);
-        case FunctionDescriptor::GetReleaseFences:
-            return asFP<HWC2_PFN_GET_RELEASE_FENCES>(
-                    displayHook<decltype(&Display::getReleaseFences),
-                    &Display::getReleaseFences, uint32_t*, hwc2_layer_t*,
-                    int32_t*>);
-        case FunctionDescriptor::PresentDisplay:
-            return asFP<HWC2_PFN_PRESENT_DISPLAY>(
-                    displayHook<decltype(&Display::present),
-                    &Display::present, int32_t*>);
-        case FunctionDescriptor::SetActiveConfig:
-            return asFP<HWC2_PFN_SET_ACTIVE_CONFIG>(
-                    displayHook<decltype(&Display::setActiveConfig),
-                    &Display::setActiveConfig, hwc2_config_t>);
-        case FunctionDescriptor::SetClientTarget:
-            return asFP<HWC2_PFN_SET_CLIENT_TARGET>(
-                    displayHook<decltype(&Display::setClientTarget),
-                    &Display::setClientTarget, buffer_handle_t, int32_t,
-                    int32_t, hwc_region_t>);
-        case FunctionDescriptor::SetColorMode:
-            return asFP<HWC2_PFN_SET_COLOR_MODE>(
-                    displayHook<decltype(&Display::setColorMode),
-                    &Display::setColorMode, int32_t>);
-        case FunctionDescriptor::SetColorTransform:
-            return asFP<HWC2_PFN_SET_COLOR_TRANSFORM>(
-                    displayHook<decltype(&Display::setColorTransform),
-                    &Display::setColorTransform, const float*, int32_t>);
-        case FunctionDescriptor::SetOutputBuffer:
-            return asFP<HWC2_PFN_SET_OUTPUT_BUFFER>(
-                    displayHook<decltype(&Display::setOutputBuffer),
-                    &Display::setOutputBuffer, buffer_handle_t, int32_t>);
-        case FunctionDescriptor::SetPowerMode:
-            return asFP<HWC2_PFN_SET_POWER_MODE>(
-                    displayHook<decltype(&Display::setPowerMode),
-                    &Display::setPowerMode, int32_t>);
-        case FunctionDescriptor::SetVsyncEnabled:
-            return asFP<HWC2_PFN_SET_VSYNC_ENABLED>(
-                    displayHook<decltype(&Display::setVsyncEnabled),
-                    &Display::setVsyncEnabled, int32_t>);
-        case FunctionDescriptor::ValidateDisplay:
-            return asFP<HWC2_PFN_VALIDATE_DISPLAY>(
-                    displayHook<decltype(&Display::validate),
-                    &Display::validate, uint32_t*, uint32_t*>);
-        case FunctionDescriptor::GetClientTargetSupport:
-            return asFP<HWC2_PFN_GET_CLIENT_TARGET_SUPPORT>(
-                    displayHook<decltype(&Display::getClientTargetSupport),
-                    &Display::getClientTargetSupport, uint32_t, uint32_t,
-                                                      int32_t, int32_t>);
-        // 2.3 required functions
-        case FunctionDescriptor::GetDisplayIdentificationData:
-            return asFP<HWC2_PFN_GET_DISPLAY_IDENTIFICATION_DATA>(
-                    displayHook<decltype(&Display::getDisplayIdentificationData),
-                    &Display::getDisplayIdentificationData, uint8_t*, uint32_t*, uint8_t*>);
-        case FunctionDescriptor::GetDisplayCapabilities:
-            return asFP<HWC2_PFN_GET_DISPLAY_CAPABILITIES>(
-                    displayHook<decltype(&Display::getDisplayCapabilities),
-                    &Display::getDisplayCapabilities, uint32_t*, uint32_t*>);
-        case FunctionDescriptor::GetDisplayBrightnessSupport:
-            return asFP<HWC2_PFN_GET_DISPLAY_BRIGHTNESS_SUPPORT>(
-                    displayHook<decltype(&Display::getDisplayBrightnessSupport),
-                    &Display::getDisplayBrightnessSupport, bool*>);
-        case FunctionDescriptor::SetDisplayBrightness:
-            return asFP<HWC2_PFN_SET_DISPLAY_BRIGHTNESS>(
-                    displayHook<decltype(&Display::setDisplayBrightness),
-                    &Display::setDisplayBrightness, float>);
-        // Layer functions
-        case FunctionDescriptor::SetCursorPosition:
-            return asFP<HWC2_PFN_SET_CURSOR_POSITION>(
-                    layerHook<decltype(&Layer::setCursorPosition),
-                    &Layer::setCursorPosition, int32_t, int32_t>);
-        case FunctionDescriptor::SetLayerBuffer:
-            return asFP<HWC2_PFN_SET_LAYER_BUFFER>(
-                    layerHook<decltype(&Layer::setBuffer), &Layer::setBuffer,
-                    buffer_handle_t, int32_t>);
-        case FunctionDescriptor::SetLayerSurfaceDamage:
-            return asFP<HWC2_PFN_SET_LAYER_SURFACE_DAMAGE>(
-                    layerHook<decltype(&Layer::setSurfaceDamage),
-                    &Layer::setSurfaceDamage, hwc_region_t>);
-
-        // Layer state functions
-        case FunctionDescriptor::SetLayerBlendMode:
-            return asFP<HWC2_PFN_SET_LAYER_BLEND_MODE>(
-                    layerHook<decltype(&Layer::setBlendMode),
-                    &Layer::setBlendMode, int32_t>);
-        case FunctionDescriptor::SetLayerColor:
-            return asFP<HWC2_PFN_SET_LAYER_COLOR>(
-                    layerHook<decltype(&Layer::setColor), &Layer::setColor,
-                    hwc_color_t>);
-        case FunctionDescriptor::SetLayerCompositionType:
-            return asFP<HWC2_PFN_SET_LAYER_COMPOSITION_TYPE>(
-                    layerHook<decltype(&Layer::setCompositionType),
-                    &Layer::setCompositionType, int32_t>);
-        case FunctionDescriptor::SetLayerDataspace:
-            return asFP<HWC2_PFN_SET_LAYER_DATASPACE>(
-                    layerHook<decltype(&Layer::setDataspace),
-                    &Layer::setDataspace, int32_t>);
-        case FunctionDescriptor::SetLayerDisplayFrame:
-            return asFP<HWC2_PFN_SET_LAYER_DISPLAY_FRAME>(
-                    layerHook<decltype(&Layer::setDisplayFrame),
-                    &Layer::setDisplayFrame, hwc_rect_t>);
-        case FunctionDescriptor::SetLayerPlaneAlpha:
-            return asFP<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(
-                    layerHook<decltype(&Layer::setPlaneAlpha),
-                    &Layer::setPlaneAlpha, float>);
-        case FunctionDescriptor::SetLayerSidebandStream:
-            return asFP<HWC2_PFN_SET_LAYER_SIDEBAND_STREAM>(
-                    layerHook<decltype(&Layer::setSidebandStream),
-                    &Layer::setSidebandStream, const native_handle_t*>);
-        case FunctionDescriptor::SetLayerSourceCrop:
-            return asFP<HWC2_PFN_SET_LAYER_SOURCE_CROP>(
-                    layerHook<decltype(&Layer::setSourceCrop),
-                    &Layer::setSourceCrop, hwc_frect_t>);
-        case FunctionDescriptor::SetLayerTransform:
-            return asFP<HWC2_PFN_SET_LAYER_TRANSFORM>(
-                    layerHook<decltype(&Layer::setTransform),
-                    &Layer::setTransform, int32_t>);
-        case FunctionDescriptor::SetLayerVisibleRegion:
-            return asFP<HWC2_PFN_SET_LAYER_VISIBLE_REGION>(
-                    layerHook<decltype(&Layer::setVisibleRegion),
-                    &Layer::setVisibleRegion, hwc_region_t>);
-        case FunctionDescriptor::SetLayerZOrder:
-            return asFP<HWC2_PFN_SET_LAYER_Z_ORDER>(
-                    displayHook<decltype(&Display::updateLayerZ),
-                    &Display::updateLayerZ, hwc2_layer_t, uint32_t>);
-
-        default:
-            ALOGE("doGetFunction: Unknown function descriptor: %d (%s)",
-                    static_cast<int32_t>(descriptor),
-                    to_string(descriptor).c_str());
-            return nullptr;
-    }
-}
-
-
-// Device functions
-
-Error EmuHWC2::createVirtualDisplay(uint32_t /*width*/, uint32_t /*height*/,
-        int32_t* /*format*/, hwc2_display_t* /*outDisplay*/) {
-    ALOGVV("%s", __FUNCTION__);
-    //TODO: VirtualDisplay support
-    return Error::None;
-}
-
-Error EmuHWC2::destroyVirtualDisplay(hwc2_display_t /*displayId*/) {
-    ALOGVV("%s", __FUNCTION__);
-    //TODO: VirtualDisplay support
-    return Error::None;
-}
-
-void EmuHWC2::dump(uint32_t* /*outSize*/, char* /*outBuffer*/) {
-    ALOGVV("%s", __FUNCTION__);
-    //TODO:
-    return;
-}
-
-uint32_t EmuHWC2::getMaxVirtualDisplayCount() {
-    ALOGVV("%s", __FUNCTION__);
-    //TODO: VirtualDisplay support
-    return 0;
-}
-
-static bool isValid(Callback descriptor) {
-    switch (descriptor) {
-        case Callback::Hotplug: // Fall-through
-        case Callback::Refresh: // Fall-through
-        case Callback::Vsync: return true;
-        default: return false;
-    }
-}
-
-Error EmuHWC2::registerCallback(Callback descriptor,
-        hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer) {
-    ALOGVV("%s", __FUNCTION__);
-    if (!isValid(descriptor)) {
-        ALOGE("registerCallback: Unkown function descriptor: %d",
-                static_cast<int32_t>(descriptor));
-        return Error::BadParameter;
-    }
-    ALOGV("registerCallback(%s, %p, %p)", to_string(descriptor).c_str(),
-            callbackData, pointer);
-
-    std::unique_lock<std::mutex> lock(mStateMutex);
-
-    if (pointer != nullptr) {
-        mCallbacks[descriptor] = {callbackData, pointer};
-    }
-    else {
-        ALOGV("unregisterCallback(%s)", to_string(descriptor).c_str());
-        mCallbacks.erase(descriptor);
-        return Error::None;
-    }
-
-    // Callback without the state lock held
-    if (descriptor == Callback::Hotplug) {
-        lock.unlock();
-        auto hotplug = reinterpret_cast<HWC2_PFN_HOTPLUG>(pointer);
-        for (const auto& iter : mDisplays) {
-            hotplug(callbackData, iter.first, static_cast<int32_t>(Connection::Connected));
-        }
-    }
-
-    return Error::None;
-}
-
-const native_handle_t* EmuHWC2::allocateDisplayColorBuffer(int width, int height) {
-    const uint32_t layerCount = 1;
-    const uint64_t graphicBufferId = 0; // not used
-
-    buffer_handle_t h;
-    uint32_t stride;
-
-    if (GraphicBufferAllocator::get().allocate(
-        width, height,
-        PIXEL_FORMAT_RGBA_8888,
-        layerCount,
-        (GraphicBuffer::USAGE_HW_COMPOSER | GraphicBuffer::USAGE_HW_RENDER),
-        &h, &stride,
-        graphicBufferId, "EmuHWC2") == OK) {
-        return static_cast<const native_handle_t*>(h);
-    } else {
-        return nullptr;
-    }
-}
-
-void EmuHWC2::freeDisplayColorBuffer(const native_handle_t* h) {
-    GraphicBufferAllocator::get().free(h);
-}
-
-// Display functions
-
-#define VSYNC_PERIOD_PROP "ro.kernel.qemu.vsync"
-#define GRALLOC_PROP "ro.hardware.gralloc"
-
-static int getVsyncHzFromProperty() {
-    char displaysValue[PROPERTY_VALUE_MAX] = "";
-    property_get(VSYNC_PERIOD_PROP, displaysValue, "");
-    bool isValid = displaysValue[0] != '\0';
-
-    if (!isValid) return 60;
-
-    long vsyncPeriodParsed = strtol(displaysValue, 0, 10);
-
-    // On failure, strtol returns 0. Also, there's no reason to have 0
-    // as the vsync period.
-    if (!vsyncPeriodParsed) return 60;
-
-    return static_cast<int>(vsyncPeriodParsed);
-}
-
-static bool getIsMinigbmFromProperty() {
-    char grallocValue[PROPERTY_VALUE_MAX] = "";
-    property_get(GRALLOC_PROP, grallocValue, "");
-    bool isValid = grallocValue[0] != '\0';
-
-    if (!isValid) return false;
-
-    bool res = 0 == strcmp("minigbm", grallocValue);
-
-    if (res) {
-        ALOGD("%s: Is using minigbm, in minigbm mode.\n", __func__);
-    } else {
-        ALOGD("%s: Is not using minigbm, in goldfish mode.\n", __func__);
-    }
-
-    return res;
-}
-
-std::atomic<hwc2_display_t> EmuHWC2::Display::sNextId(0);
-
-EmuHWC2::Display::Display(EmuHWC2& device, DisplayType type, int width, int height)
-  : mDevice(device),
-    mIsMinigbm(getIsMinigbmFromProperty()),
-    mId(sNextId++),
-    mHostDisplayId(0),
-    mName(),
-    mType(type),
-    mPowerMode(PowerMode::Off),
-    mVsyncEnabled(Vsync::Invalid),
-    mVsyncPeriod(1000*1000*1000/getVsyncHzFromProperty()), // vsync is 60 hz
-    mVsyncThread(*this),
-    mClientTarget(),
-    mChanges(),
-    mLayers(),
-    mReleaseLayerIds(),
-    mReleaseFences(),
-    mConfigs(),
-    mActiveConfig(nullptr),
-    mColorModes(),
-    mSetColorTransform(false),
-    mStateMutex() {
-
-    mTargetCb = device.allocateDisplayColorBuffer(width, height);
-
-    if (mIsMinigbm) {
-
-        mTargetDrmBuffer.reset(new DrmBuffer(mTargetCb, mDevice.mVirtioGpu));
-        mVsyncPeriod = 1000*1000*1000 / mDevice.mVirtioGpu.refreshRate();
-    }
-
-    mVsyncThread.run("", ANDROID_PRIORITY_URGENT_DISPLAY);
-}
-
-EmuHWC2::Display::~Display() {
-    mDevice.freeDisplayColorBuffer(mTargetCb);
-}
-
-Error EmuHWC2::Display::acceptChanges() {
-    ALOGVV("%s: displayId %u", __FUNCTION__, (uint32_t)mId);
-    std::unique_lock<std::mutex> lock(mStateMutex);
-
-    if (!mChanges) {
-        ALOGW("%s: displayId %u acceptChanges failed, not validated",
-              __FUNCTION__, (uint32_t)mId);
-        return Error::NotValidated;
-    }
-
-
-    for (auto& change : mChanges->getTypeChanges()) {
-        auto layerId = change.first;
-        auto type = change.second;
-        if (mDevice.mLayers.count(layerId) == 0) {
-            // This should never happen but somehow does.
-            ALOGW("Cannot accept change for unknown layer %u",
-                  (uint32_t)layerId);
-            continue;
-        }
-        auto layer = mDevice.mLayers[layerId];
-        layer->setCompositionType((int32_t)type);
-    }
-
-    mChanges->clearTypeChanges();
-    return Error::None;
-}
-
-Error EmuHWC2::Display::createLayer(hwc2_layer_t* outLayerId) {
-    ALOGVV("%s", __FUNCTION__);
-    std::unique_lock<std::mutex> lock(mStateMutex);
-
-    auto layer = *mLayers.emplace(std::make_shared<Layer>(*this));
-    mDevice.mLayers.emplace(std::make_pair(layer->getId(), layer));
-    *outLayerId = layer->getId();
-    ALOGV("%s: Display %u created layer %u", __FUNCTION__, (uint32_t)mId,
-         (uint32_t)(*outLayerId));
-    return Error::None;
-}
-
-Error EmuHWC2::Display::destroyLayer(hwc2_layer_t layerId) {
-    ALOGVV("%s", __FUNCTION__);
-    std::unique_lock<std::mutex> lock(mStateMutex);
-
-    const auto mapLayer = mDevice.mLayers.find(layerId);
-    if (mapLayer == mDevice.mLayers.end()) {
-        ALOGW("%s failed: no such layer, displayId %u layerId %u",
-             __FUNCTION__, (uint32_t)mId, (uint32_t)layerId);
-        return Error::BadLayer;
-    }
-    const auto layer = mapLayer->second;
-    mDevice.mLayers.erase(mapLayer);
-    const auto zRange = mLayers.equal_range(layer);
-    for (auto current = zRange.first; current != zRange.second; ++current) {
-        if (**current == *layer) {
-            current = mLayers.erase(current);
-            break;
-        }
-    }
-    ALOGV("%s: displayId %d layerId %d", __FUNCTION__, (uint32_t)mId,
-         (uint32_t)layerId);
-    return Error::None;
-}
-
-Error EmuHWC2::Display::getActiveConfig(hwc2_config_t* outConfig) {
-    ALOGVV("%s", __FUNCTION__);
-    std::unique_lock<std::mutex> lock(mStateMutex);
-
-    if (!mActiveConfig) {
-        ALOGW("%s: displayId %d %s", __FUNCTION__, (uint32_t)mId,
-                to_string(Error::BadConfig).c_str());
-        return Error::BadConfig;
-    }
-    auto configId = mActiveConfig->getId();
-    ALOGV("%s: displayId %d configId %d", __FUNCTION__,
-          (uint32_t)mId, (uint32_t)configId);
-    *outConfig = configId;
-    return Error::None;
-}
-
-Error EmuHWC2::Display::getDisplayAttribute(hwc2_config_t configId,
-        int32_t attribute, int32_t* outValue) {
-    ALOGVV("%s", __FUNCTION__);
-    std::unique_lock<std::mutex> lock(mStateMutex);
-
-    if (configId > mConfigs.size() || !mConfigs[configId]->isOnDisplay(*this)) {
-        ALOGW("%s: bad config (%u %u)", __FUNCTION__, (uint32_t)mId, configId);
-        return Error::BadConfig;
-    }
-    *outValue = mConfigs[configId]->getAttribute((Attribute)attribute);
-    ALOGV("%s: (%d %d) %s --> %d", __FUNCTION__,
-          (uint32_t)mId, (uint32_t)configId,
-          to_string((Attribute)attribute).c_str(), *outValue);
-    return Error::None;
-}
-
-Error EmuHWC2::Display::getChangedCompositionTypes(
-        uint32_t* outNumElements, hwc2_layer_t* outLayers, int32_t* outTypes) {
-    ALOGVV("%s", __FUNCTION__);
-    std::unique_lock<std::mutex> lock(mStateMutex);
-
-    if (!mChanges) {
-        ALOGW("display %u getChangedCompositionTypes failed: not validated",
-                (uint32_t)mId);
-        return Error::NotValidated;
-    }
-
-    if ((outLayers == nullptr) || (outTypes == nullptr)) {
-        *outNumElements = mChanges->getTypeChanges().size();
-        return Error::None;
-    }
-
-    uint32_t numWritten = 0;
-    for (const auto& element : mChanges->getTypeChanges()) {
-        if (numWritten == *outNumElements) {
-            break;
-        }
-        auto layerId = element.first;
-        auto intType = static_cast<int32_t>(element.second);
-        ALOGV("%s: Adding layer %u %s", __FUNCTION__, (uint32_t)layerId,
-                to_string(element.second).c_str());
-        outLayers[numWritten] = layerId;
-        outTypes[numWritten] = intType;
-        ++numWritten;
-    }
-    *outNumElements = numWritten;
-    return Error::None;
-}
-
-Error EmuHWC2::Display::getColorModes(uint32_t* outNumModes,
-        int32_t* outModes) {
-    ALOGVV("%s", __FUNCTION__);
-    std::unique_lock<std::mutex> lock(mStateMutex);
-
-    if (!outModes) {
-        *outNumModes = mColorModes.size();
-        return Error::None;
-    }
-
-    // we only support HAL_COLOR_MODE_NATIVE so far
-    uint32_t numModes = std::min(*outNumModes,
-            static_cast<uint32_t>(mColorModes.size()));
-    std::copy_n(mColorModes.cbegin(), numModes, outModes);
-    *outNumModes = numModes;
-    return Error::None;
-}
-
-Error EmuHWC2::Display::getConfigs(uint32_t* outNumConfigs,
-        hwc2_config_t* outConfigs) {
-    ALOGVV("%s", __FUNCTION__);
-    std::unique_lock<std::mutex> lock(mStateMutex);
-
-    if (!outConfigs) {
-        *outNumConfigs = mConfigs.size();
-        return Error::None;
-    }
-    uint32_t numWritten = 0;
-    for (const auto config : mConfigs) {
-        if (numWritten == *outNumConfigs) {
-            break;
-        }
-        outConfigs[numWritten] = config->getId();
-        ++numWritten;
-    }
-    *outNumConfigs = numWritten;
-    return Error::None;
-}
-
-Error EmuHWC2::Display::getDozeSupport(int32_t* outSupport) {
-    ALOGVV("%s", __FUNCTION__);
-    // We don't support so far
-    *outSupport = 0;
-    return Error::None;
-}
-
-Error EmuHWC2::Display::getHdrCapabilities(uint32_t* outNumTypes,
-        int32_t* /*outTypes*/, float* /*outMaxLuminance*/,
-        float* /*outMaxAverageLuminance*/, float* /*outMinLuminance*/) {
-    ALOGVV("%s", __FUNCTION__);
-    // We don't support so far
-    *outNumTypes = 0;
-    return Error::None;
-}
-
-Error EmuHWC2::Display::getName(uint32_t* outSize, char* outName) {
-    ALOGVV("%s", __FUNCTION__);
-    std::unique_lock<std::mutex> lock(mStateMutex);
-
-    if (!outName) {
-        *outSize = mName.size();
-        return Error::None;
-    }
-    auto numCopied = mName.copy(outName, *outSize);
-    *outSize = numCopied;
-    return Error::None;
-}
-
-Error EmuHWC2::Display::getReleaseFences(uint32_t* outNumElements,
-        hwc2_layer_t* outLayers, int32_t* outFences) {
-    ALOGVV("%s", __FUNCTION__);
-
-    *outNumElements = mReleaseLayerIds.size();
-
-    ALOGVV("%s. Got %u elements", __FUNCTION__, *outNumElements);
-
-    if (*outNumElements && outLayers) {
-        ALOGVV("%s. export release layers", __FUNCTION__);
-        memcpy(outLayers, mReleaseLayerIds.data(),
-               sizeof(hwc2_layer_t) * (*outNumElements));
-    }
-
-    if (*outNumElements && outFences) {
-        ALOGVV("%s. export release fences", __FUNCTION__);
-        memcpy(outFences, mReleaseFences.data(),
-               sizeof(int32_t) * (*outNumElements));
-    }
-
-    return Error::None;
-}
-
-Error EmuHWC2::Display::getRequests(int32_t* outDisplayRequests,
-        uint32_t* outNumElements, hwc2_layer_t* outLayers,
-        int32_t* outLayerRequests) {
-    ALOGVV("%s", __FUNCTION__);
-    std::unique_lock<std::mutex> lock(mStateMutex);
-
-    if (!mChanges) {
-        return Error::NotValidated;
-    }
-
-    if (outLayers == nullptr || outLayerRequests == nullptr) {
-        *outNumElements = mChanges->getNumLayerRequests();
-        return Error::None;
-    }
-
-    //TODO
-    // Display requests (HWC2::DisplayRequest) are not supported so far:
-    *outDisplayRequests = 0;
-
-    uint32_t numWritten = 0;
-    for (const auto& request : mChanges->getLayerRequests()) {
-        if (numWritten == *outNumElements) {
-            break;
-        }
-        outLayers[numWritten] = request.first;
-        outLayerRequests[numWritten] = static_cast<int32_t>(request.second);
-        ++numWritten;
-    }
-
-    return Error::None;
-}
-
-Error EmuHWC2::Display::getType(int32_t* outType) {
-    ALOGVV("%s", __FUNCTION__);
-    std::unique_lock<std::mutex> lock(mStateMutex);
-
-    *outType = (int32_t)mType;
-    return Error::None;
-}
-
-Error EmuHWC2::Display::present(int32_t* outRetireFence) {
-    ALOGVV("%s", __FUNCTION__);
-
-    *outRetireFence = -1;
-
-    std::unique_lock<std::mutex> lock(mStateMutex);
-
-    if (!mChanges || (mChanges->getNumTypes() > 0)) {
-        ALOGE("%s display(%u) set failed: not validated", __FUNCTION__,
-              (uint32_t)mId);
-        return Error::NotValidated;
-    }
-    mChanges.reset();
-
-    DEFINE_AND_VALIDATE_HOST_CONNECTION
-    hostCon->lock();
-    bool hostCompositionV1 = rcEnc->hasHostCompositionV1();
-    bool hostCompositionV2 = rcEnc->hasHostCompositionV2();
-    hostCon->unlock();
-
-    // if we supports v2, then discard v1
-    if (hostCompositionV2) {
-        hostCompositionV1 = false;
-    }
-
-    if (hostCompositionV2 || hostCompositionV1) {
-        uint32_t numLayer = 0;
-        for (auto layer: mLayers) {
-            if (layer->getCompositionType() == Composition::Device ||
-                layer->getCompositionType() == Composition::SolidColor) {
-                numLayer++;
-            }
-        }
-
-        ALOGVV("present %d layers total %u layers",
-              numLayer, (uint32_t)mLayers.size());
-
-        mReleaseLayerIds.clear();
-        mReleaseFences.clear();
-
-        if (numLayer == 0) {
-            ALOGW("No layers, exit, buffer %p", mClientTarget.getBuffer());
-            if (mClientTarget.getBuffer()) {
-                if (mIsMinigbm) {
-                    int retireFence = mClientTargetDrmBuffer->flush();
-                    *outRetireFence = dup(retireFence);
-                    close(retireFence);
-                } else {
-                    post(hostCon, rcEnc, mClientTarget.getBuffer());
-                    *outRetireFence = mClientTarget.getFence();
-                }
-            }
-            return Error::None;
-        }
-
-        if (hostCompositionV1) {
-            if (mComposeMsg == nullptr || mComposeMsg->getLayerCnt() < numLayer) {
-                mComposeMsg.reset(new ComposeMsg(numLayer));
-            }
-        } else {
-            if (mComposeMsg_v2 == nullptr || mComposeMsg_v2->getLayerCnt() < numLayer) {
-                mComposeMsg_v2.reset(new ComposeMsg_v2(numLayer));
-            }
-        }
-
-        // Handle the composition
-        ComposeDevice* p;
-        ComposeDevice_v2* p2;
-        ComposeLayer* l;
-
-        if (hostCompositionV1) {
-            p = mComposeMsg->get();
-            l = p->layer;
-        } else {
-            p2 = mComposeMsg_v2->get();
-            l = p2->layer;
-        }
-
-        for (auto layer: mLayers) {
-            if (layer->getCompositionType() != Composition::Device &&
-                layer->getCompositionType() != Composition::SolidColor) {
-                ALOGE("%s: Unsupported composition types %d layer %u",
-                      __FUNCTION__, layer->getCompositionType(),
-                      (uint32_t)layer->getId());
-                continue;
-            }
-            // send layer composition command to host
-            if (layer->getCompositionType() == Composition::Device) {
-                int fence = layer->getLayerBuffer().getFence();
-                mReleaseLayerIds.push_back(layer->getId());
-                if (fence != -1) {
-                    int err = sync_wait(fence, 3000);
-                    if (err < 0 && errno == ETIME) {
-                        ALOGE("%s waited on fence %d for 3000 ms",
-                            __FUNCTION__, fence);
-                    }
-                    close(fence);
-                }
-                else {
-                    ALOGV("%s: acquire fence not set for layer %u",
-                          __FUNCTION__, (uint32_t)layer->getId());
-                }
-                const native_handle_t *cb =
-                    layer->getLayerBuffer().getBuffer();
-                if (cb != nullptr) {
-                    l->cbHandle = hostCon->grallocHelper()->getHostHandle(cb);
-                }
-                else {
-                    ALOGE("%s null buffer for layer %d", __FUNCTION__,
-                          (uint32_t)layer->getId());
-                }
-            }
-            else {
-                // solidcolor has no buffer
-                l->cbHandle = 0;
-            }
-            l->composeMode = (hwc2_composition_t)layer->getCompositionType();
-            l->displayFrame = layer->getDisplayFrame();
-            l->crop = layer->getSourceCrop();
-            l->blendMode = layer->getBlendMode();
-            l->alpha = layer->getPlaneAlpha();
-            l->color = layer->getColor();
-            l->transform = layer->getTransform();
-            ALOGV("   cb %d blendmode %d alpha %f %d %d %d %d z %d"
-                  " composeMode %d, transform %d",
-                  l->cbHandle, l->blendMode, l->alpha,
-                  l->displayFrame.left, l->displayFrame.top,
-                  l->displayFrame.right, l->displayFrame.bottom,
-                  layer->getZ(), l->composeMode, l->transform);
-            l++;
-        }
-        if (hostCompositionV1) {
-            p->version = 1;
-            p->targetHandle = hostCon->grallocHelper()->getHostHandle(mTargetCb);
-            p->numLayers = numLayer;
-        } else {
-            p2->version = 2;
-            p2->displayId = mHostDisplayId;
-            p2->targetHandle = hostCon->grallocHelper()->getHostHandle(mTargetCb);
-            p2->numLayers = numLayer;
-        }
-
-        hostCon->lock();
-        if (rcEnc->hasAsyncFrameCommands()) {
-            if (mIsMinigbm) {
-                if (hostCompositionV1) {
-                    rcEnc->rcComposeAsyncWithoutPost(rcEnc,
-                            sizeof(ComposeDevice) + numLayer * sizeof(ComposeLayer),
-                            (void *)p);
-                } else {
-                    rcEnc->rcComposeAsyncWithoutPost(rcEnc,
-                            sizeof(ComposeDevice_v2) + numLayer * sizeof(ComposeLayer),
-                            (void *)p2);
-                }
-            } else {
-                if (hostCompositionV1) {
-                    rcEnc->rcComposeAsync(rcEnc,
-                            sizeof(ComposeDevice) + numLayer * sizeof(ComposeLayer),
-                            (void *)p);
-                } else {
-                    rcEnc->rcComposeAsync(rcEnc,
-                            sizeof(ComposeDevice_v2) + numLayer * sizeof(ComposeLayer),
-                            (void *)p2);
-                }
-            }
-        } else {
-            if (mIsMinigbm) {
-                if (hostCompositionV1) {
-                    rcEnc->rcComposeWithoutPost(rcEnc,
-                            sizeof(ComposeDevice) + numLayer * sizeof(ComposeLayer),
-                            (void *)p);
-                } else {
-                    rcEnc->rcComposeWithoutPost(rcEnc,
-                            sizeof(ComposeDevice_v2) + numLayer * sizeof(ComposeLayer),
-                            (void *)p2);
-                }
-            } else {
-                if (hostCompositionV1) {
-                    rcEnc->rcCompose(rcEnc,
-                            sizeof(ComposeDevice) + numLayer * sizeof(ComposeLayer),
-                            (void *)p);
-                } else {
-                    rcEnc->rcCompose(rcEnc,
-                            sizeof(ComposeDevice_v2) + numLayer * sizeof(ComposeLayer),
-                            (void *)p2);
-                }
-            }
-        }
-
-        hostCon->unlock();
-
-        // Send a retire fence and use it as the release fence for all layers,
-        // since media expects it
-        EGLint attribs[] = { EGL_SYNC_NATIVE_FENCE_ANDROID, EGL_NO_NATIVE_FENCE_FD_ANDROID };
-
-        uint64_t sync_handle, thread_handle;
-        int retire_fd;
-
-        hostCon->lock();
-        rcEnc->rcCreateSyncKHR(rcEnc, EGL_SYNC_NATIVE_FENCE_ANDROID,
-                attribs, 2 * sizeof(EGLint), true /* destroy when signaled */,
-                &sync_handle, &thread_handle);
-        hostCon->unlock();
-
-        if (mIsMinigbm) {
-            retire_fd = -1;
-            retire_fd = mTargetDrmBuffer->flush();
-        } else {
-            goldfish_sync_queue_work(mSyncDeviceFd, sync_handle, thread_handle, &retire_fd);
-        }
-
-        for (size_t i = 0; i < mReleaseLayerIds.size(); ++i) {
-            mReleaseFences.push_back(dup(retire_fd));
-        }
-
-        *outRetireFence = dup(retire_fd);
-        close(retire_fd);
-        hostCon->lock();
-        if (rcEnc->hasAsyncFrameCommands()) {
-            rcEnc->rcDestroySyncKHRAsync(rcEnc, sync_handle);
-        } else {
-            rcEnc->rcDestroySyncKHR(rcEnc, sync_handle);
-        }
-        hostCon->unlock();
-
-    } else {
-        // we set all layers Composition::Client, so do nothing.
-        if (mIsMinigbm) {
-            int retireFence = mClientTargetDrmBuffer->flush();
-            *outRetireFence = dup(retireFence);
-            close(retireFence);
-        } else {
-            post(hostCon, rcEnc, mClientTarget.getBuffer());
-            *outRetireFence = mClientTarget.getFence();
-        }
-        ALOGV("%s fallback to post, returns outRetireFence %d",
-              __FUNCTION__, *outRetireFence);
-    }
-
-    return Error::None;
-}
-
-Error EmuHWC2::Display::setActiveConfig(hwc2_config_t configId) {
-    ALOGVV("%s %u", __FUNCTION__, (uint32_t)configId);
-    std::unique_lock<std::mutex> lock(mStateMutex);
-
-    if (configId > mConfigs.size() || !mConfigs[configId]->isOnDisplay(*this)) {
-        ALOGW("%s: bad config (%u %u)", __FUNCTION__, (uint32_t)mId,
-              (uint32_t)configId);
-        return Error::BadConfig;
-    }
-    auto config = mConfigs[configId];
-    if (config == mActiveConfig) {
-        return Error::None;
-    }
-
-    mActiveConfig = config;
-    return Error::None;
-}
-
-Error EmuHWC2::Display::setClientTarget(buffer_handle_t target,
-        int32_t acquireFence, int32_t /*dataspace*/, hwc_region_t /*damage*/) {
-    ALOGVV("%s", __FUNCTION__);
-
-    std::unique_lock<std::mutex> lock(mStateMutex);
-    mClientTarget.setBuffer(target);
-    mClientTarget.setFence(acquireFence);
-
-    // drm buffer
-    if (mIsMinigbm) {
-        mClientTargetDrmBuffer.reset(
-            new DrmBuffer(static_cast<const native_handle_t*>(target), mDevice.mVirtioGpu));
-    }
-    return Error::None;
-}
-
-Error EmuHWC2::Display::setColorMode(int32_t intMode) {
-    ALOGVV("%s %d", __FUNCTION__, intMode);
-    std::unique_lock<std::mutex> lock(mStateMutex);
-
-    auto mode = static_cast<android_color_mode_t>(intMode);
-    ALOGV("%s: (display %u mode %d)", __FUNCTION__, (uint32_t)mId, intMode);
-    if (mode == mActiveColorMode) {
-        return Error::None;
-    }
-    if (mColorModes.count(mode) == 0) {
-        ALOGE("%s: display %d Mode %d not found in mColorModes",
-             __FUNCTION__, (uint32_t)mId, intMode);
-        return Error::Unsupported;
-    }
-    mActiveColorMode = mode;
-    return Error::None;
-}
-
-Error EmuHWC2::Display::setColorTransform(const float* /*matrix*/,
-                                          int32_t hint) {
-    ALOGVV("%s hint %d", __FUNCTION__, hint);
-    std::unique_lock<std::mutex> lock(mStateMutex);
-    //we force client composition if this is set
-    if (hint == 0 ) {
-        mSetColorTransform = false;
-    }
-    else {
-        mSetColorTransform = true;
-    }
-    return Error::None;
-}
-
-Error EmuHWC2::Display::setOutputBuffer(buffer_handle_t /*buffer*/,
-        int32_t /*releaseFence*/) {
-    ALOGVV("%s", __FUNCTION__);
-    //TODO: for virtual display
-    return Error::None;
-}
-
-static bool isValid(PowerMode mode) {
-    switch (mode) {
-        case PowerMode::Off: // Fall-through
-        case PowerMode::DozeSuspend: // Fall-through
-        case PowerMode::Doze: // Fall-through
-        case PowerMode::On: return true;
-        default: return false;
-    }
-}
-
-Error EmuHWC2::Display::setPowerMode(int32_t intMode) {
-    ALOGVV("%s", __FUNCTION__);
-    // Emulator always set screen ON
-    PowerMode mode = static_cast<PowerMode>(intMode);
-    if (!isValid(mode)) {
-        return Error::BadParameter;
-    }
-    if (mode == mPowerMode) {
-        return Error::None;
-    }
-    std::unique_lock<std::mutex> lock(mStateMutex);
-
-    ALOGV("%s: (display %u mode %s)", __FUNCTION__,
-          (uint32_t)mId, to_string(mode).c_str());
-    mPowerMode = mode;
-    return Error::None;
-}
-
-static bool isValid(Vsync enable) {
-    switch (enable) {
-        case Vsync::Enable: // Fall-through
-        case Vsync::Disable: return true;
-        case Vsync::Invalid: return false;
-    }
-}
-
-Error EmuHWC2::Display::setVsyncEnabled(int32_t intEnable) {
-    ALOGVV("%s %d", __FUNCTION__, intEnable);
-    Vsync enable = static_cast<Vsync>(intEnable);
-    if (!isValid(enable)) {
-        return Error::BadParameter;
-    }
-    if (enable == mVsyncEnabled) {
-        return Error::None;
-    }
-
-    std::unique_lock<std::mutex> lock(mStateMutex);
-
-    mVsyncEnabled = enable;
-    return Error::None;
-}
-
-Error EmuHWC2::Display::validate(uint32_t* outNumTypes,
-        uint32_t* outNumRequests) {
-    ALOGVV("%s", __FUNCTION__);
-    std::unique_lock<std::mutex> lock(mStateMutex);
-
-    if (!mChanges) {
-        mChanges.reset(new Changes);
-        DEFINE_AND_VALIDATE_HOST_CONNECTION
-        hostCon->lock();
-        bool hostCompositionV1 = rcEnc->hasHostCompositionV1();
-        bool hostCompositionV2 = rcEnc->hasHostCompositionV2();
-        hostCon->unlock();
-
-        if (hostCompositionV1 || hostCompositionV2) {
-            // Support Device and SolidColor, otherwise, fallback all layers
-            // to Client
-            bool fallBack = false;
-            for (auto& layer : mLayers) {
-                if (layer->getCompositionType() == Composition::Invalid) {
-                    // Log error for unused layers, layer leak?
-                    ALOGE("%s layer %u CompositionType(%d) not set",
-                          __FUNCTION__, (uint32_t)layer->getId(),
-                          layer->getCompositionType());
-                    continue;
-                }
-                if (layer->getCompositionType() == Composition::Client ||
-                    layer->getCompositionType() == Composition::Cursor ||
-                    layer->getCompositionType() == Composition::Sideband) {
-                    ALOGW("%s: layer %u CompositionType %d, fallback", __FUNCTION__,
-                         (uint32_t)layer->getId(), layer->getCompositionType());
-                    fallBack = true;
-                    break;
-                }
-            }
-            if (mSetColorTransform) {
-                fallBack = true;
-            }
-            if (fallBack) {
-                for (auto& layer : mLayers) {
-                    if (layer->getCompositionType() == Composition::Invalid) {
-                        continue;
-                    }
-                    if (layer->getCompositionType() != Composition::Client) {
-                        mChanges->addTypeChange(layer->getId(),
-                                                Composition::Client);
-                    }
-                }
-            }
-       }
-       else {
-            for (auto& layer : mLayers) {
-                if (layer->getCompositionType() != Composition::Client) {
-                    mChanges->addTypeChange(layer->getId(),
-                                            Composition::Client);
-                }
-            }
-        }
-    }
-    else {
-        ALOGE("Validate was called more than once!");
-    }
-
-    *outNumTypes = mChanges->getNumTypes();
-    *outNumRequests = mChanges->getNumLayerRequests();
-    ALOGV("%s: displayId %u types %u, requests %u", __FUNCTION__,
-          (uint32_t)mId, *outNumTypes, *outNumRequests);
-    return *outNumTypes > 0 ? Error::HasChanges : Error::None;
-}
-
-Error EmuHWC2::Display::updateLayerZ(hwc2_layer_t layerId, uint32_t z) {
-    ALOGVV("%s", __FUNCTION__);
-    std::unique_lock<std::mutex> lock(mStateMutex);
-
-    const auto mapLayer = mDevice.mLayers.find(layerId);
-    if (mapLayer == mDevice.mLayers.end()) {
-        ALOGE("%s failed to find layer %u", __FUNCTION__, (uint32_t)mId);
-        return Error::BadLayer;
-    }
-
-    const auto layer = mapLayer->second;
-    const auto zRange = mLayers.equal_range(layer);
-    bool layerOnDisplay = false;
-    for (auto current = zRange.first; current != zRange.second; ++current) {
-        if (**current == *layer) {
-            if ((*current)->getZ() == z) {
-                // Don't change anything if the Z hasn't changed
-                return Error::None;
-            }
-            current = mLayers.erase(current);
-            layerOnDisplay = true;
-            break;
-        }
-    }
-
-    if (!layerOnDisplay) {
-        ALOGE("%s failed to find layer %u on display", __FUNCTION__,
-              (uint32_t)mId);
-        return Error::BadLayer;
-    }
-
-    layer->setZ(z);
-    mLayers.emplace(std::move(layer));
-    return Error::None;
-}
-
-Error EmuHWC2::Display::getClientTargetSupport(uint32_t width, uint32_t height,
-                                      int32_t format, int32_t dataspace){
-    ALOGVV("%s", __FUNCTION__);
-    std::unique_lock<std::mutex> lock(mStateMutex);
-
-    if (mActiveConfig == nullptr) {
-        return Error::Unsupported;
-    }
-
-    if (width == (uint32_t)mActiveConfig->getAttribute(Attribute::Width) &&
-        height == (uint32_t)mActiveConfig->getAttribute(Attribute::Height) &&
-        format == HAL_PIXEL_FORMAT_RGBA_8888 &&
-        dataspace == HAL_DATASPACE_UNKNOWN) {
-        return Error::None;
-    }
-
-    return Error::None;
-}
-
-// thess EDIDs are carefully generated according to the EDID spec version 1.3, more info
-// can be found from the following file:
-//   frameworks/native/services/surfaceflinger/DisplayHardware/DisplayIdentification.cpp
-// approved pnp ids can be found here: https://uefi.org/pnp_id_list
-// pnp id: GGL, name: EMU_display_0, last byte is checksum
-// display id is local:8141603649153536
-static const uint8_t sEDID0[] = {
-    0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x1c, 0xec, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
-    0x1b, 0x10, 0x01, 0x03, 0x80, 0x50, 0x2d, 0x78, 0x0a, 0x0d, 0xc9, 0xa0, 0x57, 0x47, 0x98, 0x27,
-    0x12, 0x48, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x3a, 0x80, 0x18, 0x71, 0x38, 0x2d, 0x40, 0x58, 0x2c,
-    0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc,
-    0x00, 0x45, 0x4d, 0x55, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x30, 0x00, 0x4b
-};
-
-// pnp id: GGL, name: EMU_display_1
-// display id is local:8140900251843329
-static const uint8_t sEDID1[] = {
-    0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x1c, 0xec, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
-    0x1b, 0x10, 0x01, 0x03, 0x80, 0x50, 0x2d, 0x78, 0x0a, 0x0d, 0xc9, 0xa0, 0x57, 0x47, 0x98, 0x27,
-    0x12, 0x48, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x3a, 0x80, 0x18, 0x71, 0x38, 0x2d, 0x40, 0x58, 0x2c,
-    0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc,
-    0x00, 0x45, 0x4d, 0x55, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x31, 0x00, 0x3b
-};
-
-// pnp id: GGL, name: EMU_display_2
-// display id is local:8140940453066754
-static const uint8_t sEDID2[] = {
-    0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x1c, 0xec, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
-    0x1b, 0x10, 0x01, 0x03, 0x80, 0x50, 0x2d, 0x78, 0x0a, 0x0d, 0xc9, 0xa0, 0x57, 0x47, 0x98, 0x27,
-    0x12, 0x48, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x3a, 0x80, 0x18, 0x71, 0x38, 0x2d, 0x40, 0x58, 0x2c,
-    0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc,
-    0x00, 0x45, 0x4d, 0x55, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x32, 0x00, 0x49
-};
-
-#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
-
-Error EmuHWC2::Display::getDisplayIdentificationData(uint8_t* outPort,
-        uint32_t* outDataSize, uint8_t* outData) {
-    ALOGVV("%s DisplayId %u", __FUNCTION__, (uint32_t)mId);
-    if (outPort == nullptr || outDataSize == nullptr)
-        return Error::BadParameter;
-
-    uint32_t len = std::min(*outDataSize, (uint32_t)ARRAY_SIZE(sEDID0));
-    if (outData != nullptr && len < (uint32_t)ARRAY_SIZE(sEDID0)) {
-        ALOGW("%s DisplayId %u, small buffer size: %u is specified",
-                __FUNCTION__, (uint32_t)mId, len);
-    }
-    *outDataSize = ARRAY_SIZE(sEDID0);
-    switch (mId) {
-        case 0:
-            *outPort = 0;
-            if (outData)
-                memcpy(outData, sEDID0, len);
-            break;
-
-        case 1:
-            *outPort = 1;
-            if (outData)
-                memcpy(outData, sEDID1, len);
-            break;
-
-        case 2:
-            *outPort = 2;
-            if (outData)
-                memcpy(outData, sEDID2, len);
-            break;
-
-        default:
-            *outPort = (uint8_t)mId;
-            if (outData) {
-                memcpy(outData, sEDID2, len);
-                uint32_t size = ARRAY_SIZE(sEDID0);
-                // change the name to EMU_display_<mID>
-                // note the 3rd char from back is the number, _0, _1, _2, etc.
-                if (len >= size - 2)
-                    outData[size-3] = '0' + (uint8_t)mId;
-                if (len >= size) {
-                    // update the last byte, which is checksum byte
-                    uint8_t checksum = -(uint8_t)std::accumulate(
-                            outData, outData + size - 1, static_cast<uint8_t>(0));
-                    outData[size - 1] = checksum;
-                }
-            }
-            break;
-    }
-
-    return Error::None;
-}
-
-Error EmuHWC2::Display::getDisplayCapabilities(uint32_t* outNumCapabilities,
-        uint32_t* outCapabilities) {
-    if (outNumCapabilities == nullptr) {
-        return Error::None;
-    }
-
-    bool brightness_support = true;
-    bool doze_support = true;
-
-    uint32_t count = 1  + static_cast<uint32_t>(doze_support) + (brightness_support ? 1 : 0);
-    int index = 0;
-    if (outCapabilities != nullptr && (*outNumCapabilities >= count)) {
-        outCapabilities[index++] = HWC2_DISPLAY_CAPABILITY_SKIP_CLIENT_COLOR_TRANSFORM;
-        if (doze_support) {
-            outCapabilities[index++] = HWC2_DISPLAY_CAPABILITY_DOZE;
-        }
-        if (brightness_support) {
-            outCapabilities[index++] = HWC2_DISPLAY_CAPABILITY_BRIGHTNESS;
-       }
-    }
-
-    *outNumCapabilities = count;
-    return Error::None;
-}
-
-Error EmuHWC2::Display::getDisplayBrightnessSupport(bool *out_support) {
-    *out_support = false;
-    return Error::None;
-}
-
-Error EmuHWC2::Display::setDisplayBrightness(float brightness) {
-    ALOGW("TODO: setDisplayBrightness() is not implemented yet: brightness=%f", brightness);
-    return Error::None;
-}
-
-int EmuHWC2::Display::populatePrimaryConfigs(int width, int height, int dpiX, int dpiY) {
-    ALOGVV("%s DisplayId %u", __FUNCTION__, (uint32_t)mId);
-    std::unique_lock<std::mutex> lock(mStateMutex);
-
-    auto newConfig = std::make_shared<Config>(*this);
-    // vsync is 60 hz;
-    newConfig->setAttribute(Attribute::VsyncPeriod, mVsyncPeriod);
-    newConfig->setAttribute(Attribute::Width, width);
-    newConfig->setAttribute(Attribute::Height, height);
-    newConfig->setAttribute(Attribute::DpiX, dpiX * 1000);
-    newConfig->setAttribute(Attribute::DpiY, dpiY * 1000);
-
-    newConfig->setId(static_cast<hwc2_config_t>(mConfigs.size()));
-    ALOGV("Found new config %d: %s", (uint32_t)newConfig->getId(),
-            newConfig->toString().c_str());
-    mConfigs.emplace_back(std::move(newConfig));
-
-    // Only have single config so far, it is activeConfig
-    mActiveConfig = mConfigs[0];
-    mActiveColorMode = HAL_COLOR_MODE_NATIVE;
-    mColorModes.emplace((android_color_mode_t)HAL_COLOR_MODE_NATIVE);
-
-    if (!mIsMinigbm) {
-        mSyncDeviceFd = goldfish_sync_open();
-    }
-
-    return 0;
-}
-
-void EmuHWC2::Display::post(HostConnection *hostCon,
-                            ExtendedRCEncoderContext *rcEnc,
-                            buffer_handle_t h) {
-    return;
-    assert(cb && "native_handle_t::from(h) failed");
-
-    hostCon->lock();
-    rcEnc->rcFBPost(rcEnc, hostCon->grallocHelper()->getHostHandle(h));
-    hostCon->flush();
-    hostCon->unlock();
-}
-
-HWC2::Error EmuHWC2::Display::populateSecondaryConfigs(uint32_t width, uint32_t height,
-        uint32_t dpi, uint32_t idx) {
-    ALOGVV("%s DisplayId %u, width %u, height %u, dpi %u",
-            __FUNCTION__, (uint32_t)mId, width, height, dpi);
-    std::unique_lock<std::mutex> lock(mStateMutex);
-
-    auto newConfig = std::make_shared<Config>(*this);
-    // vsync is 60 hz;
-    newConfig->setAttribute(Attribute::VsyncPeriod, mVsyncPeriod);
-    newConfig->setAttribute(Attribute::Width, width);
-    newConfig->setAttribute(Attribute::Height, height);
-    newConfig->setAttribute(Attribute::DpiX, dpi*1000);
-    newConfig->setAttribute(Attribute::DpiY, dpi*1000);
-
-    int configId = mConfigs.size();
-    newConfig->setId(static_cast<hwc2_config_t>(configId));
-    ALOGV("Found new secondary config %d: %s", (uint32_t)newConfig->getId(),
-            newConfig->toString().c_str());
-    mConfigs.emplace_back(std::move(newConfig));
-
-    mActiveConfig = mConfigs[configId];
-    mActiveColorMode = HAL_COLOR_MODE_NATIVE;
-    mColorModes.emplace((android_color_mode_t)HAL_COLOR_MODE_NATIVE);
-
-    uint32_t displayId = hostDisplayIdStart + idx;
-    DEFINE_AND_VALIDATE_HOST_CONNECTION
-
-    hostCon->lock();
-    rcEnc->rcDestroyDisplay(rcEnc, displayId);
-    rcEnc->rcCreateDisplay(rcEnc, &displayId);
-    rcEnc->rcSetDisplayPose(rcEnc, displayId, -1, -1, width, height);
-    hostCon->unlock();
-
-    if (displayId != hostDisplayIdStart + idx) {
-        ALOGE("Something wrong with host displayId allocation, want %d "
-              "allocated %d", hostDisplayIdStart + idx, displayId);
-    }
-    mHostDisplayId = displayId;
-    ALOGVV("%s: mHostDisplayId=%d", __FUNCTION__, mHostDisplayId);
-
-    return HWC2::Error::None;
-}
-
-
-// Config functions
-
-void EmuHWC2::Display::Config::setAttribute(Attribute attribute,
-       int32_t value) {
-    mAttributes[attribute] = value;
-}
-
-int32_t EmuHWC2::Display::Config::getAttribute(Attribute attribute) const {
-    if (mAttributes.count(attribute) == 0) {
-        return -1;
-    }
-    return mAttributes.at(attribute);
-}
-
-std::string EmuHWC2::Display::Config::toString() const {
-    std::string output;
-
-    const size_t BUFFER_SIZE = 100;
-    char buffer[BUFFER_SIZE] = {};
-    auto writtenBytes = snprintf(buffer, BUFFER_SIZE,
-            "%u x %u", mAttributes.at(HWC2::Attribute::Width),
-            mAttributes.at(HWC2::Attribute::Height));
-    output.append(buffer, writtenBytes);
-
-    if (mAttributes.count(HWC2::Attribute::VsyncPeriod) != 0) {
-        std::memset(buffer, 0, BUFFER_SIZE);
-        writtenBytes = snprintf(buffer, BUFFER_SIZE, " @ %.1f Hz",
-                1e9 / mAttributes.at(HWC2::Attribute::VsyncPeriod));
-        output.append(buffer, writtenBytes);
-    }
-
-    if (mAttributes.count(HWC2::Attribute::DpiX) != 0 &&
-            mAttributes.at(HWC2::Attribute::DpiX) != -1) {
-        std::memset(buffer, 0, BUFFER_SIZE);
-        writtenBytes = snprintf(buffer, BUFFER_SIZE,
-                ", DPI: %.1f x %.1f",
-                mAttributes.at(HWC2::Attribute::DpiX) / 1000.0f,
-                mAttributes.at(HWC2::Attribute::DpiY) / 1000.0f);
-        output.append(buffer, writtenBytes);
-    }
-
-    return output;
-}
-
-// VsyncThread function
-bool EmuHWC2::Display::VsyncThread::threadLoop() {
-    struct timespec rt;
-    if (clock_gettime(CLOCK_MONOTONIC, &rt) == -1) {
-        ALOGE("%s: error in vsync thread clock_gettime: %s",
-              __FUNCTION__, strerror(errno));
-        return true;
-    }
-    const int logInterval = 60;
-    int64_t lastLogged = rt.tv_sec;
-    int sent = 0;
-    int lastSent = 0;
-    bool vsyncEnabled = false;
-
-    struct timespec wait_time;
-    wait_time.tv_sec = 0;
-    wait_time.tv_nsec = mDisplay.mVsyncPeriod;
-    const int64_t kOneRefreshNs = mDisplay.mVsyncPeriod;
-    const int64_t kOneSecondNs = 1000ULL * 1000ULL * 1000ULL;
-    int64_t lastTimeNs = -1;
-    int64_t phasedWaitNs = 0;
-    int64_t currentNs = 0;
-
-    while (true) {
-        clock_gettime(CLOCK_MONOTONIC, &rt);
-        currentNs = rt.tv_nsec + rt.tv_sec * kOneSecondNs;
-
-        if (lastTimeNs < 0) {
-            phasedWaitNs = currentNs + kOneRefreshNs;
-        } else {
-            phasedWaitNs = kOneRefreshNs *
-                (( currentNs - lastTimeNs) / kOneRefreshNs + 1) +
-                lastTimeNs;
-        }
-
-        wait_time.tv_sec = phasedWaitNs / kOneSecondNs;
-        wait_time.tv_nsec = phasedWaitNs - wait_time.tv_sec * kOneSecondNs;
-
-        int ret;
-        do {
-            ret = clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &wait_time, NULL);
-        } while (ret == -1 && errno == EINTR);
-
-        lastTimeNs = phasedWaitNs;
-
-        std::unique_lock<std::mutex> lock(mDisplay.mStateMutex);
-        vsyncEnabled = (mDisplay.mVsyncEnabled == Vsync::Enable);
-        lock.unlock();
-
-        if (!vsyncEnabled) {
-            continue;
-        }
-
-        lock.lock();
-        const auto& callbackInfo = mDisplay.mDevice.mCallbacks[Callback::Vsync];
-        auto vsync = reinterpret_cast<HWC2_PFN_VSYNC>(callbackInfo.pointer);
-        lock.unlock();
-
-        if (vsync) {
-            vsync(callbackInfo.data, mDisplay.mId, lastTimeNs);
-        }
-
-        if (rt.tv_sec - lastLogged >= logInterval) {
-            ALOGVV("sent %d syncs in %ds", sent - lastSent, rt.tv_sec - lastLogged);
-            lastLogged = rt.tv_sec;
-            lastSent = sent;
-        }
-        ++sent;
-    }
-    return false;
-}
-
-
-// Layer functions
-bool EmuHWC2::SortLayersByZ::operator()(const std::shared_ptr<Layer>& lhs,
-        const std::shared_ptr<Layer>& rhs) const {
-    return lhs->getZ() < rhs->getZ();
-}
-
-std::atomic<hwc2_layer_t> EmuHWC2::Layer::sNextId(1);
-
-EmuHWC2::Layer::Layer(Display& display)
-  : mId(sNextId++),
-    mDisplay(display),
-    mBuffer(),
-    mSurfaceDamage(),
-    mBlendMode(BlendMode::None),
-    mColor({0, 0, 0, 0}),
-    mCompositionType(Composition::Invalid),
-    mDisplayFrame({0, 0, -1, -1}),
-    mPlaneAlpha(0.0f),
-    mSidebandStream(nullptr),
-    mSourceCrop({0.0f, 0.0f, -1.0f, -1.0f}),
-    mTransform(Transform::None),
-    mVisibleRegion(),
-    mZ(0)
-    {}
-
-Error EmuHWC2::Layer::setBuffer(buffer_handle_t buffer,
-        int32_t acquireFence) {
-    ALOGVV("%s: Setting acquireFence %d for layer %u", __FUNCTION__,
-          acquireFence, (uint32_t)mId);
-    mBuffer.setBuffer(buffer);
-    mBuffer.setFence(acquireFence);
-    return Error::None;
-}
-
-Error EmuHWC2::Layer::setCursorPosition(int32_t /*x*/,
-                                        int32_t /*y*/) {
-    ALOGVV("%s layer %u", __FUNCTION__, (uint32_t)mId);
-    if (mCompositionType != Composition::Cursor) {
-        ALOGE("%s: CompositionType not Cursor type", __FUNCTION__);
-        return Error::BadLayer;
-    }
-   //TODO
-    return Error::None;
-}
-
-Error EmuHWC2::Layer::setSurfaceDamage(hwc_region_t /*damage*/) {
-    // Emulator redraw whole layer per frame, so ignore this.
-    ALOGVV("%s", __FUNCTION__);
-    return Error::None;
-}
-
-// Layer state functions
-
-Error EmuHWC2::Layer::setBlendMode(int32_t mode) {
-    ALOGVV("%s %d for layer %u", __FUNCTION__, mode, (uint32_t)mId);
-    mBlendMode = static_cast<BlendMode>(mode);
-    return Error::None;
-}
-
-Error EmuHWC2::Layer::setColor(hwc_color_t color) {
-    ALOGVV("%s layer %u %d", __FUNCTION__, (uint32_t)mId, color);
-    mColor = color;
-    return Error::None;
-}
-
-Error EmuHWC2::Layer::setCompositionType(int32_t type) {
-    ALOGVV("%s layer %u %u", __FUNCTION__, (uint32_t)mId, type);
-    mCompositionType = static_cast<Composition>(type);
-    return Error::None;
-}
-
-Error EmuHWC2::Layer::setDataspace(int32_t) {
-    ALOGVV("%s", __FUNCTION__);
-    return Error::None;
-}
-
-Error EmuHWC2::Layer::setDisplayFrame(hwc_rect_t frame) {
-    ALOGVV("%s layer %u", __FUNCTION__, (uint32_t)mId);
-    mDisplayFrame = frame;
-    return Error::None;
-}
-
-Error EmuHWC2::Layer::setPlaneAlpha(float alpha) {
-    ALOGVV("%s layer %u %f", __FUNCTION__, (uint32_t)mId, alpha);
-    mPlaneAlpha = alpha;
-    return Error::None;
-}
-
-Error EmuHWC2::Layer::setSidebandStream(const native_handle_t* stream) {
-    ALOGVV("%s layer %u", __FUNCTION__, (uint32_t)mId);
-    mSidebandStream = stream;
-    return Error::None;
-}
-
-Error EmuHWC2::Layer::setSourceCrop(hwc_frect_t crop) {
-    ALOGVV("%s layer %u", __FUNCTION__, (uint32_t)mId);
-    mSourceCrop = crop;
-    return Error::None;
-}
-
-Error EmuHWC2::Layer::setTransform(int32_t transform) {
-    ALOGVV("%s layer %u", __FUNCTION__, (uint32_t)mId);
-    mTransform = static_cast<Transform>(transform);
-    return Error::None;
-}
-
-static bool compareRects(const hwc_rect_t& rect1, const hwc_rect_t& rect2) {
-    return rect1.left == rect2.left &&
-            rect1.right == rect2.right &&
-            rect1.top == rect2.top &&
-            rect1.bottom == rect2.bottom;
-}
-
-Error EmuHWC2::Layer::setVisibleRegion(hwc_region_t visible) {
-    ALOGVV("%s", __FUNCTION__);
-    if ((getNumVisibleRegions() != visible.numRects) ||
-        !std::equal(mVisibleRegion.begin(), mVisibleRegion.end(), visible.rects,
-                    compareRects)) {
-        mVisibleRegion.resize(visible.numRects);
-        std::copy_n(visible.rects, visible.numRects, mVisibleRegion.begin());
-    }
-    return Error::None;
-}
-
-Error EmuHWC2::Layer::setZ(uint32_t z) {
-    ALOGVV("%s layer %u %d", __FUNCTION__, (uint32_t)mId, z);
-    mZ = z;
-    return Error::None;
-}
-
-// VirtioGPU
-EmuHWC2::VirtioGpu::VirtioGpu() {
-    drmModeRes *res;
-    drmModeConnector *conn;
-
-    mFd = open("/dev/dri/card0", O_RDWR | O_CLOEXEC);
-    if (mFd < 0) {
-        ALOGE("%s Error opening virtioGPU device: %d", __func__, errno);
-        return;
-    }
-
-    int univRet = drmSetClientCap(mFd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
-    if (univRet) {
-        ALOGE("%s: fail to set universal plane %d\n", __func__, univRet);
-    }
-
-    int atomicRet = drmSetClientCap(mFd, DRM_CLIENT_CAP_ATOMIC, 1);
-
-    if (atomicRet) {
-        ALOGE("%s: fail to set atomic operation %d, %d\n", __func__, atomicRet, errno);
-    }
-
-    ALOGD("%s: Did set universal planes and atomic cap\n", __func__);
-
-    res = drmModeGetResources(mFd);
-    if (res == nullptr) {
-        ALOGE("%s Error reading drm resources: %d", __func__, errno);
-        close(mFd);
-        mFd = -1;
-        return;
-    }
-
-    mCrtcId = res->crtcs[0];
-    mConnectorId = res->connectors[0];
-
-    drmModePlaneResPtr plane_res = drmModeGetPlaneResources(mFd);
-    for (uint32_t i = 0; i < plane_res->count_planes; ++i) {
-        drmModePlanePtr plane = drmModeGetPlane(mFd, plane_res->planes[i]);
-        ALOGD("%s: plane id: %u crtcid %u fbid %u crtc xy %d %d xy %d %d\n", __func__,
-                plane->plane_id,
-                plane->crtc_id,
-                plane->fb_id,
-                plane->crtc_x,
-                plane->crtc_y,
-                plane->x,
-                plane->y);
-
-        drmModeObjectPropertiesPtr planeProps = drmModeObjectGetProperties(mFd, plane->plane_id, DRM_MODE_OBJECT_PLANE);
-        bool found = false;
-        bool isPrimaryOrOverlay = false;
-        for (int i = 0; !found && (size_t)i < planeProps->count_props; ++i) {
-            drmModePropertyPtr p = drmModeGetProperty(mFd, planeProps->props[i]);
-            if (!strcmp(p->name, "CRTC_ID")) {
-                mPlaneCrtcPropertyId = p->prop_id;
-                ALOGD("%s: Found plane crtc property id. id: %u\n", __func__,
-                        mPlaneCrtcPropertyId);
-            } else if (!strcmp(p->name, "FB_ID")) {
-                mPlaneFbPropertyId = p->prop_id;
-                ALOGD("%s: Found plane fb property id. id: %u\n", __func__,
-                        mPlaneFbPropertyId);
-            } else if (!strcmp(p->name, "CRTC_X")) {
-                mPlaneCrtcXPropertyId = p->prop_id;
-                ALOGD("%s: Found plane crtc X property id. id: %u\n", __func__,
-                        mPlaneCrtcXPropertyId);
-            } else if (!strcmp(p->name, "CRTC_Y")) {
-                mPlaneCrtcYPropertyId = p->prop_id;
-                ALOGD("%s: Found plane crtc Y property id. id: %u\n", __func__,
-                        mPlaneCrtcYPropertyId);
-            } else if (!strcmp(p->name, "CRTC_W")) {
-                mPlaneCrtcWPropertyId = p->prop_id;
-                ALOGD("%s: Found plane crtc W property id. id: %u value: %u\n", __func__,
-                        mPlaneCrtcWPropertyId, (uint32_t)p->values[0]);
-            } else if (!strcmp(p->name, "CRTC_H")) {
-                mPlaneCrtcHPropertyId = p->prop_id;
-                ALOGD("%s: Found plane crtc H property id. id: %u value: %u\n", __func__,
-                        mPlaneCrtcHPropertyId,
-                        (uint32_t)p->values[0]);
-            } else if (!strcmp(p->name, "SRC_X")) {
-                mPlaneSrcXPropertyId = p->prop_id;
-                ALOGD("%s: Found plane src X property id. id: %u\n", __func__,
-                        mPlaneSrcXPropertyId);
-            } else if (!strcmp(p->name, "SRC_Y")) {
-                mPlaneSrcYPropertyId = p->prop_id;
-                ALOGD("%s: Found plane src Y property id. id: %u\n", __func__,
-                        mPlaneSrcYPropertyId);
-            } else if (!strcmp(p->name, "SRC_W")) {
-                mPlaneSrcWPropertyId = p->prop_id;
-                ALOGD("%s: Found plane src W property id. id: %u\n", __func__,
-                        mPlaneSrcWPropertyId);
-            } else if (!strcmp(p->name, "SRC_H")) {
-                mPlaneSrcHPropertyId = p->prop_id;
-                ALOGD("%s: Found plane src H property id. id: %u\n", __func__,
-                        mPlaneSrcHPropertyId);
-            } else if (!strcmp(p->name, "type")) {
-                mPlaneTypePropertyId = p->prop_id;
-                ALOGD("%s: Found plane type property id. id: %u\n", __func__,
-                        mPlaneTypePropertyId);
-                ALOGD("%s: Plane property type value 0x%llx\n", __func__, (unsigned long long)p->values[0]);
-                uint64_t type = p->values[0];
-                switch (type) {
-                    case DRM_PLANE_TYPE_OVERLAY:
-                    case DRM_PLANE_TYPE_PRIMARY:
-                        isPrimaryOrOverlay = true;
-                        ALOGD("%s: Found a primary or overlay plane. plane id: %u type 0x%llx\n", __func__, plane->plane_id, (unsigned long long)type);
-                        break;
-                    default:
-                        break;
-                }
-            }
-            drmModeFreeProperty(p);
-        }
-        drmModeFreeObjectProperties(planeProps);
-
-        if (isPrimaryOrOverlay && ((1 << 0) & plane->possible_crtcs)) {
-            mPlaneId = plane->plane_id;
-            ALOGD("%s: found plane compatible with crtc id %d: %d\n", __func__, mCrtcId, mPlaneId);
-            drmModeFreePlane(plane);
-            break;
-        }
-
-        drmModeFreePlane(plane);
-    }
-    drmModeFreePlaneResources(plane_res);
-
-    conn = drmModeGetConnector(mFd, mConnectorId);
-    if (conn == nullptr) {
-        ALOGE("%s Error reading drm connector %d: %d", __func__, mConnectorId, errno);
-        drmModeFreeResources(res);
-        close(mFd);
-        mFd = -1;
-        return;
-    }
-    memcpy(&mMode, &conn->modes[0], sizeof(drmModeModeInfo));
-
-    drmModeCreatePropertyBlob(mFd, &mMode, sizeof(mMode), &mModeBlobId);
-
-    mRefreshRateAsFloat = 1000.0f * mMode.clock / ((float)mMode.vtotal * (float)mMode.htotal);
-    mRefreshRateAsInteger = (uint32_t)(mRefreshRateAsFloat + 0.5f);
-
-    ALOGD("%s: using drm init. refresh rate of system is %f, rounding to %d. blob id %d\n", __func__,
-          mRefreshRateAsFloat, mRefreshRateAsInteger, mModeBlobId);
-
-    {
-        drmModeObjectPropertiesPtr connectorProps = drmModeObjectGetProperties(mFd, mConnectorId, DRM_MODE_OBJECT_CONNECTOR);
-        bool found = false;
-        for (int i = 0; !found && (size_t)i < connectorProps->count_props; ++i) {
-            drmModePropertyPtr p = drmModeGetProperty(mFd, connectorProps->props[i]);
-            if (!strcmp(p->name, "CRTC_ID")) {
-                mConnectorCrtcPropertyId = p->prop_id;
-                ALOGD("%s: Found connector crtc id prop id: %u\n", __func__,
-                      mConnectorCrtcPropertyId);
-                found = true;
-            }
-            drmModeFreeProperty(p);
-        }
-        drmModeFreeObjectProperties(connectorProps);
-    }
-
-    {
-        drmModeObjectPropertiesPtr crtcProps = drmModeObjectGetProperties(mFd, mCrtcId, DRM_MODE_OBJECT_CRTC);
-        bool found = false;
-        for (int i = 0; !found && (size_t)i < crtcProps->count_props; ++i) {
-            drmModePropertyPtr p = drmModeGetProperty(mFd, crtcProps->props[i]);
-            if (!strcmp(p->name, "OUT_FENCE_PTR")) {
-                mOutFencePtrId = p->prop_id;
-                ALOGD("%s: Found out fence ptr id. id: %u\n", __func__,
-                      mOutFencePtrId);
-            } else if (!strcmp(p->name, "ACTIVE")) {
-                mCrtcActivePropretyId = p->prop_id;
-                ALOGD("%s: Found out crtc active prop id %u\n", __func__,
-                      mCrtcActivePropretyId);
-            } else if (!strcmp(p->name, "MODE_ID")) {
-                mCrtcModeIdPropertyId = p->prop_id;
-                ALOGD("%s: Found out crtc mode id prop id %u\n", __func__,
-                      mCrtcModeIdPropertyId);
-            }
-            drmModeFreeProperty(p);
-        }
-        drmModeFreeObjectProperties(crtcProps);
-    }
-
-    drmModeFreeConnector(conn);
-    drmModeFreeResources(res);
-    ALOGD("%s: Successfully initialized DRM backend", __func__);
-}
-
-EmuHWC2::VirtioGpu::~VirtioGpu() {
-    close(mFd);
-}
-
-int EmuHWC2::VirtioGpu::setCrtc(hwc_drm_bo_t& bo) {
-    int ret = drmModeSetCrtc(mFd, mCrtcId, bo.fb_id,
-                             0, 0, &mConnectorId, 1, &mMode);
-    ALOGV("%s: drm FB %d", __func__, bo.fb_id);
-    if (ret) {
-        ALOGE("%s: drmModeSetCrtc failed: %s (errno %d)",
-              __func__, strerror(errno), errno);
-        return -1;
-    }
-    return 0;
-}
-
-int EmuHWC2::VirtioGpu::getDrmFB(hwc_drm_bo_t& bo) {
-    int ret = drmPrimeFDToHandle(mFd, bo.prime_fds[0], &bo.gem_handles[0]);
-    if (ret) {
-        ALOGE("%s: drmPrimeFDToHandle failed: %s (errno %d)",
-              __func__, strerror(errno), errno);
-        return -1;
-    }
-    ret = drmModeAddFB2(mFd, bo.width, bo.height, bo.format,
-                        bo.gem_handles, bo.pitches, bo.offsets,
-                        &bo.fb_id, 0);
-    if (ret) {
-        ALOGE("%s: drmModeAddFB2 failed: %s (errno %d)",
-              __func__, strerror(errno), errno);
-        return -1;
-    }
-    ALOGV("%s: drm FB %d", __func__, bo.fb_id);
-    return 0;
-}
-
-int EmuHWC2::VirtioGpu::clearDrmFB(hwc_drm_bo_t& bo) {
-    int ret = 0;
-    if (bo.fb_id) {
-        if (drmModeRmFB(mFd, bo.fb_id)) {
-            ALOGE("%s: drmModeRmFB failed: %s (errno %d)",
-                  __func__, strerror(errno), errno);
-        }
-        ret = -1;
-    }
-    if (bo.gem_handles[0]) {
-        struct drm_gem_close gem_close = {};
-        gem_close.handle = bo.gem_handles[0];
-        if (drmIoctl(mFd, DRM_IOCTL_GEM_CLOSE, &gem_close)) {
-            ALOGE("%s: DRM_IOCTL_GEM_CLOSE failed: %s (errno %d)",
-                  __func__, strerror(errno), errno);
-        }
-        ret = -1;
-    }
-    ALOGV("%s: drm FB %d", __func__, bo.fb_id);
-    return ret;
-}
-
-bool EmuHWC2::VirtioGpu::supportComposeWithoutPost() {
-    return true;
-}
-
-int EmuHWC2::VirtioGpu::exportSyncFdAndSetCrtc(hwc_drm_bo_t& bo) {
-    mOutFence = -1;
-
-    drmModeAtomicReqPtr pset = drmModeAtomicAlloc();
-
-    int ret;
-
-    if (!mDidSetCrtc) {
-        ALOGVV("%s: Setting crtc.\n", __func__);
-        ret = drmModeAtomicAddProperty(pset, mCrtcId, mCrtcActivePropretyId, 1);
-        if (ret < 0) { ALOGE("%s:%d: failed %d errno %d\n", __func__, __LINE__, ret, errno); }
-        ret = drmModeAtomicAddProperty(pset, mCrtcId, mCrtcModeIdPropertyId, mModeBlobId);
-        if (ret < 0) { ALOGE("%s:%d: failed %d errno %d\n", __func__, __LINE__, ret, errno); }
-        ret = drmModeAtomicAddProperty(pset, mConnectorId, mConnectorCrtcPropertyId, mCrtcId);
-        if (ret < 0) { ALOGE("%s:%d: failed %d errno %d\n", __func__, __LINE__, ret, errno); }
-
-        mDidSetCrtc = true;
-    } else {
-        ALOGVV("%s: Already set crtc\n", __func__);
-    }
-
-    ret = drmModeAtomicAddProperty(pset, mCrtcId, mOutFencePtrId, (uint64_t)(&mOutFence));
-    if (ret < 0) { ALOGE("%s:%d: failed %d errno %d\n", __func__, __LINE__, ret, errno); }
-
-    ALOGVV("%s: set plane: plane id %d crtcid %d fbid %d bo w h %d %d\n", __func__,
-            mPlaneId, mCrtcId, bo.fb_id, bo.width, bo.height);
-
-    ret = drmModeAtomicAddProperty(pset, mPlaneId, mPlaneCrtcPropertyId, mCrtcId);
-    if (ret < 0) { ALOGE("%s:%d: failed %d errno %d\n", __func__, __LINE__, ret, errno); }
-    ret = drmModeAtomicAddProperty(pset, mPlaneId, mPlaneFbPropertyId, bo.fb_id);
-    if (ret < 0) { ALOGE("%s:%d: failed %d errno %d\n", __func__, __LINE__, ret, errno); }
-    ret = drmModeAtomicAddProperty(pset, mPlaneId, mPlaneCrtcXPropertyId, 0);
-    if (ret < 0) { ALOGE("%s:%d: failed %d errno %d\n", __func__, __LINE__, ret, errno); }
-    ret = drmModeAtomicAddProperty(pset, mPlaneId, mPlaneCrtcYPropertyId, 0);
-    if (ret < 0) { ALOGE("%s:%d: failed %d errno %d\n", __func__, __LINE__, ret, errno); }
-    ret = drmModeAtomicAddProperty(pset, mPlaneId, mPlaneCrtcWPropertyId, bo.width);
-    if (ret < 0) { ALOGE("%s:%d: failed %d errno %d\n", __func__, __LINE__, ret, errno); }
-    ret = drmModeAtomicAddProperty(pset, mPlaneId, mPlaneCrtcHPropertyId, bo.height);
-    if (ret < 0) { ALOGE("%s:%d: failed %d errno %d\n", __func__, __LINE__, ret, errno); }
-    ret = drmModeAtomicAddProperty(pset, mPlaneId, mPlaneSrcXPropertyId, 0);
-    if (ret < 0) { ALOGE("%s:%d: failed %d errno %d\n", __func__, __LINE__, ret, errno); }
-    ret = drmModeAtomicAddProperty(pset, mPlaneId, mPlaneSrcYPropertyId, 0);
-    if (ret < 0) { ALOGE("%s:%d: failed %d errno %d\n", __func__, __LINE__, ret, errno); }
-    ret = drmModeAtomicAddProperty(pset, mPlaneId, mPlaneSrcWPropertyId, bo.width << 16);
-    if (ret < 0) { ALOGE("%s:%d: failed %d errno %d\n", __func__, __LINE__, ret, errno); }
-    ret = drmModeAtomicAddProperty(pset, mPlaneId, mPlaneSrcHPropertyId, bo.height << 16);
-    if (ret < 0) { ALOGE("%s:%d: failed %d errno %d\n", __func__, __LINE__, ret, errno); }
-
-    uint32_t flags = DRM_MODE_ATOMIC_ALLOW_MODESET;
-    ret = drmModeAtomicCommit(mFd, pset, flags, 0);
-
-    if (ret) {
-        ALOGE("%s: Atomic commit failed with %d %d\n", __func__,
-              ret, errno);
-    }
-
-    if (pset)
-        drmModeAtomicFree(pset);
-
-    ALOGVV("%s: out fence: %d\n", __func__, mOutFence);
-    return mOutFence;
-}
-
-EmuHWC2::DrmBuffer::DrmBuffer(const native_handle_t* handle,
-                              VirtioGpu& virtioGpu)
-  : mVirtioGpu(virtioGpu), mBo({}) {
-    if (!convertBoInfo(handle)) {
-        mVirtioGpu.getDrmFB(mBo);
-    }
-}
-
-EmuHWC2::DrmBuffer::~DrmBuffer() {
-    mVirtioGpu.clearDrmFB(mBo);
-}
-
-int EmuHWC2::DrmBuffer::convertBoInfo(const native_handle_t* handle) {
-    cros_gralloc_handle *gr_handle = (cros_gralloc_handle *)handle;
-    if (!gr_handle) {
-      ALOGE("%s: Null buffer handle", __func__);
-      return -1;
-    }
-    mBo.width = gr_handle->width;
-    mBo.height = gr_handle->height;
-    mBo.hal_format = gr_handle->droid_format;
-    mBo.format = gr_handle->format;
-    mBo.usage = gr_handle->usage;
-    mBo.prime_fds[0] = gr_handle->fds[0];
-    mBo.pitches[0] = gr_handle->strides[0];
-    return 0;
-}
-
-int EmuHWC2::DrmBuffer::flush() {
-    return mVirtioGpu.exportSyncFdAndSetCrtc(mBo);
-}
-
-// Adaptor Helpers
-
-void EmuHWC2::populateCapabilities() {
-    //TODO: add Capabilities
-    // support virtualDisplay
-    // support sideBandStream
-    // support backGroundColor
-    // we should not set this for HWC2, TODO: remove
-    // mCapabilities.insert(Capability::PresentFenceIsNotReliable);
-}
-
-int EmuHWC2::populatePrimary() {
-    int ret = 0;
-    auto display = std::make_shared<Display>(*this, HWC2::DisplayType::Physical,
-            mDisplayWidth, mDisplayHeight);
-    ret = display->populatePrimaryConfigs(mDisplayWidth, mDisplayHeight,
-                                          mDisplayDpiX, mDisplayDpiY);
-    if (ret != 0) {
-        return ret;
-    }
-    mDisplays.emplace(display->getId(), std::move(display));
-    return ret;
-}
-
-// Note "hwservicemanager." is used to avoid selinux issue
-#define EXTERANL_DISPLAY_PROP "hwservicemanager.external.displays"
-
-// return 0 for successful, 1 if no external displays are specified
-// return < 0 if failed
-int EmuHWC2::populateSecondaryDisplays() {
-    // this guest property, hwservicemanager.external.displays,
-    // specifies multi-display info, with comma (,) as separator
-    // each display has the following info:
-    //   physicalId,width,height,dpi,flags
-    // serveral displays can be provided, e.g., following has 2 displays:
-    // setprop hwservicemanager.external.displays 1,1200,800,120,0,2,1200,800,120,0
-    std::vector<uint64_t> values;
-    char displaysValue[PROPERTY_VALUE_MAX] = "";
-    property_get(EXTERANL_DISPLAY_PROP, displaysValue, "");
-    bool isValid = displaysValue[0] != '\0';
-    if (isValid) {
-        char *p = displaysValue;
-        while (*p) {
-            if (!isdigit(*p) && *p != ',' && *p != ' ') {
-                isValid = false;
-                break;
-            }
-            p ++;
-        }
-        if (!isValid) {
-            ALOGE("Invalid syntax for the value of system prop: %s", EXTERANL_DISPLAY_PROP);
-        }
-    }
-    if (!isValid) {
-        // no external displays are specified
-        return 1;
-    }
-    // parse all int values to a vector
-    std::istringstream stream(displaysValue);
-    for (uint64_t id; stream >> id;) {
-        values.push_back(id);
-        if (stream.peek() == ',')
-            stream.ignore();
-    }
-    // each display has 5 values
-    if ((values.size() % 5) != 0) {
-        ALOGE("%s: invalid value for system property: %s", __FUNCTION__, EXTERANL_DISPLAY_PROP);
-        return -1;
-    }
-    uint32_t idx = 0;
-    while (!values.empty()) {
-        // uint64_t physicalId = values[0];
-        uint32_t width = values[1];
-        uint32_t height = values[2];
-        uint32_t dpi = values[3];
-        // uint32_t flags = values[4];
-        values.erase(values.begin(), values.begin() + 5);
-
-        Error ret = Error::None;
-        auto display = std::make_shared<Display>(*this, HWC2::DisplayType::Physical, width, height);
-        ret = display->populateSecondaryConfigs(width, height, dpi, idx++);
-        if (ret != Error::None) {
-            return -2;
-        }
-        mDisplays.emplace(display->getId(), std::move(display));
-    }
-    return 0;
-}
-
-EmuHWC2::Display* EmuHWC2::getDisplay(hwc2_display_t id) {
-    auto display = mDisplays.find(id);
-    if (display == mDisplays.end()) {
-        ALOGE("Failed to get display for id=%d", (uint32_t)id);
-        return nullptr;
-    }
-    return display->second.get();
-}
-
-std::tuple<EmuHWC2::Layer*, Error> EmuHWC2::getLayer(
-        hwc2_display_t displayId, hwc2_layer_t layerId) {
-    auto display = getDisplay(displayId);
-    if (!display) {
-        ALOGE("%s: Fail to find display %d", __FUNCTION__, (uint32_t)displayId);
-        return std::make_tuple(static_cast<Layer*>(nullptr), Error::BadDisplay);
-    }
-
-    auto layerEntry = mLayers.find(layerId);
-    if (layerEntry == mLayers.end()) {
-        ALOGE("%s: Fail to find layer %d", __FUNCTION__, (uint32_t)layerId);
-        return std::make_tuple(static_cast<Layer*>(nullptr), Error::BadLayer);
-    }
-
-    auto layer = layerEntry->second;
-    if (layer->getDisplay().getId() != displayId) {
-        ALOGE("%s: layer %d not belongs to display %d", __FUNCTION__,
-              (uint32_t)layerId, (uint32_t)displayId);
-        return std::make_tuple(static_cast<Layer*>(nullptr), Error::BadLayer);
-    }
-    return std::make_tuple(layer.get(), Error::None);
-}
-
-static int hwc2DevOpen(const struct hw_module_t *module, const char *name,
-        struct hw_device_t **dev) {
-    ALOGVV("%s ", __FUNCTION__);
-    if (strcmp(name, HWC_HARDWARE_COMPOSER)) {
-        ALOGE("Invalid module name- %s", name);
-        return -EINVAL;
-    }
-
-    EmuHWC2* ctx = new EmuHWC2();
-    if (!ctx) {
-        ALOGE("Failed to allocate EmuHWC2");
-        return -ENOMEM;
-    }
-    int ret = ctx->populatePrimary();
-    if (ret != 0) {
-        ALOGE("Failed to populate primary display");
-        return ret;
-    }
-
-    ret = ctx->populateSecondaryDisplays();
-    if (ret < 0) {
-        ALOGE("Failed to populate secondary displays");
-        return ret;
-    }
-
-    ctx->common.module = const_cast<hw_module_t *>(module);
-    *dev = &ctx->common;
-    return 0;
-}
-}
-
-static struct hw_module_methods_t hwc2_module_methods = {
-    .open = android::hwc2DevOpen
-};
-
-hw_module_t HAL_MODULE_INFO_SYM = {
-    .tag = HARDWARE_MODULE_TAG,
-    .version_major = 2,
-    .version_minor = 0,
-    .id = HWC_HARDWARE_MODULE_ID,
-    .name = "goldfish HWC2 module",
-    .author = "The Android Open Source Project",
-    .methods = &hwc2_module_methods,
-    .dso = NULL,
-    .reserved = {0},
-};
diff --git a/system/hwc2/EmuHWC2.h b/system/hwc2/EmuHWC2.h
deleted file mode 100644
index d0fb01a..0000000
--- a/system/hwc2/EmuHWC2.h
+++ /dev/null
@@ -1,563 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ANDROID_HW_EMU_HWC2_H
-#define ANDROID_HW_EMU_HWC2_H
-
-#define HWC2_INCLUDE_STRINGIFICATION
-#define HWC2_USE_CPP11
-#include <hardware/hwcomposer2.h>
-#undef HWC2_INCLUDE_STRINGIFICATION
-#undef HWC2_USE_CPP11
-#include <utils/Thread.h>
-
-#include <android-base/unique_fd.h>
-#include <atomic>
-#include <map>
-#include <memory>
-#include <mutex>
-#include <numeric>
-#include <sstream>
-#include <vector>
-#include <unordered_set>
-#include <unordered_map>
-#include <set>
-#include <xf86drm.h>
-#include <xf86drmMode.h>
-
-#include <cutils/native_handle.h>
-
-#include "include/drmhwcgralloc.h"
-#include "HostConnection.h"
-
-namespace android {
-
-class EmuHWC2 : public hwc2_device_t {
-public:
-    EmuHWC2();
-    int populatePrimary();
-    int populateSecondaryDisplays();
-
-private:
-    static inline EmuHWC2* getHWC2(hwc2_device_t* device) {
-        return static_cast<EmuHWC2*>(device);
-    }
-
-    static int closeHook(hw_device_t* device) {
-        EmuHWC2 *ctx = reinterpret_cast<EmuHWC2*>(device);
-        delete ctx;
-        return 0;
-    }
-
-    // getCapabilities
-    void doGetCapabilities(uint32_t* outCount, int32_t* outCapabilities);
-    static void getCapabilitiesHook(hwc2_device_t* device, uint32_t* outCount,
-                                int32_t* outCapabilities) {
-        getHWC2(device)->doGetCapabilities(outCount, outCapabilities);
-    }
-
-    // getFunction
-    hwc2_function_pointer_t doGetFunction(HWC2::FunctionDescriptor descriptor);
-    static hwc2_function_pointer_t getFunctionHook(hwc2_device_t* device,
-            int32_t desc) {
-        auto descriptor = static_cast<HWC2::FunctionDescriptor>(desc);
-        return getHWC2(device)->doGetFunction(descriptor);
-    }
-
-    // Device functions
-    HWC2::Error createVirtualDisplay(uint32_t width, uint32_t height,
-            int32_t* format, hwc2_display_t* outDisplay);
-    static int32_t createVirtualDisplayHook(hwc2_device_t* device,
-            uint32_t width, uint32_t height, int32_t* format,
-            hwc2_display_t* outDisplay) {
-        auto error = getHWC2(device)->createVirtualDisplay(width, height,
-                format, outDisplay);
-        return static_cast<int32_t>(error);
-    }
-
-    HWC2::Error destroyVirtualDisplay(hwc2_display_t display);
-    static int32_t destroyVirtualDisplayHook(hwc2_device_t* device,
-            hwc2_display_t display) {
-        auto error = getHWC2(device)->destroyVirtualDisplay(display);
-        return static_cast<int32_t>(error);
-    }
-
-    std::string mDumpString;
-    void dump(uint32_t* outSize, char* outBuffer);
-    static void dumpHook(hwc2_device_t* device, uint32_t* outSize,
-            char* outBuffer) {
-        getHWC2(device)->dump(outSize, outBuffer);
-    }
-
-    uint32_t getMaxVirtualDisplayCount();
-    static uint32_t getMaxVirtualDisplayCountHook(hwc2_device_t* device) {
-        return getHWC2(device)->getMaxVirtualDisplayCount();
-    }
-
-    HWC2::Error registerCallback(HWC2::Callback descriptor,
-            hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer);
-    static int32_t registerCallbackHook(hwc2_device_t* device,
-            int32_t intDesc, hwc2_callback_data_t callbackData,
-            hwc2_function_pointer_t pointer) {
-        auto descriptor = static_cast<HWC2::Callback>(intDesc);
-        auto error = getHWC2(device)->registerCallback(descriptor,
-                callbackData, pointer);
-        return static_cast<int32_t>(error);
-    }
-
-    class Layer;
-    class SortLayersByZ {
-    public:
-        bool operator()(const std::shared_ptr<Layer>& lhs,
-                    const std::shared_ptr<Layer>& rhs) const;
-    };
-
-    // SurfaceFlinger sets the ColorBuffer and its Fence handler for each
-    // layer. This class is a container for these two.
-    class FencedBuffer {
-        public:
-            FencedBuffer() : mBuffer(nullptr) {}
-
-            void setBuffer(buffer_handle_t buffer) { mBuffer = buffer; }
-            void setFence(int fenceFd) {
-                mFence = std::make_shared<base::unique_fd>(fenceFd);
-            }
-
-            buffer_handle_t getBuffer() const { return mBuffer; }
-            int getFence() const { return mFence ? dup(mFence->get()) : -1; }
-
-        private:
-            buffer_handle_t mBuffer;
-            std::shared_ptr<base::unique_fd> mFence;
-    };
-
-    typedef struct compose_layer {
-        uint32_t cbHandle;
-        hwc2_composition_t composeMode;
-        hwc_rect_t displayFrame;
-        hwc_frect_t crop;
-        int32_t blendMode;
-        float alpha;
-        hwc_color_t color;
-        hwc_transform_t transform;
-    } ComposeLayer;
-    typedef struct compose_device {
-        uint32_t version;
-        uint32_t targetHandle;
-        uint32_t numLayers;
-        struct compose_layer layer[0];
-    } ComposeDevice;
-    typedef struct compose_device_v2 {
-        uint32_t version;
-        uint32_t displayId;
-        uint32_t targetHandle;
-        uint32_t numLayers;
-        struct compose_layer layer[0];
-    } ComposeDevice_v2;
-
-    class ComposeMsg {
-    public:
-        ComposeMsg(uint32_t layerCnt = 0) :
-          mData(sizeof(ComposeDevice) + layerCnt * sizeof(ComposeLayer))
-        {
-            mComposeDevice = reinterpret_cast<ComposeDevice*>(mData.data());
-            mLayerCnt = layerCnt;
-        }
-
-        ComposeDevice* get() { return mComposeDevice; }
-
-        uint32_t getLayerCnt() { return mLayerCnt; }
-
-    private:
-        std::vector<uint8_t> mData;
-        uint32_t mLayerCnt;
-        ComposeDevice* mComposeDevice;
-    };
-
-    class ComposeMsg_v2 {
-    public:
-        ComposeMsg_v2(uint32_t layerCnt = 0) :
-          mData(sizeof(ComposeDevice_v2) + layerCnt * sizeof(ComposeLayer))
-        {
-            mComposeDevice = reinterpret_cast<ComposeDevice_v2*>(mData.data());
-            mLayerCnt = layerCnt;
-        }
-
-        ComposeDevice_v2* get() { return mComposeDevice; }
-
-        uint32_t getLayerCnt() { return mLayerCnt; }
-
-    private:
-        std::vector<uint8_t> mData;
-        uint32_t mLayerCnt;
-        ComposeDevice_v2* mComposeDevice;
-    };
-
-    class VirtioGpu {
-    public:
-        VirtioGpu();
-        ~VirtioGpu();
-        int setCrtc(hwc_drm_bo_t& fb);
-        int getDrmFB(hwc_drm_bo_t& bo);
-        int clearDrmFB(hwc_drm_bo_t& bo);
-        bool supportComposeWithoutPost();
-        uint32_t refreshRate() const {
-            return mRefreshRateAsInteger;
-        }
-
-        int exportSyncFdAndSetCrtc(hwc_drm_bo_t& fb);
-
-    private:
-        drmModeModeInfo mMode;
-        int32_t mFd = -1;
-        uint32_t mConnectorId;
-        uint32_t mCrtcId;
-
-        uint32_t mConnectorCrtcPropertyId;
-
-        uint32_t mOutFencePtrId;
-        uint32_t mCrtcActivePropretyId;
-        uint32_t mCrtcModeIdPropertyId;
-        uint32_t mModeBlobId;
-
-        uint32_t mPlaneId;
-        uint32_t mPlaneCrtcPropertyId;
-        uint32_t mPlaneFbPropertyId;
-        uint32_t mPlaneCrtcXPropertyId;
-        uint32_t mPlaneCrtcYPropertyId;
-        uint32_t mPlaneCrtcWPropertyId;
-        uint32_t mPlaneCrtcHPropertyId;
-        uint32_t mPlaneSrcXPropertyId;
-        uint32_t mPlaneSrcYPropertyId;
-        uint32_t mPlaneSrcWPropertyId;
-        uint32_t mPlaneSrcHPropertyId;
-        uint32_t mPlaneTypePropertyId;
-        float mRefreshRateAsFloat;
-        uint32_t mRefreshRateAsInteger;
-
-        int mOutFence;
-
-        bool mDidSetCrtc = false;
-    };
-
-    class DrmBuffer {
-    public:
-        DrmBuffer(const native_handle_t* handle, VirtioGpu& virtioGpu);
-        ~DrmBuffer();
-        int flush();
-    private:
-        int convertBoInfo(const native_handle_t* handle);
-        VirtioGpu& mVirtioGpu;
-        hwc_drm_bo_t mBo;
-    };
-
-
-    class Display {
-    public:
-        Display(EmuHWC2& device, HWC2::DisplayType type, int width, int height);
-        ~Display();
-        hwc2_display_t getId() const {return mId;}
-
-        // HWC2 Display functions
-        HWC2::Error acceptChanges();
-        HWC2::Error createLayer(hwc2_layer_t* outLayerId);
-        HWC2::Error destroyLayer(hwc2_layer_t layerId);
-        HWC2::Error getActiveConfig(hwc2_config_t* outConfigId);
-        HWC2::Error getDisplayAttribute(hwc2_config_t configId,
-                int32_t attribute, int32_t* outValue);
-        HWC2::Error getChangedCompositionTypes(uint32_t* outNumElements,
-                hwc2_layer_t* outLayers, int32_t* outTypes);
-        HWC2::Error getColorModes(uint32_t* outNumModes, int32_t* outModes);
-        HWC2::Error getConfigs(uint32_t* outNumConfigs,
-                hwc2_config_t* outConfigIds);
-        HWC2::Error getDozeSupport(int32_t* outSupport);
-        HWC2::Error getHdrCapabilities(uint32_t* outNumTypes,
-                int32_t* outTypes, float* outMaxLuminance,
-                float* outMaxAverageLuminance, float* outMinLuminance);
-        HWC2::Error getName(uint32_t* outSize, char* outName);
-        HWC2::Error getReleaseFences(uint32_t* outNumElements,
-                hwc2_layer_t* outLayers, int32_t* outFences);
-        HWC2::Error getRequests(int32_t* outDisplayRequests,
-                uint32_t* outNumElements, hwc2_layer_t* outLayers,
-                int32_t* outLayerRequests);
-        HWC2::Error getType(int32_t* outType);
-        HWC2::Error present(int32_t* outRetireFence);
-        HWC2::Error setActiveConfig(hwc2_config_t configId);
-        HWC2::Error setClientTarget(buffer_handle_t target,
-                int32_t acquireFence, int32_t dataspace,
-                hwc_region_t damage);
-        HWC2::Error setColorMode(int32_t mode);
-        HWC2::Error setColorTransform(const float* matrix,
-                int32_t hint);
-        HWC2::Error setOutputBuffer(buffer_handle_t buffer,
-                int32_t releaseFence);
-        HWC2::Error setPowerMode(int32_t mode);
-        HWC2::Error setVsyncEnabled(int32_t enabled);
-        HWC2::Error validate(uint32_t* outNumTypes,
-                uint32_t* outNumRequests);
-        HWC2::Error updateLayerZ(hwc2_layer_t layerId, uint32_t z);
-        HWC2::Error getClientTargetSupport(uint32_t width, uint32_t height,
-                 int32_t format, int32_t dataspace);
-        // 2.3 required functions
-        HWC2::Error getDisplayIdentificationData(uint8_t* outPort,
-                 uint32_t* outDataSize, uint8_t* outData);
-        HWC2::Error getDisplayCapabilities(uint32_t* outNumCapabilities,
-                 uint32_t* outCapabilities);
-        HWC2::Error getDisplayBrightnessSupport(bool *out_support);
-        HWC2::Error setDisplayBrightness(float brightness);
-
-        // Read configs from PRIMARY Display
-        int populatePrimaryConfigs(int width, int height, int dpiX, int dpiY);
-        HWC2::Error populateSecondaryConfigs(uint32_t width, uint32_t height,
-                 uint32_t dpi, uint32_t idx);
-
-    private:
-        void post(HostConnection *hostCon, ExtendedRCEncoderContext *rcEnc,
-                  buffer_handle_t h);
-
-        class Config {
-        public:
-            Config(Display& display)
-              : mDisplay(display),
-                mId(0),
-                mAttributes() {}
-
-            bool isOnDisplay(const Display& display) const {
-                return display.getId() == mDisplay.getId();
-            }
-            void setAttribute(HWC2::Attribute attribute, int32_t value);
-            int32_t getAttribute(HWC2::Attribute attribute) const;
-            void setId(hwc2_config_t id) {mId = id; }
-            hwc2_config_t getId() const {return mId; }
-            std::string toString() const;
-
-        private:
-            Display& mDisplay;
-            hwc2_config_t mId;
-            std::unordered_map<HWC2::Attribute, int32_t> mAttributes;
-        };
-
-        // Stores changes requested from the device upon calling prepare().
-        // Handles change request to:
-        //   - Layer composition type.
-        //   - Layer hints.
-        class Changes {
-            public:
-                uint32_t getNumTypes() const {
-                    return static_cast<uint32_t>(mTypeChanges.size());
-                }
-
-                uint32_t getNumLayerRequests() const {
-                    return static_cast<uint32_t>(mLayerRequests.size());
-                }
-
-                const std::unordered_map<hwc2_layer_t, HWC2::Composition>&
-                        getTypeChanges() const {
-                    return mTypeChanges;
-                }
-
-                const std::unordered_map<hwc2_layer_t, HWC2::LayerRequest>&
-                        getLayerRequests() const {
-                    return mLayerRequests;
-                }
-
-                void addTypeChange(hwc2_layer_t layerId,
-                        HWC2::Composition type) {
-                    mTypeChanges.insert({layerId, type});
-                }
-
-                void clearTypeChanges() { mTypeChanges.clear(); }
-
-                void addLayerRequest(hwc2_layer_t layerId,
-                        HWC2::LayerRequest request) {
-                    mLayerRequests.insert({layerId, request});
-                }
-
-            private:
-                std::unordered_map<hwc2_layer_t, HWC2::Composition>
-                        mTypeChanges;
-                std::unordered_map<hwc2_layer_t, HWC2::LayerRequest>
-                        mLayerRequests;
-        };
-
-        // Generate sw vsync signal
-        class VsyncThread : public Thread {
-        public:
-            VsyncThread(Display& display)
-              : mDisplay(display) {}
-            virtual ~VsyncThread() {}
-        private:
-            Display& mDisplay;
-            bool threadLoop() final;
-        };
-
-    private:
-        EmuHWC2& mDevice;
-        // Display ID generator.
-        static std::atomic<hwc2_display_t> sNextId;
-        static const uint32_t hostDisplayIdStart = 6;
-        bool mIsMinigbm;
-        const hwc2_display_t mId;
-        // emulator side displayId
-        uint32_t mHostDisplayId;
-        std::string mName;
-        HWC2::DisplayType mType;
-        HWC2::PowerMode mPowerMode;
-        HWC2::Vsync mVsyncEnabled;
-        uint32_t mVsyncPeriod;
-        VsyncThread mVsyncThread;
-        FencedBuffer mClientTarget;
-        // Will only be non-null after the Display has been validated and
-        // before it has been presented
-        std::unique_ptr<Changes> mChanges;
-        // All layers this Display is aware of.
-        std::multiset<std::shared_ptr<Layer>, SortLayersByZ> mLayers;
-        std::vector<hwc2_display_t> mReleaseLayerIds;
-        std::vector<int32_t> mReleaseFences;
-        std::vector<std::shared_ptr<Config>> mConfigs;
-        std::shared_ptr<const Config> mActiveConfig;
-        std::set<android_color_mode_t> mColorModes;
-        android_color_mode_t mActiveColorMode;
-        bool mSetColorTransform;
-        // The state of this display should only be modified from
-        // SurfaceFlinger's main loop, with the exception of when dump is
-        // called. To prevent a bad state from crashing us during a dump
-        // call, all public calls into Display must acquire this mutex.
-        mutable std::mutex mStateMutex;
-        std::unique_ptr<ComposeMsg> mComposeMsg;
-        std::unique_ptr<ComposeMsg_v2> mComposeMsg_v2;
-        int mSyncDeviceFd;
-        const native_handle_t* mTargetCb;
-        std::unique_ptr<DrmBuffer> mTargetDrmBuffer;
-        std::unique_ptr<DrmBuffer> mClientTargetDrmBuffer;
-    };
-
-    template<typename MF, MF memFunc, typename ...Args>
-    static int32_t displayHook(hwc2_device_t* device, hwc2_display_t displayId,
-            Args... args) {
-        auto display = getHWC2(device)->getDisplay(displayId);
-        if (!display) {
-            return static_cast<int32_t>(HWC2::Error::BadDisplay);
-        }
-        auto error = ((*display).*memFunc)(std::forward<Args>(args)...);
-        return static_cast<int32_t>(error);
-    }
-
-    class Layer {
-    public:
-        explicit Layer(Display& display);
-        Display& getDisplay() const {return mDisplay;}
-        hwc2_layer_t getId() const {return mId;}
-        bool operator==(const Layer& other) { return mId == other.mId; }
-        bool operator!=(const Layer& other) { return !(*this == other); }
-
-        // HWC2 Layer functions
-        HWC2::Error setBuffer(buffer_handle_t buffer, int32_t acquireFence);
-        HWC2::Error setCursorPosition(int32_t x, int32_t y);
-        HWC2::Error setSurfaceDamage(hwc_region_t damage);
-
-        // HWC2 Layer state functions
-        HWC2::Error setBlendMode(int32_t mode);
-        HWC2::Error setColor(hwc_color_t color);
-        HWC2::Error setCompositionType(int32_t type);
-        HWC2::Error setDataspace(int32_t dataspace);
-        HWC2::Error setDisplayFrame(hwc_rect_t frame);
-        HWC2::Error setPlaneAlpha(float alpha);
-        HWC2::Error setSidebandStream(const native_handle_t* stream);
-        HWC2::Error setSourceCrop(hwc_frect_t crop);
-        HWC2::Error setTransform(int32_t transform);
-        HWC2::Error setVisibleRegion(hwc_region_t visible);
-        HWC2::Error setZ(uint32_t z);
-
-        HWC2::Composition getCompositionType() const {
-            return mCompositionType;
-        }
-        hwc_color_t getColor() {return mColor; }
-        uint32_t getZ() {return mZ; }
-        std::size_t getNumVisibleRegions() {return mVisibleRegion.size(); }
-        FencedBuffer& getLayerBuffer() {return mBuffer; }
-        int32_t getBlendMode() {return (int32_t)mBlendMode; }
-        float getPlaneAlpha() {return mPlaneAlpha; }
-        hwc_frect_t getSourceCrop() {return mSourceCrop; }
-        hwc_rect_t getDisplayFrame() {return mDisplayFrame; }
-        hwc_transform_t getTransform() {return (hwc_transform_t)mTransform; }
-    private:
-        static std::atomic<hwc2_layer_t> sNextId;
-        const hwc2_layer_t mId;
-        Display& mDisplay;
-        FencedBuffer mBuffer;
-        std::vector<hwc_rect_t> mSurfaceDamage;
-
-        HWC2::BlendMode mBlendMode;
-        hwc_color_t mColor;
-        HWC2::Composition mCompositionType;
-        hwc_rect_t mDisplayFrame;
-        float mPlaneAlpha;
-        const native_handle_t* mSidebandStream;
-        hwc_frect_t mSourceCrop;
-        HWC2::Transform mTransform;
-        std::vector<hwc_rect_t> mVisibleRegion;
-        uint32_t mZ;
-    };
-
-    template <typename MF, MF memFunc, typename ...Args>
-    static int32_t layerHook(hwc2_device_t* device, hwc2_display_t displayId,
-            hwc2_layer_t layerId, Args... args) {
-        auto result = getHWC2(device)->getLayer(displayId, layerId);
-        auto error = std::get<HWC2::Error>(result);
-        if (error == HWC2::Error::None) {
-            auto layer = std::get<Layer*>(result);
-            error = ((*layer).*memFunc)(std::forward<Args>(args)...);
-        }
-        return static_cast<int32_t>(error);
-    }
-
-    // helpers
-    void populateCapabilities();
-    Display* getDisplay(hwc2_display_t id);
-    std::tuple<Layer*, HWC2::Error> getLayer(hwc2_display_t displayId,
-            hwc2_layer_t layerId);
-
-    HWC2::Error initDisplayParameters();
-    const native_handle_t* allocateDisplayColorBuffer(int width, int height);
-    void freeDisplayColorBuffer(const native_handle_t* h);
-
-    std::unordered_set<HWC2::Capability> mCapabilities;
-
-    // These are potentially accessed from multiple threads, and are protected
-    // by this mutex.
-    std::mutex mStateMutex;
-
-    struct CallbackInfo {
-        hwc2_callback_data_t data;
-        hwc2_function_pointer_t pointer;
-    };
-    std::unordered_map<HWC2::Callback, CallbackInfo> mCallbacks;
-
-    // use map so displays can be pluged in by order of ID, 0, 1, 2, 3, etc.
-    std::map<hwc2_display_t, std::shared_ptr<Display>> mDisplays;
-    std::unordered_map<hwc2_layer_t, std::shared_ptr<Layer>> mLayers;
-
-    int mDisplayWidth;
-    int mDisplayHeight;
-    int mDisplayDpiX;
-    int mDisplayDpiY;
-
-    VirtioGpu mVirtioGpu;
-};
-
-}
-#endif
diff --git a/system/hwc2/FencedBuffer.h b/system/hwc2/FencedBuffer.h
new file mode 100644
index 0000000..dcbd094
--- /dev/null
+++ b/system/hwc2/FencedBuffer.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_HWC_FENCEDBUFFER_H
+#define ANDROID_HWC_FENCEDBUFFER_H
+
+#include <android-base/unique_fd.h>
+#include <cutils/native_handle.h>
+
+namespace android {
+
+class FencedBuffer {
+ public:
+  FencedBuffer() : mBuffer(nullptr) {}
+
+  void setBuffer(buffer_handle_t buffer) { mBuffer = buffer; }
+  void setFence(int fenceFd) {
+    mFence = std::make_shared<base::unique_fd>(fenceFd);
+  }
+
+  buffer_handle_t getBuffer() const { return mBuffer; }
+  int getFence() const { return mFence ? dup(mFence->get()) : -1; }
+
+ private:
+  buffer_handle_t mBuffer;
+  std::shared_ptr<android::base::unique_fd> mFence;
+};
+
+}  // namespace android
+
+#endif
\ No newline at end of file
diff --git a/system/hwc2/Gralloc.cpp b/system/hwc2/Gralloc.cpp
new file mode 100644
index 0000000..ec33240
--- /dev/null
+++ b/system/hwc2/Gralloc.cpp
@@ -0,0 +1,493 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Gralloc.h"
+
+#include <aidl/android/hardware/graphics/common/PlaneLayoutComponent.h>
+#include <aidl/android/hardware/graphics/common/PlaneLayoutComponentType.h>
+#include <drm_fourcc.h>
+#include <gralloctypes/Gralloc4.h>
+#include <hidl/ServiceManagement.h>
+#include <log/log.h>
+
+#include <algorithm>
+
+#include "Drm.h"
+
+using aidl::android::hardware::graphics::common::PlaneLayout;
+using aidl::android::hardware::graphics::common::PlaneLayoutComponent;
+using aidl::android::hardware::graphics::common::PlaneLayoutComponentType;
+using android::hardware::hidl_handle;
+using android::hardware::hidl_vec;
+using android::hardware::graphics::common::V1_2::BufferUsage;
+using android::hardware::graphics::mapper::V4_0::Error;
+using android::hardware::graphics::mapper::V4_0::IMapper;
+using MetadataType =
+    android::hardware::graphics::mapper::V4_0::IMapper::MetadataType;
+
+namespace android {
+
+Gralloc::Gralloc() {
+  android::hardware::preloadPassthroughService<IMapper>();
+
+  gralloc4_ = IMapper::getService();
+  if (gralloc4_ != nullptr) {
+    ALOGE("%s using Gralloc4.", __FUNCTION__);
+    return;
+  }
+  ALOGE("%s Gralloc4 not available.", __FUNCTION__);
+
+  ALOGE("%s No Grallocs available!", __FUNCTION__);
+}
+
+Error Gralloc::GetMetadata(buffer_handle_t buffer, MetadataType type,
+                           hidl_vec<uint8_t>* metadata) {
+  if (gralloc4_ == nullptr) {
+    ALOGE("%s Gralloc4 not available.", __FUNCTION__);
+    return Error::NO_RESOURCES;
+  }
+
+  if (metadata == nullptr) {
+    return Error::BAD_VALUE;
+  }
+
+  Error error = Error::NONE;
+
+  auto native_handle = const_cast<native_handle_t*>(buffer);
+
+  auto ret =
+      gralloc4_->get(native_handle, type,
+                     [&](const auto& get_error, const auto& get_metadata) {
+                       error = get_error;
+                       *metadata = get_metadata;
+                     });
+
+  if (!ret.isOk()) {
+    error = Error::NO_RESOURCES;
+  }
+
+  if (error != Error::NONE) {
+    ALOGE("%s failed to get metadata %s", __FUNCTION__, type.name.c_str());
+  }
+  return error;
+}
+
+std::optional<uint32_t> Gralloc::GetWidth(buffer_handle_t buffer) {
+  if (gralloc4_ == nullptr) {
+    ALOGE("%s Gralloc4 not available.", __FUNCTION__);
+    return std::nullopt;
+  }
+
+  hidl_vec<uint8_t> encoded_width;
+
+  Error error = GetMetadata(buffer, android::gralloc4::MetadataType_Width,
+                            &encoded_width);
+  if (error != Error::NONE) {
+    return std::nullopt;
+  }
+
+  uint64_t width = 0;
+  android::gralloc4::decodeWidth(encoded_width, &width);
+  return static_cast<uint32_t>(width);
+}
+
+std::optional<uint32_t> Gralloc::GetHeight(buffer_handle_t buffer) {
+  if (gralloc4_ == nullptr) {
+    ALOGE("%s Gralloc4 not available.", __FUNCTION__);
+    return std::nullopt;
+  }
+
+  hidl_vec<uint8_t> encoded_height;
+
+  Error error = GetMetadata(buffer, android::gralloc4::MetadataType_Height,
+                            &encoded_height);
+  if (error != Error::NONE) {
+    return std::nullopt;
+  }
+
+  uint64_t height = 0;
+  android::gralloc4::decodeHeight(encoded_height, &height);
+  return static_cast<uint32_t>(height);
+}
+
+std::optional<uint32_t> Gralloc::GetDrmFormat(buffer_handle_t buffer) {
+  if (gralloc4_ == nullptr) {
+    ALOGE("%s Gralloc4 not available.", __FUNCTION__);
+    return std::nullopt;
+  }
+
+  hidl_vec<uint8_t> encoded_format;
+
+  Error error =
+      GetMetadata(buffer, android::gralloc4::MetadataType_PixelFormatFourCC,
+                  &encoded_format);
+  if (error != Error::NONE) {
+    return std::nullopt;
+  }
+
+  uint32_t format = 0;
+  android::gralloc4::decodePixelFormatFourCC(encoded_format, &format);
+  return static_cast<uint32_t>(format);
+}
+
+std::optional<std::vector<PlaneLayout>> Gralloc::GetPlaneLayouts(
+    buffer_handle_t buffer) {
+  if (gralloc4_ == nullptr) {
+    ALOGE("%s Gralloc4 not available.", __FUNCTION__);
+    return std::nullopt;
+  }
+
+  hidl_vec<uint8_t> encoded_layouts;
+
+  Error error = GetMetadata(
+      buffer, android::gralloc4::MetadataType_PlaneLayouts, &encoded_layouts);
+  if (error != Error::NONE) {
+    return std::nullopt;
+  }
+
+  std::vector<PlaneLayout> plane_layouts;
+  android::gralloc4::decodePlaneLayouts(encoded_layouts, &plane_layouts);
+  return plane_layouts;
+}
+
+std::optional<uint32_t> Gralloc::GetMonoPlanarStrideBytes(
+    buffer_handle_t buffer) {
+  if (gralloc4_ == nullptr) {
+    ALOGE("%s Gralloc4 not available.", __FUNCTION__);
+    return std::nullopt;
+  }
+
+  auto plane_layouts_opt = GetPlaneLayouts(buffer);
+  if (!plane_layouts_opt) {
+    return std::nullopt;
+  }
+
+  std::vector<PlaneLayout>& plane_layouts = *plane_layouts_opt;
+  if (plane_layouts.size() != 1) {
+    return std::nullopt;
+  }
+
+  return static_cast<uint32_t>(plane_layouts[0].strideInBytes);
+}
+
+std::optional<GrallocBuffer> Gralloc::Import(buffer_handle_t buffer) {
+  if (gralloc4_ == nullptr) {
+    ALOGE("%s Gralloc4 not available.", __FUNCTION__);
+    return std::nullopt;
+  }
+
+  buffer_handle_t imported_buffer;
+
+  Error error;
+  auto ret =
+      gralloc4_->importBuffer(buffer, [&](const auto& err, const auto& buf) {
+        error = err;
+        if (err == Error::NONE) {
+          imported_buffer = static_cast<buffer_handle_t>(buf);
+        }
+      });
+
+  if (!ret.isOk() || error != Error::NONE) {
+    ALOGE("%s failed to import buffer", __FUNCTION__);
+    return std::nullopt;
+  }
+  return GrallocBuffer(this, imported_buffer);
+}
+
+void Gralloc::Release(buffer_handle_t buffer) {
+  if (gralloc4_ == nullptr) {
+    ALOGE("%s Gralloc4 not available.", __FUNCTION__);
+    return;
+  }
+
+  auto native_buffer = const_cast<native_handle_t*>(buffer);
+  auto ret = gralloc4_->freeBuffer(native_buffer);
+
+  if (!ret.isOk()) {
+    ALOGE("%s failed to release buffer", __FUNCTION__);
+  }
+}
+
+std::optional<void*> Gralloc::Lock(buffer_handle_t buffer) {
+  if (gralloc4_ == nullptr) {
+    ALOGE("%s Gralloc4 not available.", __FUNCTION__);
+    return std::nullopt;
+  }
+
+  auto native_buffer = const_cast<native_handle_t*>(buffer);
+
+  const auto buffer_usage = static_cast<uint64_t>(BufferUsage::CPU_READ_OFTEN |
+                                                  BufferUsage::CPU_WRITE_OFTEN);
+
+  auto width_opt = GetWidth(buffer);
+  if (!width_opt) {
+    return std::nullopt;
+  }
+
+  auto height_opt = GetHeight(buffer);
+  if (!height_opt) {
+    return std::nullopt;
+  }
+
+  IMapper::Rect buffer_region;
+  buffer_region.left = 0;
+  buffer_region.top = 0;
+  buffer_region.width = *width_opt;
+  buffer_region.height = *height_opt;
+
+  // Empty fence, lock immedietly.
+  hidl_handle fence;
+
+  Error error = Error::NONE;
+  void* data = nullptr;
+
+  auto ret =
+      gralloc4_->lock(native_buffer, buffer_usage, buffer_region, fence,
+                      [&](const auto& lock_error, const auto& lock_data) {
+                        error = lock_error;
+                        if (lock_error == Error::NONE) {
+                          data = lock_data;
+                        }
+                      });
+
+  if (!ret.isOk()) {
+    error = Error::NO_RESOURCES;
+  }
+
+  if (error != Error::NONE) {
+    ALOGE("%s failed to lock buffer", __FUNCTION__);
+    return std::nullopt;
+  }
+
+  return data;
+}
+
+std::optional<android_ycbcr> Gralloc::LockYCbCr(buffer_handle_t buffer) {
+  if (gralloc4_ == nullptr) {
+    ALOGE("%s Gralloc4 not available.", __FUNCTION__);
+    return std::nullopt;
+  }
+
+  auto format_opt = GetDrmFormat(buffer);
+  if (!format_opt) {
+    ALOGE("%s failed to check format of buffer", __FUNCTION__);
+    return std::nullopt;
+  }
+
+  if (*format_opt != DRM_FORMAT_NV12 && *format_opt != DRM_FORMAT_NV21 &&
+      *format_opt != DRM_FORMAT_YVU420) {
+    ALOGE("%s called on non-ycbcr buffer", __FUNCTION__);
+    return std::nullopt;
+  }
+
+  auto lock_opt = Lock(buffer);
+  if (!lock_opt) {
+    ALOGE("%s failed to lock buffer", __FUNCTION__);
+    return std::nullopt;
+  }
+
+  auto plane_layouts_opt = GetPlaneLayouts(buffer);
+  if (!plane_layouts_opt) {
+    ALOGE("%s failed to get plane layouts", __FUNCTION__);
+    return std::nullopt;
+  }
+
+  android_ycbcr buffer_ycbcr;
+  buffer_ycbcr.y = nullptr;
+  buffer_ycbcr.cb = nullptr;
+  buffer_ycbcr.cr = nullptr;
+  buffer_ycbcr.ystride = 0;
+  buffer_ycbcr.cstride = 0;
+  buffer_ycbcr.chroma_step = 0;
+
+  for (const auto& plane_layout : *plane_layouts_opt) {
+    for (const auto& plane_layout_component : plane_layout.components) {
+      const auto& type = plane_layout_component.type;
+
+      if (!android::gralloc4::isStandardPlaneLayoutComponentType(type)) {
+        continue;
+      }
+
+      auto* component_data = reinterpret_cast<uint8_t*>(*lock_opt) +
+                             plane_layout.offsetInBytes +
+                             plane_layout_component.offsetInBits / 8;
+
+      switch (static_cast<PlaneLayoutComponentType>(type.value)) {
+        case PlaneLayoutComponentType::Y:
+          buffer_ycbcr.y = component_data;
+          buffer_ycbcr.ystride = plane_layout.strideInBytes;
+          break;
+        case PlaneLayoutComponentType::CB:
+          buffer_ycbcr.cb = component_data;
+          buffer_ycbcr.cstride = plane_layout.strideInBytes;
+          buffer_ycbcr.chroma_step = plane_layout.sampleIncrementInBits / 8;
+          break;
+        case PlaneLayoutComponentType::CR:
+          buffer_ycbcr.cr = component_data;
+          buffer_ycbcr.cstride = plane_layout.strideInBytes;
+          buffer_ycbcr.chroma_step = plane_layout.sampleIncrementInBits / 8;
+          break;
+        default:
+          break;
+      }
+    }
+  }
+
+  return buffer_ycbcr;
+}
+
+void Gralloc::Unlock(buffer_handle_t buffer) {
+  if (gralloc4_ == nullptr) {
+    ALOGE("%s Gralloc4 not available.", __FUNCTION__);
+    return;
+  }
+
+  auto native_handle = const_cast<native_handle_t*>(buffer);
+
+  Error error = Error::NONE;
+  auto ret = gralloc4_->unlock(
+      native_handle,
+      [&](const auto& unlock_error, const auto&) { error = unlock_error; });
+
+  if (!ret.isOk()) {
+    error = Error::NO_RESOURCES;
+  }
+
+  if (error != Error::NONE) {
+    ALOGE("%s failed to unlock buffer", __FUNCTION__);
+  }
+}
+
+GrallocBuffer::GrallocBuffer(Gralloc* gralloc, buffer_handle_t buffer)
+    : gralloc_(gralloc), buffer_(buffer) {}
+
+GrallocBuffer::~GrallocBuffer() { Release(); }
+
+GrallocBuffer::GrallocBuffer(GrallocBuffer&& rhs) { *this = std::move(rhs); }
+
+GrallocBuffer& GrallocBuffer::operator=(GrallocBuffer&& rhs) {
+  gralloc_ = rhs.gralloc_;
+  buffer_ = rhs.buffer_;
+  rhs.gralloc_ = nullptr;
+  rhs.buffer_ = nullptr;
+  return *this;
+}
+
+void GrallocBuffer::Release() {
+  if (gralloc_ && buffer_) {
+    gralloc_->Release(buffer_);
+    gralloc_ = nullptr;
+    buffer_ = nullptr;
+  }
+}
+
+std::optional<GrallocBufferView> GrallocBuffer::Lock() {
+  if (gralloc_ && buffer_) {
+    auto format_opt = GetDrmFormat();
+    if (!format_opt) {
+      ALOGE("%s failed to check format of buffer", __FUNCTION__);
+      return std::nullopt;
+    }
+    if (*format_opt != DRM_FORMAT_NV12 && *format_opt != DRM_FORMAT_NV21 &&
+        *format_opt != DRM_FORMAT_YVU420) {
+      auto locked_opt = gralloc_->Lock(buffer_);
+      if (!locked_opt) {
+        return std::nullopt;
+      }
+      return GrallocBufferView(this, *locked_opt);
+    } else {
+      auto locked_ycbcr_opt = gralloc_->LockYCbCr(buffer_);
+      if (!locked_ycbcr_opt) {
+        ALOGE("%s failed to lock ycbcr buffer", __FUNCTION__);
+        return std::nullopt;
+      }
+      return GrallocBufferView(this, *locked_ycbcr_opt);
+    }
+  }
+  return std::nullopt;
+}
+
+void GrallocBuffer::Unlock() {
+  if (gralloc_ && buffer_) {
+    gralloc_->Unlock(buffer_);
+  }
+}
+
+std::optional<uint32_t> GrallocBuffer::GetWidth() {
+  if (gralloc_ && buffer_) {
+    return gralloc_->GetWidth(buffer_);
+  }
+  return std::nullopt;
+}
+
+std::optional<uint32_t> GrallocBuffer::GetHeight() {
+  if (gralloc_ && buffer_) {
+    return gralloc_->GetHeight(buffer_);
+  }
+  return std::nullopt;
+}
+
+std::optional<uint32_t> GrallocBuffer::GetDrmFormat() {
+  if (gralloc_ && buffer_) {
+    return gralloc_->GetDrmFormat(buffer_);
+  }
+  return std::nullopt;
+}
+
+std::optional<std::vector<PlaneLayout>> GrallocBuffer::GetPlaneLayouts() {
+  if (gralloc_ && buffer_) {
+    return gralloc_->GetPlaneLayouts(buffer_);
+  }
+  return std::nullopt;
+}
+
+std::optional<uint32_t> GrallocBuffer::GetMonoPlanarStrideBytes() {
+  if (gralloc_ && buffer_) {
+    return gralloc_->GetMonoPlanarStrideBytes(buffer_);
+  }
+  return std::nullopt;
+}
+
+GrallocBufferView::GrallocBufferView(GrallocBuffer* buffer, void* raw)
+    : gralloc_buffer_(buffer), locked_(raw) {}
+
+GrallocBufferView::GrallocBufferView(GrallocBuffer* buffer, android_ycbcr raw)
+    : gralloc_buffer_(buffer), locked_ycbcr_(raw) {}
+
+GrallocBufferView::~GrallocBufferView() {
+  if (gralloc_buffer_) {
+    gralloc_buffer_->Unlock();
+  }
+}
+
+GrallocBufferView::GrallocBufferView(GrallocBufferView&& rhs) {
+  *this = std::move(rhs);
+}
+
+GrallocBufferView& GrallocBufferView::operator=(GrallocBufferView&& rhs) {
+  std::swap(gralloc_buffer_, rhs.gralloc_buffer_);
+  std::swap(locked_, rhs.locked_);
+  std::swap(locked_ycbcr_, rhs.locked_ycbcr_);
+  return *this;
+}
+
+const std::optional<void*> GrallocBufferView::Get() const { return locked_; }
+
+const std::optional<android_ycbcr>& GrallocBufferView::GetYCbCr() const {
+  return locked_ycbcr_;
+}
+
+}  // namespace android
\ No newline at end of file
diff --git a/system/hwc2/Gralloc.h b/system/hwc2/Gralloc.h
new file mode 100644
index 0000000..9cb5153
--- /dev/null
+++ b/system/hwc2/Gralloc.h
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_HWC_GRALLOC_H
+#define ANDROID_HWC_GRALLOC_H
+
+#include <aidl/android/hardware/graphics/common/PlaneLayout.h>
+#include <android/hardware/graphics/mapper/4.0/IMapper.h>
+#include <hardware/gralloc.h>
+#include <system/graphics.h>
+#include <utils/StrongPointer.h>
+
+#include <memory>
+#include <optional>
+#include <vector>
+
+namespace android {
+
+class Gralloc;
+class GrallocBuffer;
+
+// An RAII object that will Unlock() a GrallocBuffer upon destruction.
+class GrallocBufferView {
+ public:
+  virtual ~GrallocBufferView();
+
+  GrallocBufferView(const GrallocBufferView& rhs) = delete;
+  GrallocBufferView& operator=(const GrallocBufferView& rhs) = delete;
+
+  GrallocBufferView(GrallocBufferView&& rhs);
+  GrallocBufferView& operator=(GrallocBufferView&& rhs);
+
+  const std::optional<void*> Get() const;
+
+  const std::optional<android_ycbcr>& GetYCbCr() const;
+
+ private:
+  friend class GrallocBuffer;
+  GrallocBufferView(GrallocBuffer* buffer, void* raw);
+  GrallocBufferView(GrallocBuffer* buffer, android_ycbcr raw);
+
+  // The GrallocBuffer that should be unlocked upon destruction of this object.
+  GrallocBuffer* gralloc_buffer_ = nullptr;
+
+  std::optional<void*> locked_;
+  std::optional<android_ycbcr> locked_ycbcr_;
+};
+
+// A gralloc 4.0 buffer that has been imported in the current process and
+// that will be released upon destruction. Users must ensure that the Gralloc
+// instance that this buffer is created with out lives this buffer.
+class GrallocBuffer {
+ public:
+  GrallocBuffer(Gralloc* gralloc, buffer_handle_t buffer);
+  virtual ~GrallocBuffer();
+
+  GrallocBuffer(const GrallocBuffer& rhs) = delete;
+  GrallocBuffer& operator=(const GrallocBuffer& rhs) = delete;
+
+  GrallocBuffer(GrallocBuffer&& rhs);
+  GrallocBuffer& operator=(GrallocBuffer&& rhs);
+
+  // Locks the buffer for reading and returns a view if successful.
+  std::optional<GrallocBufferView> Lock();
+
+  std::optional<uint32_t> GetWidth();
+  std::optional<uint32_t> GetHeight();
+  std::optional<uint32_t> GetDrmFormat();
+
+  // Returns the stride of the buffer if it is a single plane buffer or fails
+  // and returns nullopt if the buffer is for a multi plane buffer.
+  std::optional<uint32_t> GetMonoPlanarStrideBytes();
+
+  std::optional<
+      std::vector<aidl::android::hardware::graphics::common::PlaneLayout>>
+  GetPlaneLayouts();
+
+ private:
+  // Internal visibility for Unlock().
+  friend class GrallocBufferView;
+
+  // Unlocks the buffer from reading.
+  void Unlock();
+
+  void Release();
+
+  Gralloc* gralloc_ = nullptr;
+  buffer_handle_t buffer_ = nullptr;
+};
+
+class Gralloc {
+ public:
+  Gralloc();
+  virtual ~Gralloc() = default;
+
+  // Imports the given buffer handle into the current process and returns an
+  // imported buffer which can be used for reading. Users must ensure that the
+  // Gralloc instance outlives any GrallocBuffers.
+  std::optional<GrallocBuffer> Import(buffer_handle_t buffer);
+
+ private:
+  // The below functions are made avaialble only to GrallocBuffer so that
+  // users only call gralloc functions on *imported* buffers.
+  friend class GrallocBuffer;
+
+  // See GrallocBuffer::Release.
+  void Release(buffer_handle_t buffer);
+
+  // See GrallocBuffer::Lock.
+  std::optional<void*> Lock(buffer_handle_t buffer);
+
+  // See GrallocBuffer::LockYCbCr.
+  std::optional<android_ycbcr> LockYCbCr(buffer_handle_t buffer);
+
+  // See GrallocBuffer::Unlock.
+  void Unlock(buffer_handle_t buffer);
+
+  // See GrallocBuffer::GetWidth.
+  std::optional<uint32_t> GetWidth(buffer_handle_t buffer);
+
+  // See GrallocBuffer::GetHeight.
+  std::optional<uint32_t> GetHeight(buffer_handle_t buffer);
+
+  // See GrallocBuffer::GetDrmFormat.
+  std::optional<uint32_t> GetDrmFormat(buffer_handle_t buffer);
+
+  // See GrallocBuffer::GetPlaneLayouts.
+  std::optional<
+      std::vector<aidl::android::hardware::graphics::common::PlaneLayout>>
+  GetPlaneLayouts(buffer_handle_t buffer);
+
+  // Returns the stride of the buffer if it is a single plane buffer or fails
+  // and returns nullopt if the buffer is for a multi plane buffer.
+  std::optional<uint32_t> GetMonoPlanarStrideBytes(buffer_handle_t);
+
+  // See GrallocBuffer::GetMetadata.
+  android::hardware::graphics::mapper::V4_0::Error GetMetadata(
+      buffer_handle_t buffer,
+      android::hardware::graphics::mapper::V4_0::IMapper::MetadataType type,
+      android::hardware::hidl_vec<uint8_t>* metadata);
+
+  android::sp<android::hardware::graphics::mapper::V4_0::IMapper> gralloc4_;
+};
+
+}  // namespace android
+
+#endif
\ No newline at end of file
diff --git a/system/hwc2/GuestComposer.cpp b/system/hwc2/GuestComposer.cpp
new file mode 100644
index 0000000..b00d5be
--- /dev/null
+++ b/system/hwc2/GuestComposer.cpp
@@ -0,0 +1,1185 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "GuestComposer.h"
+
+#include <android-base/parseint.h>
+#include <android-base/properties.h>
+#include <android-base/strings.h>
+#include <android/hardware/graphics/common/1.0/types.h>
+#include <device_config_shared.h>
+#include <drm_fourcc.h>
+#include <libyuv.h>
+#include <ui/GraphicBuffer.h>
+#include <ui/GraphicBufferAllocator.h>
+#include <ui/GraphicBufferMapper.h>
+
+#include "Device.h"
+#include "Display.h"
+#include "Drm.h"
+#include "Layer.h"
+
+namespace android {
+namespace {
+
+using android::hardware::graphics::common::V1_0::ColorTransform;
+
+uint64_t AlignToPower2(uint64_t val, uint8_t align_log) {
+  uint64_t align = 1ULL << align_log;
+  return ((val + (align - 1)) / align) * align;
+}
+
+bool LayerNeedsScaling(const Layer& layer) {
+  hwc_rect_t crop = layer.getSourceCropInt();
+  hwc_rect_t frame = layer.getDisplayFrame();
+
+  int fromW = crop.right - crop.left;
+  int fromH = crop.bottom - crop.top;
+  int toW = frame.right - frame.left;
+  int toH = frame.bottom - frame.top;
+
+  bool not_rot_scale = fromW != toW || fromH != toH;
+  bool rot_scale = fromW != toH || fromH != toW;
+
+  bool needs_rot = layer.getTransform() & HAL_TRANSFORM_ROT_90;
+
+  return needs_rot ? rot_scale : not_rot_scale;
+}
+
+bool LayerNeedsBlending(const Layer& layer) {
+  return layer.getBlendMode() != HWC2::BlendMode::None;
+}
+
+bool LayerNeedsAttenuation(const Layer& layer) {
+  return layer.getBlendMode() == HWC2::BlendMode::Coverage;
+}
+
+struct BufferSpec;
+typedef int (*ConverterFunction)(const BufferSpec& src, const BufferSpec& dst,
+                                 bool v_flip);
+int DoCopy(const BufferSpec& src, const BufferSpec& dst, bool vFlip);
+int ConvertFromRGB565(const BufferSpec& src, const BufferSpec& dst, bool vFlip);
+int ConvertFromYV12(const BufferSpec& src, const BufferSpec& dst, bool vFlip);
+
+ConverterFunction GetConverterForDrmFormat(uint32_t drmFormat) {
+  switch (drmFormat) {
+    case DRM_FORMAT_ABGR8888:
+    case DRM_FORMAT_XBGR8888:
+      return &DoCopy;
+    case DRM_FORMAT_RGB565:
+      return &ConvertFromRGB565;
+    case DRM_FORMAT_YVU420:
+      return &ConvertFromYV12;
+  }
+  ALOGW("Unsupported drm format: %d(%s), returning null converter", drmFormat,
+        GetDrmFormatString(drmFormat));
+  return nullptr;
+}
+
+bool IsDrmFormatSupported(uint32_t drmFormat) {
+  return GetConverterForDrmFormat(drmFormat) != nullptr;
+}
+
+// Libyuv's convert functions only allow the combination of any rotation
+// (multiple of 90 degrees) and a vertical flip, but not horizontal flips.
+// Surfaceflinger's transformations are expressed in terms of a vertical flip,
+// a horizontal flip and/or a single 90 degrees clockwise rotation (see
+// NATIVE_WINDOW_TRANSFORM_HINT documentation on system/window.h for more
+// insight). The following code allows to turn a horizontal flip into a 180
+// degrees rotation and a vertical flip.
+libyuv::RotationMode GetRotationFromTransform(uint32_t transform) {
+  uint32_t rotation =
+      (transform & HAL_TRANSFORM_ROT_90) ? 1 : 0;          // 1 * ROT90 bit
+  rotation += (transform & HAL_TRANSFORM_FLIP_H) ? 2 : 0;  // 2 * VFLIP bit
+  return static_cast<libyuv::RotationMode>(90 * rotation);
+}
+
+bool GetVFlipFromTransform(uint32_t transform) {
+  // vertical flip xor horizontal flip
+  return ((transform & HAL_TRANSFORM_FLIP_V) >> 1) ^
+         (transform & HAL_TRANSFORM_FLIP_H);
+}
+
+struct BufferSpec {
+  uint8_t* buffer;
+  std::optional<android_ycbcr> buffer_ycbcr;
+  int width;
+  int height;
+  int cropX;
+  int cropY;
+  int cropWidth;
+  int cropHeight;
+  uint32_t drmFormat;
+  int strideBytes;
+  int sampleBytes;
+
+  BufferSpec(uint8_t* buffer, std::optional<android_ycbcr> buffer_ycbcr,
+             int width, int height, int cropX, int cropY, int cropWidth,
+             int cropHeight, uint32_t drmFormat, int strideBytes,
+             int sampleBytes)
+      : buffer(buffer),
+        buffer_ycbcr(buffer_ycbcr),
+        width(width),
+        height(height),
+        cropX(cropX),
+        cropY(cropY),
+        cropWidth(cropWidth),
+        cropHeight(cropHeight),
+        drmFormat(drmFormat),
+        strideBytes(strideBytes),
+        sampleBytes(sampleBytes) {}
+
+  BufferSpec(uint8_t* buffer, int width, int height, int strideBytes)
+      : BufferSpec(buffer,
+                   /*buffer_ycbcr=*/std::nullopt, width, height,
+                   /*cropX=*/0,
+                   /*cropY=*/0,
+                   /*cropWidth=*/width,
+                   /*cropHeight=*/height,
+                   /*drmFormat=*/DRM_FORMAT_ABGR8888, strideBytes,
+                   /*sampleBytes=*/4) {}
+};
+
+int ConvertFromRGB565(const BufferSpec& src, const BufferSpec& dst,
+                      bool vFlip) {
+  // Point to the upper left corner of the crop rectangle
+  uint8_t* srcBuffer =
+      src.buffer + src.cropY * src.strideBytes + src.cropX * src.sampleBytes;
+  uint8_t* dstBuffer =
+      dst.buffer + dst.cropY * dst.strideBytes + dst.cropX * dst.sampleBytes;
+
+  int width = src.cropWidth;
+  int height = src.cropHeight;
+  if (vFlip) {
+    height = -height;
+  }
+
+  return libyuv::RGB565ToARGB(srcBuffer, src.strideBytes,  //
+                              dstBuffer, dst.strideBytes,  //
+                              width, height);
+}
+
+int ConvertFromYV12(const BufferSpec& src, const BufferSpec& dst, bool vFlip) {
+  // The following calculation of plane offsets and alignments are based on
+  // swiftshader's Sampler::setTextureLevel() implementation
+  // (Renderer/Sampler.cpp:225)
+
+  auto& srcBufferYCbCrOpt = src.buffer_ycbcr;
+  if (!srcBufferYCbCrOpt) {
+    ALOGE("%s called on non ycbcr buffer", __FUNCTION__);
+    return -1;
+  }
+  auto& srcBufferYCbCr = *srcBufferYCbCrOpt;
+
+  // The libyuv::I420ToARGB() function is for tri-planar.
+  if (srcBufferYCbCr.chroma_step != 1) {
+    ALOGE("%s called with bad chroma step", __FUNCTION__);
+    return -1;
+  }
+
+  uint8_t* srcY = reinterpret_cast<uint8_t*>(srcBufferYCbCr.y);
+  int strideY = srcBufferYCbCr.ystride;
+  uint8_t* srcU = reinterpret_cast<uint8_t*>(srcBufferYCbCr.cb);
+  int strideU = srcBufferYCbCr.cstride;
+  uint8_t* srcV = reinterpret_cast<uint8_t*>(srcBufferYCbCr.cr);
+  int strideV = srcBufferYCbCr.cstride;
+
+  // Adjust for crop
+  srcY += src.cropY * strideY + src.cropX;
+  srcV += (src.cropY / 2) * strideV + (src.cropX / 2);
+  srcU += (src.cropY / 2) * strideU + (src.cropX / 2);
+  uint8_t* dstBuffer =
+      dst.buffer + dst.cropY * dst.strideBytes + dst.cropX * dst.sampleBytes;
+
+  int width = dst.cropWidth;
+  int height = dst.cropHeight;
+
+  if (vFlip) {
+    height = -height;
+  }
+
+  // YV12 is the same as I420, with the U and V planes swapped
+  return libyuv::I420ToARGB(srcY, strideY, srcV, strideV, srcU, strideU,
+                            dstBuffer, dst.strideBytes, width, height);
+}
+
+int DoConversion(const BufferSpec& src, const BufferSpec& dst, bool v_flip) {
+  ConverterFunction func = GetConverterForDrmFormat(src.drmFormat);
+  if (!func) {
+    // GetConverterForDrmFormat should've logged the issue for us.
+    return -1;
+  }
+  return func(src, dst, v_flip);
+}
+
+int DoCopy(const BufferSpec& src, const BufferSpec& dst, bool v_flip) {
+  // Point to the upper left corner of the crop rectangle
+  uint8_t* srcBuffer =
+      src.buffer + src.cropY * src.strideBytes + src.cropX * src.sampleBytes;
+  uint8_t* dstBuffer =
+      dst.buffer + dst.cropY * dst.strideBytes + dst.cropX * dst.sampleBytes;
+  int width = src.cropWidth;
+  int height = src.cropHeight;
+
+  if (v_flip) {
+    height = -height;
+  }
+
+  // HAL formats are named based on the order of the pixel components on the
+  // byte stream, while libyuv formats are named based on the order of those
+  // pixel components in an integer written from left to right. So
+  // libyuv::FOURCC_ARGB is equivalent to HAL_PIXEL_FORMAT_BGRA_8888.
+  auto ret = libyuv::ARGBCopy(srcBuffer, src.strideBytes, dstBuffer,
+                              dst.strideBytes, width, height);
+  return ret;
+}
+
+int DoRotation(const BufferSpec& src, const BufferSpec& dst,
+               libyuv::RotationMode rotation, bool v_flip) {
+  // Point to the upper left corner of the crop rectangles
+  uint8_t* srcBuffer =
+      src.buffer + src.cropY * src.strideBytes + src.cropX * src.sampleBytes;
+  uint8_t* dstBuffer =
+      dst.buffer + dst.cropY * dst.strideBytes + dst.cropX * dst.sampleBytes;
+  int width = src.cropWidth;
+  int height = src.cropHeight;
+
+  if (v_flip) {
+    height = -height;
+  }
+
+  return libyuv::ARGBRotate(srcBuffer, src.strideBytes, dstBuffer,
+                            dst.strideBytes, width, height, rotation);
+}
+
+int DoScaling(const BufferSpec& src, const BufferSpec& dst, bool v_flip) {
+  // Point to the upper left corner of the crop rectangles
+  uint8_t* srcBuffer =
+      src.buffer + src.cropY * src.strideBytes + src.cropX * src.sampleBytes;
+  uint8_t* dstBuffer =
+      dst.buffer + dst.cropY * dst.strideBytes + dst.cropX * dst.sampleBytes;
+  int srcWidth = src.cropWidth;
+  int srcHeight = src.cropHeight;
+  int dstWidth = dst.cropWidth;
+  int dstHeight = dst.cropHeight;
+
+  if (v_flip) {
+    srcHeight = -srcHeight;
+  }
+
+  return libyuv::ARGBScale(srcBuffer, src.strideBytes, srcWidth, srcHeight,
+                           dstBuffer, dst.strideBytes, dstWidth, dstHeight,
+                           libyuv::kFilterBilinear);
+}
+
+int DoAttenuation(const BufferSpec& src, const BufferSpec& dst, bool v_flip) {
+  // Point to the upper left corner of the crop rectangles
+  uint8_t* srcBuffer =
+      src.buffer + src.cropY * src.strideBytes + src.cropX * src.sampleBytes;
+  uint8_t* dstBuffer =
+      dst.buffer + dst.cropY * dst.strideBytes + dst.cropX * dst.sampleBytes;
+  int width = dst.cropWidth;
+  int height = dst.cropHeight;
+
+  if (v_flip) {
+    height = -height;
+  }
+
+  return libyuv::ARGBAttenuate(srcBuffer, src.strideBytes, dstBuffer,
+                               dst.strideBytes, width, height);
+}
+
+int DoBlending(const BufferSpec& src, const BufferSpec& dst, bool v_flip) {
+  // Point to the upper left corner of the crop rectangles
+  uint8_t* srcBuffer =
+      src.buffer + src.cropY * src.strideBytes + src.cropX * src.sampleBytes;
+  uint8_t* dstBuffer =
+      dst.buffer + dst.cropY * dst.strideBytes + dst.cropX * dst.sampleBytes;
+  int width = dst.cropWidth;
+  int height = dst.cropHeight;
+
+  if (v_flip) {
+    height = -height;
+  }
+
+  // libyuv's ARGB format is hwcomposer's BGRA format, since blending only cares
+  // for the position of alpha in the pixel and not the position of the colors
+  // this function is perfectly usable.
+  return libyuv::ARGBBlend(srcBuffer, src.strideBytes, dstBuffer,
+                           dst.strideBytes, dstBuffer, dst.strideBytes, width,
+                           height);
+}
+
+std::optional<BufferSpec> GetBufferSpec(GrallocBuffer& buffer,
+                                        GrallocBufferView& bufferView,
+                                        const hwc_rect_t& bufferCrop) {
+  auto bufferFormatOpt = buffer.GetDrmFormat();
+  if (!bufferFormatOpt) {
+    ALOGE("Failed to get gralloc buffer format.");
+    return std::nullopt;
+  }
+  uint32_t bufferFormat = *bufferFormatOpt;
+
+  auto bufferWidthOpt = buffer.GetWidth();
+  if (!bufferWidthOpt) {
+    ALOGE("Failed to get gralloc buffer width.");
+    return std::nullopt;
+  }
+  uint32_t bufferWidth = *bufferWidthOpt;
+
+  auto bufferHeightOpt = buffer.GetHeight();
+  if (!bufferHeightOpt) {
+    ALOGE("Failed to get gralloc buffer height.");
+    return std::nullopt;
+  }
+  uint32_t bufferHeight = *bufferHeightOpt;
+
+  uint8_t* bufferData = nullptr;
+  uint32_t bufferStrideBytes = 0;
+  std::optional<android_ycbcr> bufferYCbCrData;
+
+  if (bufferFormat == DRM_FORMAT_NV12 || bufferFormat == DRM_FORMAT_NV21 ||
+      bufferFormat == DRM_FORMAT_YVU420) {
+    bufferYCbCrData = bufferView.GetYCbCr();
+    if (!bufferYCbCrData) {
+      ALOGE("%s failed to get raw ycbcr from view.", __FUNCTION__);
+      return std::nullopt;
+    }
+  } else {
+    auto bufferDataOpt = bufferView.Get();
+    if (!bufferDataOpt) {
+      ALOGE("%s failed to lock gralloc buffer.", __FUNCTION__);
+      return std::nullopt;
+    }
+    bufferData = reinterpret_cast<uint8_t*>(*bufferDataOpt);
+
+    auto bufferStrideBytesOpt = buffer.GetMonoPlanarStrideBytes();
+    if (!bufferStrideBytesOpt) {
+      ALOGE("%s failed to get plane stride.", __FUNCTION__);
+      return std::nullopt;
+    }
+    bufferStrideBytes = *bufferStrideBytesOpt;
+  }
+
+  return BufferSpec(bufferData, bufferYCbCrData, bufferWidth, bufferHeight,
+                    bufferCrop.left, bufferCrop.top,
+                    bufferCrop.right - bufferCrop.left,
+                    bufferCrop.bottom - bufferCrop.top, bufferFormat,
+                    bufferStrideBytes, GetDrmFormatBytesPerPixel(bufferFormat));
+}
+
+}  // namespace
+
+HWC2::Error GuestComposer::init(const HotplugCallback& cb) {
+  DEBUG_LOG("%s", __FUNCTION__);
+
+  if (!mDrmPresenter.init(cb)) {
+    ALOGE("%s: failed to initialize DrmPresenter", __FUNCTION__);
+    return HWC2::Error::NoResources;
+  }
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error GuestComposer::createDisplays(
+    Device* device, const AddDisplayToDeviceFunction& addDisplayToDeviceFn) {
+  DEBUG_LOG("%s", __FUNCTION__);
+
+  HWC2::Error error = HWC2::Error::None;
+
+  std::vector<DisplayConfig> displayConfigs;
+
+  error = getDisplayConfigsFromDeviceConfig(&displayConfigs);
+  if (error != HWC2::Error::None) {
+    ALOGE("%s failed to get display configs from device config", __FUNCTION__);
+    return error;
+  }
+
+  error = getDisplayConfigsFromSystemProp(&displayConfigs);
+  if (error != HWC2::Error::None) {
+    ALOGE("%s failed to get display configs from system prop", __FUNCTION__);
+    return error;
+  }
+  uint32_t id = 0;
+  for (const auto& displayConfig : displayConfigs) {
+    error = createDisplay(device, id, displayConfig.width, displayConfig.height,
+                          displayConfig.dpiX, displayConfig.dpiY,
+                          displayConfig.refreshRateHz, addDisplayToDeviceFn);
+    if (error != HWC2::Error::None) {
+      ALOGE("%s: failed to create display %d", __FUNCTION__, id);
+      return error;
+    }
+
+    ++id;
+  }
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error GuestComposer::createDisplay(
+    Device* device, uint32_t id, uint32_t width, uint32_t height, uint32_t dpiX,
+    uint32_t dpiY, uint32_t refreshRateHz,
+    const AddDisplayToDeviceFunction& addDisplayToDeviceFn) {
+  auto display = std::make_unique<Display>(*device, this, id);
+  if (display == nullptr) {
+    ALOGE("%s failed to allocate display", __FUNCTION__);
+    return HWC2::Error::NoResources;
+  }
+
+  auto displayId = display->getId();
+
+  HWC2::Error error = display->init(width, height, dpiX, dpiY, refreshRateHz);
+  if (error != HWC2::Error::None) {
+    ALOGE("%s failed to initialize display:%" PRIu64, __FUNCTION__, displayId);
+    return error;
+  }
+
+  auto it = mDisplayInfos.find(displayId);
+  if (it != mDisplayInfos.end()) {
+    ALOGE("%s: display:%" PRIu64 " already created?", __FUNCTION__, displayId);
+  }
+
+  GuestComposerDisplayInfo& displayInfo = mDisplayInfos[displayId];
+
+  uint32_t bufferStride;
+  buffer_handle_t bufferHandle;
+
+  auto status = GraphicBufferAllocator::get().allocate(
+      width,                   //
+      height,                  //
+      PIXEL_FORMAT_RGBA_8888,  //
+      /*layerCount=*/1,        //
+      GraphicBuffer::USAGE_HW_COMPOSER | GraphicBuffer::USAGE_SW_READ_OFTEN |
+          GraphicBuffer::USAGE_SW_WRITE_OFTEN,  //
+      &bufferHandle,                            //
+      &bufferStride,                            //
+      "RanchuHwc");
+  if (status != OK) {
+    ALOGE("%s failed to allocate composition buffer for display:%" PRIu64,
+          __FUNCTION__, displayId);
+    return HWC2::Error::NoResources;
+  }
+
+  displayInfo.compositionResultBuffer = bufferHandle;
+
+  displayInfo.compositionResultDrmBuffer = std::make_unique<DrmBuffer>(
+      displayInfo.compositionResultBuffer, mDrmPresenter);
+
+  if (displayId == 0) {
+    int flushSyncFd = -1;
+
+    HWC2::Error flushError =
+        displayInfo.compositionResultDrmBuffer->flushToDisplay(displayId,
+                                                               &flushSyncFd);
+    if (flushError != HWC2::Error::None) {
+      ALOGW(
+          "%s: Initial display flush failed. HWComposer assuming that we are "
+          "running in QEMU without a display and disabling presenting.",
+          __FUNCTION__);
+      mPresentDisabled = true;
+    } else {
+      close(flushSyncFd);
+    }
+  }
+
+  error = addDisplayToDeviceFn(std::move(display));
+  if (error != HWC2::Error::None) {
+    ALOGE("%s failed to add display:%" PRIu64, __FUNCTION__, displayId);
+    return error;
+  }
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error GuestComposer::onDisplayDestroy(Display* display) {
+  auto displayId = display->getId();
+
+  auto it = mDisplayInfos.find(displayId);
+  if (it == mDisplayInfos.end()) {
+    ALOGE("%s: display:%" PRIu64 " missing display buffers?", __FUNCTION__,
+          displayId);
+    return HWC2::Error::BadDisplay;
+  }
+
+  GuestComposerDisplayInfo& displayInfo = mDisplayInfos[displayId];
+
+  GraphicBufferAllocator::get().free(displayInfo.compositionResultBuffer);
+
+  mDisplayInfos.erase(it);
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error GuestComposer::getDisplayConfigsFromDeviceConfig(
+    std::vector<GuestComposer::DisplayConfig>* configs) {
+  DEBUG_LOG("%s", __FUNCTION__);
+
+  const auto deviceConfig = cuttlefish::GetDeviceConfig();
+  for (const auto& deviceDisplayConfig : deviceConfig.display_config()) {
+    DisplayConfig displayConfig = {
+        .width = deviceDisplayConfig.width(),
+        .height = deviceDisplayConfig.height(),
+        .dpiX = deviceDisplayConfig.dpi(),
+        .dpiY = deviceDisplayConfig.dpi(),
+        .refreshRateHz = deviceDisplayConfig.refresh_rate_hz(),
+    };
+
+    configs->push_back(displayConfig);
+  }
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error GuestComposer::getDisplayConfigsFromSystemProp(
+    std::vector<GuestComposer::DisplayConfig>* configs) {
+  DEBUG_LOG("%s", __FUNCTION__);
+
+  static constexpr const char kExternalDisplayProp[] =
+      "hwservicemanager.external.displays";
+
+  const auto propString = android::base::GetProperty(kExternalDisplayProp, "");
+  DEBUG_LOG("%s: prop value is: %s", __FUNCTION__, propString.c_str());
+
+  if (propString.empty()) {
+    return HWC2::Error::None;
+  }
+
+  const std::vector<std::string> propStringParts =
+      android::base::Split(propString, ",");
+  if (propStringParts.size() % 5 != 0) {
+    ALOGE("%s: Invalid syntax for system prop %s which is %s", __FUNCTION__,
+          kExternalDisplayProp, propString.c_str());
+    return HWC2::Error::BadParameter;
+  }
+
+  std::vector<int> propIntParts;
+  for (const std::string& propStringPart : propStringParts) {
+    int propIntPart;
+    if (!android::base::ParseInt(propStringPart, &propIntPart)) {
+      ALOGE("%s: Invalid syntax for system prop %s which is %s", __FUNCTION__,
+            kExternalDisplayProp, propString.c_str());
+      return HWC2::Error::BadParameter;
+    }
+    propIntParts.push_back(propIntPart);
+  }
+
+  while (!propIntParts.empty()) {
+    DisplayConfig display_config = {
+        .width = propIntParts[1],
+        .height = propIntParts[2],
+        .dpiX = propIntParts[3],
+        .dpiY = propIntParts[3],
+        .refreshRateHz = 160,
+    };
+
+    configs->push_back(display_config);
+
+    propIntParts.erase(propIntParts.begin(), propIntParts.begin() + 5);
+  }
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error GuestComposer::validateDisplay(
+    Display* display, std::unordered_map<hwc2_layer_t, HWC2::Composition>*
+                          outLayerCompositionChanges) {
+  const auto displayId = display->getId();
+  DEBUG_LOG("%s display:%" PRIu64, __FUNCTION__, displayId);
+
+  const std::vector<Layer*>& layers = display->getOrderedLayers();
+
+  bool fallbackToClientComposition = false;
+  for (Layer* layer : layers) {
+    const auto layerId = layer->getId();
+    const auto layerCompositionType = layer->getCompositionType();
+    const auto layerCompositionTypeString = to_string(layerCompositionType);
+
+    if (layerCompositionType == HWC2::Composition::Invalid) {
+      ALOGE("%s display:%" PRIu64 " layer:%" PRIu64 " has Invalid composition",
+            __FUNCTION__, displayId, layerId);
+      continue;
+    }
+
+    if (layerCompositionType == HWC2::Composition::Client ||
+        layerCompositionType == HWC2::Composition::Cursor ||
+        layerCompositionType == HWC2::Composition::Sideband ||
+        layerCompositionType == HWC2::Composition::SolidColor) {
+      ALOGW("%s: display:%" PRIu64 " layer:%" PRIu64
+            " has composition type %s, falling back to client composition",
+            __FUNCTION__, displayId, layerId,
+            layerCompositionTypeString.c_str());
+      fallbackToClientComposition = true;
+      break;
+    }
+
+    if (!canComposeLayer(layer)) {
+      ALOGW("%s: display:%" PRIu64 " layer:%" PRIu64
+            " composition not supported, falling back to client composition",
+            __FUNCTION__, displayId, layerId);
+      fallbackToClientComposition = true;
+      break;
+    }
+  }
+
+  if (fallbackToClientComposition) {
+    for (Layer* layer : layers) {
+      const auto layerId = layer->getId();
+      const auto layerCompositionType = layer->getCompositionType();
+
+      if (layerCompositionType == HWC2::Composition::Invalid) {
+        continue;
+      }
+      if (layerCompositionType != HWC2::Composition::Client) {
+        DEBUG_LOG("%s display:%" PRIu64 " layer:%" PRIu64
+                  "composition updated to Client",
+                  __FUNCTION__, displayId, layerId);
+        (*outLayerCompositionChanges)[layerId] = HWC2::Composition::Client;
+      }
+    }
+  }
+
+  // We can not draw below a Client (SurfaceFlinger) composed layer. Change all
+  // layers below a Client composed layer to also be Client composed.
+  if (layers.size() > 1) {
+    for (std::size_t layerIndex = layers.size() - 1; layerIndex > 0;
+         layerIndex--) {
+      auto layer = layers[layerIndex];
+      auto layerCompositionType = layer->getCompositionType();
+
+      if (layerCompositionType == HWC2::Composition::Client) {
+        for (std::size_t lowerLayerIndex = 0; lowerLayerIndex < layerIndex;
+             lowerLayerIndex++) {
+          auto lowerLayer = layers[lowerLayerIndex];
+          auto lowerLayerId = lowerLayer->getId();
+          auto lowerLayerCompositionType = lowerLayer->getCompositionType();
+
+          if (lowerLayerCompositionType != HWC2::Composition::Client) {
+            DEBUG_LOG("%s: display:%" PRIu64 " changing layer:%" PRIu64
+                      " to Client because"
+                      "hwcomposer can not draw below the Client composed "
+                      "layer:%" PRIu64,
+                      __FUNCTION__, displayId, lowerLayerId, layer->getId());
+
+            (*outLayerCompositionChanges)[lowerLayerId] =
+                HWC2::Composition::Client;
+          }
+        }
+      }
+    }
+  }
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error GuestComposer::presentDisplay(Display* display,
+                                          int32_t* outRetireFence) {
+  const auto displayId = display->getId();
+  DEBUG_LOG("%s display:%" PRIu64, __FUNCTION__, displayId);
+
+  if (displayId != 0) {
+    // TODO(b/171305898): remove after multi-display fully supported.
+    return HWC2::Error::None;
+  }
+
+  if (mPresentDisabled) {
+    return HWC2::Error::None;
+  }
+
+  auto it = mDisplayInfos.find(displayId);
+  if (it == mDisplayInfos.end()) {
+    ALOGE("%s: display:%" PRIu64 " not found", __FUNCTION__, displayId);
+    return HWC2::Error::NoResources;
+  }
+
+  GuestComposerDisplayInfo& displayInfo = it->second;
+
+  if (displayInfo.compositionResultBuffer == nullptr) {
+    ALOGE("%s: display:%" PRIu64 " missing composition result buffer",
+          __FUNCTION__, displayId);
+    return HWC2::Error::NoResources;
+  }
+
+  std::optional<GrallocBuffer> compositionResultBufferOpt =
+      mGralloc.Import(displayInfo.compositionResultBuffer);
+  if (!compositionResultBufferOpt) {
+    ALOGE("%s: display:%" PRIu64 " failed to import buffer", __FUNCTION__,
+          displayId);
+    return HWC2::Error::NoResources;
+  }
+
+  std::optional<uint32_t> compositionResultBufferWidthOpt =
+      compositionResultBufferOpt->GetWidth();
+  if (!compositionResultBufferWidthOpt) {
+    ALOGE("%s: display:%" PRIu64 " failed to query buffer width", __FUNCTION__,
+          displayId);
+    return HWC2::Error::NoResources;
+  }
+
+  std::optional<uint32_t> compositionResultBufferHeightOpt =
+      compositionResultBufferOpt->GetHeight();
+  if (!compositionResultBufferHeightOpt) {
+    ALOGE("%s: display:%" PRIu64 " failed to query buffer height", __FUNCTION__,
+          displayId);
+    return HWC2::Error::NoResources;
+  }
+
+  std::optional<uint32_t> compositionResultBufferStrideOpt =
+      compositionResultBufferOpt->GetMonoPlanarStrideBytes();
+  if (!compositionResultBufferStrideOpt) {
+    ALOGE("%s: display:%" PRIu64 " failed to query buffer stride", __FUNCTION__,
+          displayId);
+    return HWC2::Error::NoResources;
+  }
+
+  std::optional<GrallocBufferView> compositionResultBufferViewOpt =
+      compositionResultBufferOpt->Lock();
+  if (!compositionResultBufferViewOpt) {
+    ALOGE("%s: display:%" PRIu64 " failed to get buffer view", __FUNCTION__,
+          displayId);
+    return HWC2::Error::NoResources;
+  }
+
+  const std::optional<void*> compositionResultBufferDataOpt =
+      compositionResultBufferViewOpt->Get();
+  if (!compositionResultBufferDataOpt) {
+    ALOGE("%s: display:%" PRIu64 " failed to get buffer data", __FUNCTION__,
+          displayId);
+    return HWC2::Error::NoResources;
+  }
+
+  uint32_t compositionResultBufferWidth = *compositionResultBufferWidthOpt;
+  uint32_t compositionResultBufferHeight = *compositionResultBufferHeightOpt;
+  uint32_t compositionResultBufferStride = *compositionResultBufferStrideOpt;
+  uint8_t* compositionResultBufferData =
+      reinterpret_cast<uint8_t*>(*compositionResultBufferDataOpt);
+
+  const std::vector<Layer*>& layers = display->getOrderedLayers();
+
+  const bool noOpComposition = layers.empty();
+  const bool allLayersClientComposed = std::all_of(
+      layers.begin(),  //
+      layers.end(),    //
+      [](const Layer* layer) {
+        return layer->getCompositionType() == HWC2::Composition::Client;
+      });
+
+  if (noOpComposition) {
+    ALOGW("%s: display:%" PRIu64 " empty composition", __FUNCTION__, displayId);
+  } else if (allLayersClientComposed) {
+    auto clientTargetBufferOpt =
+        mGralloc.Import(display->waitAndGetClientTargetBuffer());
+    if (!clientTargetBufferOpt) {
+      ALOGE("%s: failed to import client target buffer.", __FUNCTION__);
+      return HWC2::Error::NoResources;
+    }
+    GrallocBuffer& clientTargetBuffer = *clientTargetBufferOpt;
+
+    auto clientTargetBufferViewOpt = clientTargetBuffer.Lock();
+    if (!clientTargetBufferViewOpt) {
+      ALOGE("%s: failed to lock client target buffer.", __FUNCTION__);
+      return HWC2::Error::NoResources;
+    }
+    GrallocBufferView& clientTargetBufferView = *clientTargetBufferViewOpt;
+
+    auto clientTargetPlaneLayoutsOpt = clientTargetBuffer.GetPlaneLayouts();
+    if (!clientTargetPlaneLayoutsOpt) {
+      ALOGE("Failed to get client target buffer plane layouts.");
+      return HWC2::Error::NoResources;
+    }
+    auto& clientTargetPlaneLayouts = *clientTargetPlaneLayoutsOpt;
+
+    if (clientTargetPlaneLayouts.size() != 1) {
+      ALOGE("Unexpected number of plane layouts for client target buffer.");
+      return HWC2::Error::NoResources;
+    }
+
+    std::size_t clientTargetPlaneSize =
+        clientTargetPlaneLayouts[0].totalSizeInBytes;
+
+    auto clientTargetDataOpt = clientTargetBufferView.Get();
+    if (!clientTargetDataOpt) {
+      ALOGE("%s failed to lock gralloc buffer.", __FUNCTION__);
+      return HWC2::Error::NoResources;
+    }
+    auto* clientTargetData = reinterpret_cast<uint8_t*>(*clientTargetDataOpt);
+
+    std::memcpy(compositionResultBufferData, clientTargetData,
+                clientTargetPlaneSize);
+  } else {
+    for (Layer* layer : layers) {
+      const auto layerId = layer->getId();
+      const auto layerCompositionType = layer->getCompositionType();
+      if (layerCompositionType != HWC2::Composition::Device) {
+        continue;
+      }
+
+      HWC2::Error error = composeLayerInto(layer,                          //
+                                           compositionResultBufferData,    //
+                                           compositionResultBufferWidth,   //
+                                           compositionResultBufferHeight,  //
+                                           compositionResultBufferStride,  //
+                                           4);
+      if (error != HWC2::Error::None) {
+        ALOGE("%s: display:%" PRIu64 " failed to compose layer:%" PRIu64,
+              __FUNCTION__, displayId, layerId);
+        return error;
+      }
+    }
+  }
+
+  if (display->hasColorTransform()) {
+    const ColorTransformWithMatrix colorTransform =
+        display->getColorTransform();
+
+    HWC2::Error error =
+        applyColorTransformToRGBA(colorTransform,                 //
+                                  compositionResultBufferData,    //
+                                  compositionResultBufferWidth,   //
+                                  compositionResultBufferHeight,  //
+                                  compositionResultBufferStride);
+    if (error != HWC2::Error::None) {
+      ALOGE("%s: display:%" PRIu64 " failed to apply color transform",
+            __FUNCTION__, displayId);
+      return error;
+    }
+  }
+
+  DEBUG_LOG("%s display:%" PRIu64 " flushing drm buffer", __FUNCTION__,
+            displayId);
+
+  HWC2::Error error = displayInfo.compositionResultDrmBuffer->flushToDisplay(
+      static_cast<int>(displayId), outRetireFence);
+  if (error != HWC2::Error::None) {
+    ALOGE("%s: display:%" PRIu64 " failed to flush drm buffer" PRIu64,
+          __FUNCTION__, displayId);
+  }
+  return error;
+}
+
+bool GuestComposer::canComposeLayer(Layer* layer) {
+  buffer_handle_t bufferHandle = layer->getBuffer().getBuffer();
+  if (bufferHandle == nullptr) {
+    ALOGW("%s received a layer with a null handle", __FUNCTION__);
+    return false;
+  }
+
+  auto bufferOpt = mGralloc.Import(bufferHandle);
+  if (!bufferOpt) {
+    ALOGE("Failed to import layer buffer.");
+    return false;
+  }
+  GrallocBuffer& buffer = *bufferOpt;
+
+  auto bufferFormatOpt = buffer.GetDrmFormat();
+  if (!bufferFormatOpt) {
+    ALOGE("Failed to get layer buffer format.");
+    return false;
+  }
+  uint32_t bufferFormat = *bufferFormatOpt;
+
+  if (!IsDrmFormatSupported(bufferFormat)) {
+    return false;
+  }
+
+  return true;
+}
+
+HWC2::Error GuestComposer::composeLayerInto(
+    Layer* srcLayer, std::uint8_t* dstBuffer, std::uint32_t dstBufferWidth,
+    std::uint32_t dstBufferHeight, std::uint32_t dstBufferStrideBytes,
+    std::uint32_t dstBufferBytesPerPixel) {
+  libyuv::RotationMode rotation =
+      GetRotationFromTransform(srcLayer->getTransform());
+
+  auto srcBufferOpt = mGralloc.Import(srcLayer->waitAndGetBuffer());
+  if (!srcBufferOpt) {
+    ALOGE("%s: failed to import layer buffer.", __FUNCTION__);
+    return HWC2::Error::NoResources;
+  }
+  GrallocBuffer& srcBuffer = *srcBufferOpt;
+
+  auto srcBufferViewOpt = srcBuffer.Lock();
+  if (!srcBufferViewOpt) {
+    ALOGE("%s: failed to lock import layer buffer.", __FUNCTION__);
+    return HWC2::Error::NoResources;
+  }
+  GrallocBufferView& srcBufferView = *srcBufferViewOpt;
+
+  hwc_rect_t srcLayerCrop = srcLayer->getSourceCropInt();
+  hwc_rect_t srcLayerDisplayFrame = srcLayer->getDisplayFrame();
+
+  auto srcLayerSpecOpt = GetBufferSpec(srcBuffer, srcBufferView, srcLayerCrop);
+  if (!srcLayerSpecOpt) {
+    return HWC2::Error::NoResources;
+  }
+  BufferSpec srcLayerSpec = *srcLayerSpecOpt;
+
+  // TODO(jemoreira): Remove the hardcoded fomat.
+  bool needsConversion = srcLayerSpec.drmFormat != DRM_FORMAT_XBGR8888;
+  bool needsScaling = LayerNeedsScaling(*srcLayer);
+  bool needsRotation = rotation != libyuv::kRotate0;
+  bool needsTranspose = needsRotation && rotation != libyuv::kRotate180;
+  bool needsVFlip = GetVFlipFromTransform(srcLayer->getTransform());
+  bool needsAttenuation = LayerNeedsAttenuation(*srcLayer);
+  bool needsBlending = LayerNeedsBlending(*srcLayer);
+  bool needsCopy = !(needsConversion || needsScaling || needsRotation ||
+                     needsVFlip || needsAttenuation || needsBlending);
+
+  BufferSpec dstLayerSpec(
+      dstBuffer,
+      /*buffer_ycbcr=*/std::nullopt, dstBufferWidth, dstBufferHeight,
+      srcLayerDisplayFrame.left, srcLayerDisplayFrame.top,
+      srcLayerDisplayFrame.right - srcLayerDisplayFrame.left,
+      srcLayerDisplayFrame.bottom - srcLayerDisplayFrame.top,
+      DRM_FORMAT_XBGR8888, dstBufferStrideBytes, dstBufferBytesPerPixel);
+
+  // Add the destination layer to the bottom of the buffer stack
+  std::vector<BufferSpec> dstBufferStack(1, dstLayerSpec);
+
+  // If more than operation is to be performed, a temporary buffer is needed for
+  // each additional operation
+
+  // N operations need N destination buffers, the destination layer (the
+  // framebuffer) is one of them, so only N-1 temporary buffers are needed.
+  // Vertical flip is not taken into account because it can be done together
+  // with any other operation.
+  int neededScratchBuffers = (needsConversion ? 1 : 0) +
+                             (needsScaling ? 1 : 0) + (needsRotation ? 1 : 0) +
+                             (needsAttenuation ? 1 : 0) +
+                             (needsBlending ? 1 : 0) + (needsCopy ? 1 : 0) - 1;
+
+  int mScratchBufferWidth =
+      srcLayerDisplayFrame.right - srcLayerDisplayFrame.left;
+  int mScratchBufferHeight =
+      srcLayerDisplayFrame.bottom - srcLayerDisplayFrame.top;
+  int mScratchBufferStrideBytes =
+      AlignToPower2(mScratchBufferWidth * dstBufferBytesPerPixel, 4);
+  int mScratchBufferSizeBytes =
+      mScratchBufferHeight * mScratchBufferStrideBytes;
+
+  for (int i = 0; i < neededScratchBuffers; i++) {
+    BufferSpec mScratchBufferspec(
+        getRotatingScratchBuffer(mScratchBufferSizeBytes, i),
+        mScratchBufferWidth, mScratchBufferHeight, mScratchBufferStrideBytes);
+    dstBufferStack.push_back(mScratchBufferspec);
+  }
+
+  // Conversion and scaling should always be the first operations, so that every
+  // other operation works on equally sized frames (guaranteed to fit in the
+  // scratch buffers).
+
+  // TODO(jemoreira): We are converting to ARGB as the first step under the
+  // assumption that scaling ARGB is faster than scaling I420 (the most common).
+  // This should be confirmed with testing.
+  if (needsConversion) {
+    BufferSpec& dstBufferSpec = dstBufferStack.back();
+    if (needsScaling || needsTranspose) {
+      // If a rotation or a scaling operation are needed the dimensions at the
+      // top of the buffer stack are wrong (wrong sizes for scaling, swapped
+      // width and height for 90 and 270 rotations).
+      // Make width and height match the crop sizes on the source
+      int srcWidth = srcLayerSpec.cropWidth;
+      int srcHeight = srcLayerSpec.cropHeight;
+      int dst_stride_bytes =
+          AlignToPower2(srcWidth * dstBufferBytesPerPixel, 4);
+      size_t needed_size = dst_stride_bytes * srcHeight;
+      dstBufferSpec.width = srcWidth;
+      dstBufferSpec.height = srcHeight;
+      // Adjust the stride accordingly
+      dstBufferSpec.strideBytes = dst_stride_bytes;
+      // Crop sizes also need to be adjusted
+      dstBufferSpec.cropWidth = srcWidth;
+      dstBufferSpec.cropHeight = srcHeight;
+      // cropX and y are fine at 0, format is already set to match destination
+
+      // In case of a scale, the source frame may be bigger than the default tmp
+      // buffer size
+      dstBufferSpec.buffer = getSpecialScratchBuffer(needed_size);
+    }
+
+    int retval = DoConversion(srcLayerSpec, dstBufferSpec, needsVFlip);
+    if (retval) {
+      ALOGE("Got error code %d from DoConversion function", retval);
+    }
+    needsVFlip = false;
+    srcLayerSpec = dstBufferSpec;
+    dstBufferStack.pop_back();
+  }
+
+  if (needsScaling) {
+    BufferSpec& dstBufferSpec = dstBufferStack.back();
+    if (needsTranspose) {
+      // If a rotation is needed, the temporary buffer has the correct size but
+      // needs to be transposed and have its stride updated accordingly. The
+      // crop sizes also needs to be transposed, but not the x and y since they
+      // are both zero in a temporary buffer (and it is a temporary buffer
+      // because a rotation will be performed next).
+      std::swap(dstBufferSpec.width, dstBufferSpec.height);
+      std::swap(dstBufferSpec.cropWidth, dstBufferSpec.cropHeight);
+      // TODO (jemoreira): Aligment (To align here may cause the needed size to
+      // be bigger than the buffer, so care should be taken)
+      dstBufferSpec.strideBytes = dstBufferSpec.width * dstBufferBytesPerPixel;
+    }
+    int retval = DoScaling(srcLayerSpec, dstBufferSpec, needsVFlip);
+    needsVFlip = false;
+    if (retval) {
+      ALOGE("Got error code %d from DoScaling function", retval);
+    }
+    srcLayerSpec = dstBufferSpec;
+    dstBufferStack.pop_back();
+  }
+
+  if (needsRotation) {
+    int retval =
+        DoRotation(srcLayerSpec, dstBufferStack.back(), rotation, needsVFlip);
+    needsVFlip = false;
+    if (retval) {
+      ALOGE("Got error code %d from DoTransform function", retval);
+    }
+    srcLayerSpec = dstBufferStack.back();
+    dstBufferStack.pop_back();
+  }
+
+  if (needsAttenuation) {
+    int retval = DoAttenuation(srcLayerSpec, dstBufferStack.back(), needsVFlip);
+    needsVFlip = false;
+    if (retval) {
+      ALOGE("Got error code %d from DoBlending function", retval);
+    }
+    srcLayerSpec = dstBufferStack.back();
+    dstBufferStack.pop_back();
+  }
+
+  if (needsCopy) {
+    int retval = DoCopy(srcLayerSpec, dstBufferStack.back(), needsVFlip);
+    needsVFlip = false;
+    if (retval) {
+      ALOGE("Got error code %d from DoBlending function", retval);
+    }
+    srcLayerSpec = dstBufferStack.back();
+    dstBufferStack.pop_back();
+  }
+
+  // Blending (if needed) should always be the last operation, so that it reads
+  // and writes in the destination layer and not some temporary buffer.
+  if (needsBlending) {
+    int retval = DoBlending(srcLayerSpec, dstBufferStack.back(), needsVFlip);
+    needsVFlip = false;
+    if (retval) {
+      ALOGE("Got error code %d from DoBlending function", retval);
+    }
+    // Don't need to assign destination to source in the last one
+    dstBufferStack.pop_back();
+  }
+
+  return HWC2::Error::None;
+}
+
+namespace {
+
+static constexpr const std::array<float, 16> kInvertColorMatrix = {
+    // clang-format off
+  -1.0f,  0.0f,  0.0f, 0.0f,
+   0.0f, -1.0f,  0.0f, 0.0f,
+   0.0f, -1.0f, -1.0f, 0.0f,
+   1.0f,  1.0f,  1.0f, 1.0f,
+    // clang-format on
+};
+
+// Returns a color matrix that can be used with libyuv by converting values
+// in -1 to 1 into -64 to 64 and transposing.
+std::array<std::int8_t, 16> ToLibyuvColorMatrix(
+    const std::array<float, 16>& in) {
+  std::array<std::int8_t, 16> out;
+
+  for (int r = 0; r < 4; r++) {
+    for (int c = 0; c < 4; c++) {
+      int indexIn = (4 * r) + c;
+      int indexOut = (4 * c) + r;
+
+      out[indexOut] = std::max(
+          -128, std::min(127, static_cast<int>(in[indexIn] * 64.0f + 0.5f)));
+    }
+  }
+
+  return out;
+}
+
+}  // namespace
+
+HWC2::Error GuestComposer::applyColorTransformToRGBA(
+    const ColorTransformWithMatrix& transform,  //
+    std::uint8_t* buffer,                       //
+    std::uint32_t bufferWidth,                  //
+    std::uint32_t bufferHeight,                 //
+    std::uint32_t bufferStrideBytes) {
+  if (transform.transformType == ColorTransform::ARBITRARY_MATRIX) {
+    if (!transform.transformMatrixOpt.has_value()) {
+      ALOGE("%s: color transform matrix missing", __FUNCTION__);
+      return HWC2::Error::BadParameter;
+    }
+    const auto& transformMatrix = *transform.transformMatrixOpt;
+    const auto transformMatrixLibyuv = ToLibyuvColorMatrix(transformMatrix);
+    libyuv::ARGBColorMatrix(buffer, bufferStrideBytes,     // in buffer params
+                            buffer, bufferStrideBytes,     // out buffer params
+                            transformMatrixLibyuv.data(),  //
+                            bufferWidth,                   //
+                            bufferHeight);
+  } else if (transform.transformType == ColorTransform::VALUE_INVERSE) {
+    const auto transformMatrixLibyuv = ToLibyuvColorMatrix(kInvertColorMatrix);
+    libyuv::ARGBColorMatrix(buffer, bufferStrideBytes,     // in buffer params
+                            buffer, bufferStrideBytes,     // out buffer params
+                            transformMatrixLibyuv.data(),  //
+                            bufferWidth,                   //
+                            bufferHeight);
+  } else if (transform.transformType == ColorTransform::GRAYSCALE) {
+    libyuv::ARGBGrayTo(buffer, bufferStrideBytes,  // in buffer params
+                       buffer, bufferStrideBytes,  // out buffer params
+                       bufferWidth,                //
+                       bufferHeight);
+  } else {
+    const auto transformTypeString = toString(transform.transformType);
+    ALOGE("%s: unhandled color transform type %s", __FUNCTION__,
+          transformTypeString.c_str());
+    return HWC2::Error::BadParameter;
+  }
+
+  return HWC2::Error::None;
+}
+
+uint8_t* GuestComposer::getRotatingScratchBuffer(std::size_t neededSize,
+                                                 std::uint32_t order) {
+  static constexpr const int kNumScratchBufferPieces = 2;
+
+  std::size_t totalNeededSize = neededSize * kNumScratchBufferPieces;
+  if (mScratchBuffer.size() < totalNeededSize) {
+    mScratchBuffer.resize(totalNeededSize);
+  }
+
+  std::size_t bufferIndex = order % kNumScratchBufferPieces;
+  std::size_t bufferOffset = bufferIndex * neededSize;
+  return &mScratchBuffer[bufferOffset];
+}
+
+uint8_t* GuestComposer::getSpecialScratchBuffer(size_t neededSize) {
+  if (mSpecialScratchBuffer.size() < neededSize) {
+    mSpecialScratchBuffer.resize(neededSize);
+  }
+
+  return &mSpecialScratchBuffer[0];
+}
+
+}  // namespace android
diff --git a/system/hwc2/GuestComposer.h b/system/hwc2/GuestComposer.h
new file mode 100644
index 0000000..8cc5d62
--- /dev/null
+++ b/system/hwc2/GuestComposer.h
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_HWC_GUESTCOMPOSER_H
+#define ANDROID_HWC_GUESTCOMPOSER_H
+
+#include "Common.h"
+#include "Composer.h"
+#include "Display.h"
+#include "DrmPresenter.h"
+#include "Gralloc.h"
+#include "Layer.h"
+
+namespace android {
+
+class GuestComposer : public Composer {
+ public:
+  GuestComposer() = default;
+
+  GuestComposer(const GuestComposer&) = delete;
+  GuestComposer& operator=(const GuestComposer&) = delete;
+
+  GuestComposer(GuestComposer&&) = delete;
+  GuestComposer& operator=(GuestComposer&&) = delete;
+
+  HWC2::Error init(const HotplugCallback& cb) override;
+
+  HWC2::Error createDisplays(
+      Device* device,
+      const AddDisplayToDeviceFunction& addDisplayToDeviceFn) override;
+
+  HWC2::Error createDisplay(
+      Device* device, uint32_t displayId, uint32_t width, uint32_t height,
+      uint32_t dpiX, uint32_t dpiY, uint32_t refreshRateHz,
+      const AddDisplayToDeviceFunction& addDisplayToDeviceFn) override;
+
+  HWC2::Error onDisplayDestroy(Display*) override;
+
+  HWC2::Error onDisplayClientTargetSet(Display*) override {
+    return HWC2::Error::None;
+  }
+
+  // Determines if this composer can compose the given layers on the given
+  // display and requests changes for layers that can't not be composed.
+  HWC2::Error validateDisplay(
+      Display* display, std::unordered_map<hwc2_layer_t, HWC2::Composition>*
+                            outLayerCompositionChanges) override;
+
+  // Performs the actual composition of layers and presents the composed result
+  // to the display.
+  HWC2::Error presentDisplay(Display* display,
+                             int32_t* outPresentFence) override;
+
+ private:
+  struct DisplayConfig {
+    int width;
+    int height;
+    int dpiX;
+    int dpiY;
+    int refreshRateHz;
+  };
+
+  HWC2::Error getDisplayConfigsFromDeviceConfig(
+      std::vector<DisplayConfig>* configs);
+
+  HWC2::Error getDisplayConfigsFromSystemProp(
+      std::vector<DisplayConfig>* configs);
+
+  // Returns true if the given layer's buffer has supported format.
+  bool canComposeLayer(Layer* layer);
+
+  // Composes the given layer into the given destination buffer.
+  HWC2::Error composeLayerInto(Layer* layer, std::uint8_t* dstBuffer,
+                               std::uint32_t dstBufferWidth,
+                               std::uint32_t dstBufferHeight,
+                               std::uint32_t dstBufferStrideBytes,
+                               std::uint32_t dstBufferBytesPerPixel);
+
+  struct GuestComposerDisplayInfo {
+    // Additional per display buffer for the composition result.
+    buffer_handle_t compositionResultBuffer = nullptr;
+
+    std::unique_ptr<DrmBuffer> compositionResultDrmBuffer;
+  };
+
+  std::unordered_map<hwc2_display_t, GuestComposerDisplayInfo> mDisplayInfos;
+
+  Gralloc mGralloc;
+
+  DrmPresenter mDrmPresenter;
+
+  // Cuttlefish on QEMU does not have a display. Disable presenting to avoid
+  // spamming logcat with DRM commit failures.
+  bool mPresentDisabled = false;
+
+  uint8_t* getRotatingScratchBuffer(std::size_t neededSize,
+                                    std::uint32_t order);
+  uint8_t* getSpecialScratchBuffer(std::size_t neededSize);
+
+  HWC2::Error applyColorTransformToRGBA(
+      const ColorTransformWithMatrix& colotTransform, //
+      std::uint8_t* buffer,//
+      std::uint32_t bufferWidth,//
+      std::uint32_t bufferHeight,//
+      std::uint32_t bufferStrideBytes);
+
+  std::vector<uint8_t> mScratchBuffer;
+  std::vector<uint8_t> mSpecialScratchBuffer;
+};
+
+}  // namespace android
+
+#endif
diff --git a/system/hwc2/HostComposer.cpp b/system/hwc2/HostComposer.cpp
new file mode 100644
index 0000000..c55eccd
--- /dev/null
+++ b/system/hwc2/HostComposer.cpp
@@ -0,0 +1,858 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "HostComposer.h"
+
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+#include <android-base/parseint.h>
+#include <android-base/properties.h>
+#include <android-base/strings.h>
+#include <drm/virtgpu_drm.h>
+#include <poll.h>
+#include <sync/sync.h>
+#include <ui/GraphicBuffer.h>
+#include <ui/GraphicBufferAllocator.h>
+#include <ui/GraphicBufferMapper.h>
+
+#include "../egl/goldfish_sync.h"
+#include "Device.h"
+#include "Display.h"
+
+namespace android {
+namespace {
+
+static int getVsyncHzFromProperty() {
+  static constexpr const auto kVsyncProp = "ro.boot.qemu.vsync";
+
+  const auto vsyncProp = android::base::GetProperty(kVsyncProp, "");
+  DEBUG_LOG("%s: prop value is: %s", __FUNCTION__, vsyncProp.c_str());
+
+  uint64_t vsyncPeriod;
+  if (!android::base::ParseUint(vsyncProp, &vsyncPeriod)) {
+    ALOGE("%s: failed to parse vsync period '%s', returning default 60",
+          __FUNCTION__, vsyncProp.c_str());
+    return 60;
+  }
+
+  return static_cast<int>(vsyncPeriod);
+}
+
+static bool isMinigbmFromProperty() {
+  static constexpr const auto kGrallocProp = "ro.hardware.gralloc";
+
+  const auto grallocProp = android::base::GetProperty(kGrallocProp, "");
+  DEBUG_LOG("%s: prop value is: %s", __FUNCTION__, grallocProp.c_str());
+
+  if (grallocProp == "minigbm") {
+    ALOGD("%s: Using minigbm, in minigbm mode.\n", __FUNCTION__);
+    return true;
+  } else {
+    ALOGD("%s: Is not using minigbm, in goldfish mode.\n", __FUNCTION__);
+    return false;
+  }
+}
+
+#define DEFINE_AND_VALIDATE_HOST_CONNECTION                                   \
+  HostConnection* hostCon = createOrGetHostConnection();                      \
+  if (!hostCon) {                                                             \
+    ALOGE("%s: Failed to get host connection\n", __FUNCTION__);               \
+    return HWC2::Error::NoResources;                                          \
+  }                                                                           \
+  ExtendedRCEncoderContext* rcEnc = hostCon->rcEncoder();                     \
+  if (!rcEnc) {                                                               \
+    ALOGE("%s: Failed to get renderControl encoder context\n", __FUNCTION__); \
+    return HWC2::Error::NoResources;                                          \
+  }
+
+static std::unique_ptr<HostConnection> sHostCon;
+
+static HostConnection* createOrGetHostConnection() {
+  if (!sHostCon) {
+    sHostCon = HostConnection::createUnique();
+  }
+  return sHostCon.get();
+}
+
+typedef struct compose_layer {
+  uint32_t cbHandle;
+  hwc2_composition_t composeMode;
+  hwc_rect_t displayFrame;
+  hwc_frect_t crop;
+  int32_t blendMode;
+  float alpha;
+  hwc_color_t color;
+  hwc_transform_t transform;
+} ComposeLayer;
+
+typedef struct compose_device {
+  uint32_t version;
+  uint32_t targetHandle;
+  uint32_t numLayers;
+  struct compose_layer layer[0];
+} ComposeDevice;
+
+typedef struct compose_device_v2 {
+  uint32_t version;
+  uint32_t displayId;
+  uint32_t targetHandle;
+  uint32_t numLayers;
+  struct compose_layer layer[0];
+} ComposeDevice_v2;
+
+class ComposeMsg {
+ public:
+  ComposeMsg(uint32_t layerCnt = 0)
+      : mData(sizeof(ComposeDevice) + layerCnt * sizeof(ComposeLayer)) {
+    mComposeDevice = reinterpret_cast<ComposeDevice*>(mData.data());
+    mLayerCnt = layerCnt;
+  }
+
+  ComposeDevice* get() { return mComposeDevice; }
+
+  uint32_t getLayerCnt() { return mLayerCnt; }
+
+ private:
+  std::vector<uint8_t> mData;
+  uint32_t mLayerCnt;
+  ComposeDevice* mComposeDevice;
+};
+
+class ComposeMsg_v2 {
+ public:
+  ComposeMsg_v2(uint32_t layerCnt = 0)
+      : mData(sizeof(ComposeDevice_v2) + layerCnt * sizeof(ComposeLayer)) {
+    mComposeDevice = reinterpret_cast<ComposeDevice_v2*>(mData.data());
+    mLayerCnt = layerCnt;
+  }
+
+  ComposeDevice_v2* get() { return mComposeDevice; }
+
+  uint32_t getLayerCnt() { return mLayerCnt; }
+
+ private:
+  std::vector<uint8_t> mData;
+  uint32_t mLayerCnt;
+  ComposeDevice_v2* mComposeDevice;
+};
+
+const native_handle_t* AllocateDisplayColorBuffer(int width, int height) {
+  const uint32_t layerCount = 1;
+  const uint64_t graphicBufferId = 0;  // not used
+  buffer_handle_t h;
+  uint32_t stride;
+
+  if (GraphicBufferAllocator::get().allocate(
+          width, height, PIXEL_FORMAT_RGBA_8888, layerCount,
+          (GraphicBuffer::USAGE_HW_COMPOSER | GraphicBuffer::USAGE_HW_RENDER),
+          &h, &stride, graphicBufferId, "EmuHWC2") == OK) {
+    return static_cast<const native_handle_t*>(h);
+  } else {
+    return nullptr;
+  }
+}
+
+void FreeDisplayColorBuffer(const native_handle_t* h) {
+  GraphicBufferAllocator::get().free(h);
+}
+
+}  // namespace
+
+HWC2::Error HostComposer::init(const HotplugCallback& cb) {
+  mIsMinigbm = isMinigbmFromProperty();
+  if (mIsMinigbm) {
+    if (!mDrmPresenter.init(cb)) {
+      ALOGE("%s: failed to initialize DrmPresenter", __FUNCTION__);
+      return HWC2::Error::NoResources;
+    }
+  } else {
+    mSyncDeviceFd = goldfish_sync_open();
+  }
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error HostComposer::createDisplays(
+    Device* device, const AddDisplayToDeviceFunction& addDisplayToDeviceFn) {
+  HWC2::Error error = HWC2::Error::None;
+
+  error = createPrimaryDisplay(device, addDisplayToDeviceFn);
+  if (error != HWC2::Error::None) {
+    ALOGE("%s failed to create primary display", __FUNCTION__);
+    return error;
+  }
+
+  error = createSecondaryDisplays(device, addDisplayToDeviceFn);
+  if (error != HWC2::Error::None) {
+    ALOGE("%s failed to create secondary displays", __FUNCTION__);
+    return error;
+  }
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error HostComposer::createPrimaryDisplay(
+    Device* device, const AddDisplayToDeviceFunction& addDisplayToDeviceFn) {
+  HWC2::Error error = HWC2::Error::None;
+
+  DEFINE_AND_VALIDATE_HOST_CONNECTION
+  hostCon->lock();
+  int width = rcEnc->rcGetFBParam(rcEnc, FB_WIDTH);
+  int height = rcEnc->rcGetFBParam(rcEnc, FB_HEIGHT);
+  int dpiX = rcEnc->rcGetFBParam(rcEnc, FB_XDPI);
+  int dpiY = rcEnc->rcGetFBParam(rcEnc, FB_YDPI);
+  hostCon->unlock();
+
+  int refreshRateHz = getVsyncHzFromProperty();
+
+  auto display = std::make_unique<Display>(*device, this, 0);
+  if (display == nullptr) {
+    ALOGE("%s failed to allocate display", __FUNCTION__);
+    return HWC2::Error::NoResources;
+  }
+
+  auto displayId = display->getId();
+
+  error = display->init(width, height, dpiX, dpiY, refreshRateHz);
+  if (error != HWC2::Error::None) {
+    ALOGE("%s failed to initialize display:%" PRIu64, __FUNCTION__, displayId);
+    return error;
+  }
+
+  error = createHostComposerDisplayInfo(display.get(), /*hostDisplayId=*/0);
+  if (error != HWC2::Error::None) {
+    ALOGE("%s failed to initialize host info for display:%" PRIu64,
+          __FUNCTION__, displayId);
+    return error;
+  }
+
+  error = addDisplayToDeviceFn(std::move(display));
+  if (error != HWC2::Error::None) {
+    ALOGE("%s failed to add display:%" PRIu64, __FUNCTION__, displayId);
+    return error;
+  }
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error HostComposer::createDisplay(
+    Device* device, uint32_t displayId, uint32_t width, uint32_t height,
+    uint32_t dpiX, uint32_t dpiY, uint32_t refreshRateHz,
+    const AddDisplayToDeviceFunction& addDisplayToDeviceFn) {
+  HWC2::Error error;
+  Display* display = device->getDisplay(displayId);
+  if (display) {
+    ALOGD("%s display %d already existed, then update", __func__, displayId);
+  }
+
+  DEFINE_AND_VALIDATE_HOST_CONNECTION
+  hostCon->lock();
+  if (rcEnc->rcCreateDisplayById(rcEnc, displayId)) {
+    ALOGE("%s host failed to create display %" PRIu32, __func__, displayId);
+    hostCon->unlock();
+    return HWC2::Error::NoResources;
+  }
+  if (rcEnc->rcSetDisplayPoseDpi(rcEnc, displayId, -1, -1, width, height, dpiX/1000)) {
+    ALOGE("%s host failed to set display %" PRIu32, __func__, displayId);
+    hostCon->unlock();
+    return HWC2::Error::NoResources;
+  }
+  hostCon->unlock();
+
+  std::optional<std::vector<uint8_t>> edid;
+  if (mIsMinigbm) {
+    edid = mDrmPresenter.getEdid(displayId);
+  }
+  if (!display) {
+    auto newDisplay = std::make_unique<Display>(*device, this, displayId);
+    if (newDisplay == nullptr) {
+      ALOGE("%s failed to allocate display", __FUNCTION__);
+      return HWC2::Error::NoResources;
+    }
+
+
+    error = newDisplay->init(width, height, dpiX, dpiY, refreshRateHz, edid);
+    if (error != HWC2::Error::None) {
+      ALOGE("%s failed to initialize display:%" PRIu32, __FUNCTION__,
+            displayId);
+      return error;
+    }
+
+    error =
+        createHostComposerDisplayInfo(newDisplay.get(), displayId);
+    if (error != HWC2::Error::None) {
+      ALOGE("%s failed to initialize host info for display:%" PRIu32,
+            __FUNCTION__, displayId);
+      return error;
+    }
+
+    error = addDisplayToDeviceFn(std::move(newDisplay));
+    if (error != HWC2::Error::None) {
+      ALOGE("%s failed to add display:%" PRIu32, __FUNCTION__, displayId);
+      return error;
+    }
+  } else {
+    display->lock();
+    // update display parameters
+    error = display->updateParameters(width, height, dpiX, dpiY,
+                                      refreshRateHz, edid);
+    if (error != HWC2::Error::None) {
+      ALOGE("%s failed to update display:%" PRIu32, __FUNCTION__, displayId);
+      display->unlock();
+      return error;
+    }
+
+    error = createHostComposerDisplayInfo(display, displayId);
+    if (error != HWC2::Error::None) {
+      ALOGE("%s failed to initialize host info for display:%" PRIu32,
+            __FUNCTION__, displayId);
+      display->unlock();
+      return error;
+    }
+    display->unlock();
+  }
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error HostComposer::createSecondaryDisplays(
+    Device* device, const AddDisplayToDeviceFunction& addDisplayToDeviceFn) {
+  HWC2::Error error = HWC2::Error::None;
+
+  static constexpr const char kExternalDisplayProp[] =
+      "hwservicemanager.external.displays";
+
+  const auto propString = android::base::GetProperty(kExternalDisplayProp, "");
+  DEBUG_LOG("%s: prop value is: %s", __FUNCTION__, propString.c_str());
+
+  if (propString.empty()) {
+    return HWC2::Error::None;
+  }
+
+  const std::vector<std::string> propStringParts =
+      android::base::Split(propString, ",");
+  if (propStringParts.size() % 5 != 0) {
+    ALOGE("%s: Invalid syntax for system prop %s which is %s", __FUNCTION__,
+          kExternalDisplayProp, propString.c_str());
+    return HWC2::Error::BadParameter;
+  }
+
+  std::vector<int> propIntParts;
+  for (const std::string& propStringPart : propStringParts) {
+    uint64_t propUintPart;
+    if (!android::base::ParseUint(propStringPart, &propUintPart)) {
+      ALOGE("%s: Invalid syntax for system prop %s which is %s", __FUNCTION__,
+            kExternalDisplayProp, propString.c_str());
+      return HWC2::Error::BadParameter;
+    }
+    propIntParts.push_back(static_cast<int>(propUintPart));
+  }
+
+  static constexpr const uint32_t kHostDisplayIdStart = 6;
+
+  uint32_t secondaryDisplayIndex = 1;
+  while (!propIntParts.empty()) {
+    int width = propIntParts[1];
+    int height = propIntParts[2];
+    int dpiX = propIntParts[3];
+    int dpiY = propIntParts[3];
+    int refreshRateHz = 160;
+
+    propIntParts.erase(propIntParts.begin(), propIntParts.begin() + 5);
+
+    uint32_t expectedHostDisplayId =
+        kHostDisplayIdStart + secondaryDisplayIndex - 1;
+    uint32_t actualHostDisplayId = 0;
+
+    DEFINE_AND_VALIDATE_HOST_CONNECTION
+    hostCon->lock();
+    rcEnc->rcDestroyDisplay(rcEnc, expectedHostDisplayId);
+    rcEnc->rcCreateDisplay(rcEnc, &actualHostDisplayId);
+    rcEnc->rcSetDisplayPose(rcEnc, actualHostDisplayId, -1, -1, width, height);
+    hostCon->unlock();
+
+    if (actualHostDisplayId != expectedHostDisplayId) {
+      ALOGE(
+          "Something wrong with host displayId allocation, expected %d "
+          "but received %d",
+          expectedHostDisplayId, actualHostDisplayId);
+    }
+
+    auto display =
+        std::make_unique<Display>(*device, this, secondaryDisplayIndex++);
+    if (display == nullptr) {
+      ALOGE("%s failed to allocate display", __FUNCTION__);
+      return HWC2::Error::NoResources;
+    }
+
+    auto displayId = display->getId();
+
+    error = display->init(width, height, dpiX, dpiY, refreshRateHz);
+    if (error != HWC2::Error::None) {
+      ALOGE("%s failed to initialize display:%" PRIu64, __FUNCTION__,
+            displayId);
+      return error;
+    }
+
+    error = createHostComposerDisplayInfo(display.get(), actualHostDisplayId);
+    if (error != HWC2::Error::None) {
+      ALOGE("%s failed to initialize host info for display:%" PRIu64,
+            __FUNCTION__, displayId);
+      return error;
+    }
+
+    error = addDisplayToDeviceFn(std::move(display));
+    if (error != HWC2::Error::None) {
+      ALOGE("%s failed to add display:%" PRIu64, __FUNCTION__, displayId);
+      return error;
+    }
+  }
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error HostComposer::createHostComposerDisplayInfo(
+    Display* display, uint32_t hostDisplayId) {
+  HWC2::Error error = HWC2::Error::None;
+
+  hwc2_display_t displayId = display->getId();
+  hwc2_config_t displayConfigId;
+  int32_t displayWidth;
+  int32_t displayHeight;
+
+  error = display->getActiveConfig(&displayConfigId);
+  if (error != HWC2::Error::None) {
+    ALOGE("%s: display:%" PRIu64 " has no active config", __FUNCTION__,
+          displayId);
+    return error;
+  }
+
+  error = display->getDisplayAttributeEnum(
+      displayConfigId, HWC2::Attribute::Width, &displayWidth);
+  if (error != HWC2::Error::None) {
+    ALOGE("%s: display:%" PRIu64 " failed to get width", __FUNCTION__,
+          displayId);
+    return error;
+  }
+
+  error = display->getDisplayAttributeEnum(
+      displayConfigId, HWC2::Attribute::Height, &displayHeight);
+  if (error != HWC2::Error::None) {
+    ALOGE("%s: display:%" PRIu64 " failed to get height", __FUNCTION__,
+          displayId);
+    return error;
+  }
+
+  auto it = mDisplayInfos.find(displayId);
+  if (it != mDisplayInfos.end()) {
+    ALOGE("%s: display:%" PRIu64 " already created?", __FUNCTION__, displayId);
+  }
+
+  HostComposerDisplayInfo& displayInfo = mDisplayInfos[displayId];
+
+  displayInfo.hostDisplayId = hostDisplayId;
+
+  displayInfo.compositionResultBuffer =
+      AllocateDisplayColorBuffer(displayWidth, displayHeight);
+  if (displayInfo.compositionResultBuffer == nullptr) {
+    ALOGE("%s: display:%" PRIu64 " failed to create target buffer",
+          __FUNCTION__, displayId);
+    return HWC2::Error::NoResources;
+  }
+
+  if (mIsMinigbm) {
+    displayInfo.compositionResultDrmBuffer.reset(
+        new DrmBuffer(displayInfo.compositionResultBuffer, mDrmPresenter));
+
+    uint32_t vsyncPeriod = 1000 * 1000 * 1000 / mDrmPresenter.refreshRate();
+    error = display->setVsyncPeriod(vsyncPeriod);
+    if (error != HWC2::Error::None) {
+      ALOGE("%s: display:%" PRIu64 " failed to set vsync height", __FUNCTION__,
+            displayId);
+      return error;
+    }
+  }
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error HostComposer::onDisplayDestroy(Display* display) {
+  hwc2_display_t displayId = display->getId();
+
+  auto it = mDisplayInfos.find(displayId);
+  if (it == mDisplayInfos.end()) {
+    ALOGE("%s: display:%" PRIu64 " missing display buffers?", __FUNCTION__,
+          displayId);
+    return HWC2::Error::BadDisplay;
+  }
+
+  HostComposerDisplayInfo& displayInfo = mDisplayInfos[displayId];
+
+  if (displayId != 0) {
+    DEFINE_AND_VALIDATE_HOST_CONNECTION
+    hostCon->lock();
+    rcEnc->rcDestroyDisplay(rcEnc, displayInfo.hostDisplayId);
+    hostCon->unlock();
+  }
+
+  FreeDisplayColorBuffer(displayInfo.compositionResultBuffer);
+
+  mDisplayInfos.erase(it);
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error HostComposer::onDisplayClientTargetSet(Display* display) {
+  hwc2_display_t displayId = display->getId();
+
+  auto it = mDisplayInfos.find(displayId);
+  if (it == mDisplayInfos.end()) {
+    ALOGE("%s: display:%" PRIu64 " missing display buffers?", __FUNCTION__,
+          displayId);
+    return HWC2::Error::BadDisplay;
+  }
+
+  HostComposerDisplayInfo& displayInfo = mDisplayInfos[displayId];
+
+  if (mIsMinigbm) {
+    FencedBuffer& clientTargetFencedBuffer = display->getClientTarget();
+
+    displayInfo.clientTargetDrmBuffer.reset(
+        new DrmBuffer(clientTargetFencedBuffer.getBuffer(), mDrmPresenter));
+  }
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error HostComposer::validateDisplay(
+    Display* display, std::unordered_map<hwc2_layer_t, HWC2::Composition>*
+                          layerCompositionChanges) {
+  DEFINE_AND_VALIDATE_HOST_CONNECTION
+  hostCon->lock();
+  bool hostCompositionV1 = rcEnc->hasHostCompositionV1();
+  bool hostCompositionV2 = rcEnc->hasHostCompositionV2();
+  hostCon->unlock();
+
+  const std::vector<Layer*> layers = display->getOrderedLayers();
+
+  if (hostCompositionV1 || hostCompositionV2) {
+    // Support Device and SolidColor, otherwise, fallback all layers to Client.
+    bool fallBack = false;
+    // TODO: use local var compositiontype, avoid call getCompositionType() many
+    // times
+    for (auto& layer : layers) {
+      if (layer->getCompositionType() == HWC2::Composition::Invalid) {
+        // Log error for unused layers, layer leak?
+        ALOGE("%s layer %u CompositionType(%d) not set", __FUNCTION__,
+              (uint32_t)layer->getId(), layer->getCompositionType());
+        continue;
+      }
+      if (layer->getCompositionType() == HWC2::Composition::Client ||
+          layer->getCompositionType() == HWC2::Composition::Cursor ||
+          layer->getCompositionType() == HWC2::Composition::Sideband) {
+        ALOGW("%s: layer %u CompositionType %d, fallback", __FUNCTION__,
+              (uint32_t)layer->getId(), layer->getCompositionType());
+        fallBack = true;
+        break;
+      }
+    }
+
+    if (display->hasColorTransform()) {
+      fallBack = true;
+    }
+
+    if (fallBack) {
+      for (auto& layer : layers) {
+        if (layer->getCompositionType() == HWC2::Composition::Invalid) {
+          continue;
+        }
+        if (layer->getCompositionType() != HWC2::Composition::Client) {
+          (*layerCompositionChanges)[layer->getId()] =
+              HWC2::Composition::Client;
+        }
+      }
+    }
+  } else {
+    for (auto& layer : layers) {
+      if (layer->getCompositionType() != HWC2::Composition::Client) {
+        (*layerCompositionChanges)[layer->getId()] = HWC2::Composition::Client;
+      }
+    }
+  }
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error HostComposer::presentDisplay(Display* display,
+                                         int32_t* outRetireFence) {
+  auto it = mDisplayInfos.find(display->getId());
+  if (it == mDisplayInfos.end()) {
+    ALOGE("%s: failed to find display buffers for display:%" PRIu64,
+          __FUNCTION__, display->getId());
+    return HWC2::Error::BadDisplay;
+  }
+
+  HostComposerDisplayInfo& displayInfo = it->second;
+
+  DEFINE_AND_VALIDATE_HOST_CONNECTION
+  hostCon->lock();
+  bool hostCompositionV1 = rcEnc->hasHostCompositionV1();
+  bool hostCompositionV2 = rcEnc->hasHostCompositionV2();
+  hostCon->unlock();
+
+  // Ff we supports v2, then discard v1
+  if (hostCompositionV2) {
+    hostCompositionV1 = false;
+  }
+
+  const std::vector<Layer*> layers = display->getOrderedLayers();
+  if (hostCompositionV2 || hostCompositionV1) {
+    uint32_t numLayer = 0;
+    for (auto layer : layers) {
+      if (layer->getCompositionType() == HWC2::Composition::Device ||
+          layer->getCompositionType() == HWC2::Composition::SolidColor) {
+        numLayer++;
+      }
+    }
+
+    DEBUG_LOG("%s: presenting display:%" PRIu64 " with %d layers", __FUNCTION__,
+              display->getId(), static_cast<int>(layers.size()));
+
+    display->clearReleaseFencesAndIdsLocked();
+
+    if (numLayer == 0) {
+      ALOGW(
+          "%s display has no layers to compose, flushing client target buffer.",
+          __FUNCTION__);
+
+      FencedBuffer& displayClientTarget = display->getClientTarget();
+      if (displayClientTarget.getBuffer() != nullptr) {
+        if (mIsMinigbm) {
+          int retireFence;
+          displayInfo.clientTargetDrmBuffer->flushToDisplay(display->getId(),
+                                                            &retireFence);
+          *outRetireFence = dup(retireFence);
+          close(retireFence);
+        } else {
+          post(hostCon, rcEnc, displayClientTarget.getBuffer());
+          *outRetireFence = displayClientTarget.getFence();
+        }
+      }
+      return HWC2::Error::None;
+    }
+
+    std::unique_ptr<ComposeMsg> composeMsg;
+    std::unique_ptr<ComposeMsg_v2> composeMsgV2;
+
+    if (hostCompositionV1) {
+      composeMsg.reset(new ComposeMsg(numLayer));
+    } else {
+      composeMsgV2.reset(new ComposeMsg_v2(numLayer));
+    }
+
+    // Handle the composition
+    ComposeDevice* p;
+    ComposeDevice_v2* p2;
+    ComposeLayer* l;
+
+    if (hostCompositionV1) {
+      p = composeMsg->get();
+      l = p->layer;
+    } else {
+      p2 = composeMsgV2->get();
+      l = p2->layer;
+    }
+
+    int releaseLayersCount = 0;
+    for (auto layer : layers) {
+      // TODO: use local var composisitonType to store getCompositionType()
+      if (layer->getCompositionType() != HWC2::Composition::Device &&
+          layer->getCompositionType() != HWC2::Composition::SolidColor) {
+        ALOGE("%s: Unsupported composition types %d layer %u", __FUNCTION__,
+              layer->getCompositionType(), (uint32_t)layer->getId());
+        continue;
+      }
+      // send layer composition command to host
+      if (layer->getCompositionType() == HWC2::Composition::Device) {
+        display->addReleaseLayerLocked(layer->getId());
+        releaseLayersCount++;
+
+        int fence = layer->getBuffer().getFence();
+        if (fence != -1) {
+          int err = sync_wait(fence, 3000);
+          if (err < 0 && errno == ETIME) {
+            ALOGE("%s waited on fence %d for 3000 ms", __FUNCTION__, fence);
+          }
+          close(fence);
+        } else {
+          ALOGV("%s: acquire fence not set for layer %u", __FUNCTION__,
+                (uint32_t)layer->getId());
+        }
+        const native_handle_t* cb = layer->getBuffer().getBuffer();
+        if (cb != nullptr) {
+          l->cbHandle = hostCon->grallocHelper()->getHostHandle(cb);
+        } else {
+          ALOGE("%s null buffer for layer %d", __FUNCTION__,
+                (uint32_t)layer->getId());
+        }
+      } else {
+        // solidcolor has no buffer
+        l->cbHandle = 0;
+      }
+      l->composeMode = (hwc2_composition_t)layer->getCompositionType();
+      l->displayFrame = layer->getDisplayFrame();
+      l->crop = layer->getSourceCrop();
+      l->blendMode = static_cast<int32_t>(layer->getBlendMode());
+      l->alpha = layer->getPlaneAlpha();
+      l->color = layer->getColor();
+      l->transform = layer->getTransform();
+      ALOGV(
+          "   cb %d blendmode %d alpha %f %d %d %d %d z %d"
+          " composeMode %d, transform %d",
+          l->cbHandle, l->blendMode, l->alpha, l->displayFrame.left,
+          l->displayFrame.top, l->displayFrame.right, l->displayFrame.bottom,
+          layer->getZ(), l->composeMode, l->transform);
+      l++;
+    }
+    if (hostCompositionV1) {
+      p->version = 1;
+      p->targetHandle = hostCon->grallocHelper()->getHostHandle(
+          displayInfo.compositionResultBuffer);
+      p->numLayers = numLayer;
+    } else {
+      p2->version = 2;
+      p2->displayId = displayInfo.hostDisplayId;
+      p2->targetHandle = hostCon->grallocHelper()->getHostHandle(
+          displayInfo.compositionResultBuffer);
+      p2->numLayers = numLayer;
+    }
+
+    hostCon->lock();
+    if (rcEnc->hasAsyncFrameCommands()) {
+      if (mIsMinigbm) {
+        if (hostCompositionV1) {
+          rcEnc->rcComposeAsyncWithoutPost(
+              rcEnc, sizeof(ComposeDevice) + numLayer * sizeof(ComposeLayer),
+              (void*)p);
+        } else {
+          rcEnc->rcComposeAsyncWithoutPost(
+              rcEnc, sizeof(ComposeDevice_v2) + numLayer * sizeof(ComposeLayer),
+              (void*)p2);
+        }
+      } else {
+        if (hostCompositionV1) {
+          rcEnc->rcComposeAsync(
+              rcEnc, sizeof(ComposeDevice) + numLayer * sizeof(ComposeLayer),
+              (void*)p);
+        } else {
+          rcEnc->rcComposeAsync(
+              rcEnc, sizeof(ComposeDevice_v2) + numLayer * sizeof(ComposeLayer),
+              (void*)p2);
+        }
+      }
+    } else {
+      if (mIsMinigbm) {
+        if (hostCompositionV1) {
+          rcEnc->rcComposeWithoutPost(
+              rcEnc, sizeof(ComposeDevice) + numLayer * sizeof(ComposeLayer),
+              (void*)p);
+        } else {
+          rcEnc->rcComposeWithoutPost(
+              rcEnc, sizeof(ComposeDevice_v2) + numLayer * sizeof(ComposeLayer),
+              (void*)p2);
+        }
+      } else {
+        if (hostCompositionV1) {
+          rcEnc->rcCompose(
+              rcEnc, sizeof(ComposeDevice) + numLayer * sizeof(ComposeLayer),
+              (void*)p);
+        } else {
+          rcEnc->rcCompose(
+              rcEnc, sizeof(ComposeDevice_v2) + numLayer * sizeof(ComposeLayer),
+              (void*)p2);
+        }
+      }
+    }
+
+    hostCon->unlock();
+
+    // Send a retire fence and use it as the release fence for all layers,
+    // since media expects it
+    EGLint attribs[] = {EGL_SYNC_NATIVE_FENCE_ANDROID,
+                        EGL_NO_NATIVE_FENCE_FD_ANDROID};
+
+    uint64_t sync_handle, thread_handle;
+    int retire_fd;
+
+    hostCon->lock();
+    rcEnc->rcCreateSyncKHR(rcEnc, EGL_SYNC_NATIVE_FENCE_ANDROID, attribs,
+                           2 * sizeof(EGLint), true /* destroy when signaled */,
+                           &sync_handle, &thread_handle);
+    hostCon->unlock();
+
+    if (mIsMinigbm) {
+      displayInfo.compositionResultDrmBuffer->flushToDisplay(display->getId(),
+                                                             &retire_fd);
+    } else {
+      goldfish_sync_queue_work(mSyncDeviceFd, sync_handle, thread_handle,
+                               &retire_fd);
+    }
+
+    for (size_t i = 0; i < releaseLayersCount; ++i) {
+      display->addReleaseFenceLocked(dup(retire_fd));
+    }
+
+    *outRetireFence = dup(retire_fd);
+    close(retire_fd);
+    hostCon->lock();
+    if (rcEnc->hasAsyncFrameCommands()) {
+      rcEnc->rcDestroySyncKHRAsync(rcEnc, sync_handle);
+    } else {
+      rcEnc->rcDestroySyncKHR(rcEnc, sync_handle);
+    }
+    hostCon->unlock();
+
+  } else {
+    // we set all layers Composition::Client, so do nothing.
+    if (mIsMinigbm) {
+      int retireFence;
+      displayInfo.clientTargetDrmBuffer->flushToDisplay(display->getId(),
+                                                        &retireFence);
+      *outRetireFence = dup(retireFence);
+      close(retireFence);
+    } else {
+      FencedBuffer& displayClientTarget = display->getClientTarget();
+      post(hostCon, rcEnc, displayClientTarget.getBuffer());
+      *outRetireFence = displayClientTarget.getFence();
+    }
+    ALOGV("%s fallback to post, returns outRetireFence %d", __FUNCTION__,
+          *outRetireFence);
+  }
+
+  return HWC2::Error::None;
+}
+
+void HostComposer::post(HostConnection* hostCon,
+                        ExtendedRCEncoderContext* rcEnc, buffer_handle_t h) {
+  assert(cb && "native_handle_t::from(h) failed");
+
+  hostCon->lock();
+  rcEnc->rcFBPost(rcEnc, hostCon->grallocHelper()->getHostHandle(h));
+  hostCon->flush();
+  hostCon->unlock();
+}
+
+}  // namespace android
diff --git a/system/hwc2/HostComposer.h b/system/hwc2/HostComposer.h
new file mode 100644
index 0000000..fe4a49f
--- /dev/null
+++ b/system/hwc2/HostComposer.h
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_HWC_HOSTCOMPOSER_H
+#define ANDROID_HWC_HOSTCOMPOSER_H
+
+#include "Common.h"
+#include "Composer.h"
+#include "DrmPresenter.h"
+#include "HostConnection.h"
+
+namespace android {
+
+class HostComposer : public Composer {
+ public:
+  HostComposer() = default;
+
+  HostComposer(const HostComposer&) = delete;
+  HostComposer& operator=(const HostComposer&) = delete;
+
+  HostComposer(HostComposer&&) = delete;
+  HostComposer& operator=(HostComposer&&) = delete;
+
+  HWC2::Error init(const HotplugCallback& cb) override;
+
+  HWC2::Error createDisplays(
+      Device* device,
+      const AddDisplayToDeviceFunction& addDisplayToDeviceFn) override;
+
+  HWC2::Error createDisplay(
+      Device* device, uint32_t displayId, uint32_t width, uint32_t height,
+      uint32_t dpiX, uint32_t dpiY, uint32_t refreshRateHz,
+      const AddDisplayToDeviceFunction& addDisplayToDeviceFn) override;
+
+  HWC2::Error onDisplayDestroy(Display* display) override;
+
+  HWC2::Error onDisplayClientTargetSet(Display* display) override;
+
+  // Determines if this composer can compose the given layers on the given
+  // display and requests changes for layers that can't not be composed.
+  HWC2::Error validateDisplay(
+      Display* display, std::unordered_map<hwc2_layer_t, HWC2::Composition>*
+                            outLayerCompositionChanges) override;
+
+  // Performs the actual composition of layers and presents the composed result
+  // to the display.
+  HWC2::Error presentDisplay(Display* display,
+                             int32_t* outPresentFence) override;
+
+ private:
+  HWC2::Error createPrimaryDisplay(
+      Device* device, const AddDisplayToDeviceFunction& addDisplayToDeviceFn);
+
+  HWC2::Error createSecondaryDisplays(
+      Device* device, const AddDisplayToDeviceFunction& addDisplayToDeviceFn);
+
+  HWC2::Error createHostComposerDisplayInfo(Display* display,
+                                            uint32_t hostDisplayId);
+
+  void post(HostConnection* hostCon, ExtendedRCEncoderContext* rcEnc,
+            buffer_handle_t h);
+
+  bool mIsMinigbm = false;
+
+  int mSyncDeviceFd = -1;
+
+  struct HostComposerDisplayInfo {
+    uint32_t hostDisplayId = 0;
+
+    // Additional per display buffer for the composition result.
+    const native_handle_t* compositionResultBuffer = nullptr;
+
+    // Drm info for the additional composition result buffer.
+    std::unique_ptr<DrmBuffer> compositionResultDrmBuffer;
+
+    // Drm info for the displays client target buffer.
+    std::unique_ptr<DrmBuffer> clientTargetDrmBuffer;
+  };
+
+  std::unordered_map<hwc2_display_t, HostComposerDisplayInfo> mDisplayInfos;
+
+  DrmPresenter mDrmPresenter;
+};
+
+}  // namespace android
+
+#endif
diff --git a/system/hwc2/Layer.cpp b/system/hwc2/Layer.cpp
new file mode 100644
index 0000000..6cdfd33
--- /dev/null
+++ b/system/hwc2/Layer.cpp
@@ -0,0 +1,257 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Layer.h"
+
+#include <sync/sync.h>
+
+#include <atomic>
+
+namespace android {
+namespace {
+
+std::atomic<hwc2_layer_t> sNextId{1};
+
+}  // namespace
+
+Layer::Layer() : mId(sNextId++) {}
+
+HWC2::Error Layer::setBuffer(buffer_handle_t buffer, int32_t fence) {
+  DEBUG_LOG("%s: layer:%" PRIu64 " buffer:%p fence:%" PRIu32, __FUNCTION__, mId,
+            buffer, fence);
+  mBuffer.setBuffer(buffer);
+  mBuffer.setFence(fence);
+  return HWC2::Error::None;
+}
+
+buffer_handle_t Layer::waitAndGetBuffer() {
+  DEBUG_LOG("%s layer:%" PRIu64, __FUNCTION__, mId);
+
+  int fence = mBuffer.getFence();
+  if (fence != -1) {
+    int err = sync_wait(fence, 3000);
+    if (err < 0 && errno == ETIME) {
+      ALOGE("%s waited on fence %" PRId32 " for 3000 ms", __FUNCTION__, fence);
+    }
+    close(fence);
+  }
+
+  return mBuffer.getBuffer();
+}
+
+HWC2::Error Layer::setCursorPosition(int32_t /*x*/, int32_t /*y*/) {
+  DEBUG_LOG("%s layer:%" PRIu64, __FUNCTION__, mId);
+
+  if (mCompositionType != HWC2::Composition::Cursor) {
+    ALOGE("%s: CompositionType not Cursor type", __FUNCTION__);
+    return HWC2::Error::BadLayer;
+  }
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error Layer::setSurfaceDamage(hwc_region_t /*damage*/) {
+  DEBUG_LOG("%s layer:%" PRIu64, __FUNCTION__, mId);
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error Layer::setBlendMode(int32_t m) {
+  const auto blendMode = static_cast<HWC2::BlendMode>(m);
+  const auto blendModeString = to_string(blendMode);
+  DEBUG_LOG("%s layer:%" PRIu64 " blend mode:%s", __FUNCTION__, mId,
+            blendModeString.c_str());
+
+  mBlendMode = blendMode;
+  return HWC2::Error::None;
+}
+
+HWC2::BlendMode Layer::getBlendMode() const {
+  const auto blendMode = mBlendMode;
+  const auto blendModeString = to_string(blendMode);
+  DEBUG_LOG("%s layer:%" PRIu64 " blend mode:%s", __FUNCTION__, mId,
+            blendModeString.c_str());
+
+  return blendMode;
+}
+
+HWC2::Error Layer::setColor(hwc_color_t color) {
+  DEBUG_LOG("%s layer:%" PRIu64 " color-r:%d color-g:%d color-b:%d color-a:%d)",
+            __FUNCTION__, mId, color.r, color.g, color.b, color.a);
+
+  mColor = color;
+  return HWC2::Error::None;
+}
+
+hwc_color_t Layer::getColor() const {
+  auto color = mColor;
+  DEBUG_LOG("%s layer:%" PRIu64 " color-r:%d color-g:%d color-b:%d color-a:%d)",
+            __FUNCTION__, mId, color.r, color.g, color.b, color.a);
+
+  return color;
+}
+
+HWC2::Error Layer::setCompositionTypeEnum(HWC2::Composition compositionType) {
+  const auto compositionTypeString = to_string(compositionType);
+  DEBUG_LOG("%s layer:%" PRIu64 " composition type:%s", __FUNCTION__, mId,
+            compositionTypeString.c_str());
+
+  mCompositionType = compositionType;
+  return HWC2::Error::None;
+}
+
+HWC2::Error Layer::setCompositionType(int32_t type) {
+  const auto compositionType = static_cast<HWC2::Composition>(type);
+  return setCompositionTypeEnum(compositionType);
+}
+
+HWC2::Composition Layer::getCompositionType() const {
+  const auto compositionType = mCompositionType;
+  const auto compositionTypeString = to_string(compositionType);
+  DEBUG_LOG("%s layer:%" PRIu64 " composition type:%s", __FUNCTION__, mId,
+            compositionTypeString.c_str());
+
+  return compositionType;
+}
+
+HWC2::Error Layer::setDataspace(int32_t) {
+  DEBUG_LOG("%s layer:%" PRIu64, __FUNCTION__, mId);
+
+  return HWC2::Error::None;
+}
+
+HWC2::Error Layer::setDisplayFrame(hwc_rect_t frame) {
+  DEBUG_LOG("%s layer:%" PRIu64
+            " display frame rect-left:%d rect-top:%d rect-right:%d rect-bot:%d",
+            __FUNCTION__, mId, frame.left, frame.top, frame.right,
+            frame.bottom);
+
+  mDisplayFrame = frame;
+  return HWC2::Error::None;
+}
+
+hwc_rect_t Layer::getDisplayFrame() const {
+  auto frame = mDisplayFrame;
+  DEBUG_LOG("%s layer:%" PRIu64
+            " display frame rect-left:%d rect-top:%d rect-right:%d rect-bot:%d",
+            __FUNCTION__, mId, frame.left, frame.top, frame.right,
+            frame.bottom);
+
+  return frame;
+}
+
+HWC2::Error Layer::setPlaneAlpha(float alpha) {
+  DEBUG_LOG("%s layer:%" PRIu64 "alpha:%f", __FUNCTION__, mId, alpha);
+
+  mPlaneAlpha = alpha;
+  return HWC2::Error::None;
+}
+
+float Layer::getPlaneAlpha() const {
+  auto alpha = mPlaneAlpha;
+  DEBUG_LOG("%s layer:%" PRIu64 "alpha:%f", __FUNCTION__, mId, alpha);
+
+  return alpha;
+}
+
+HWC2::Error Layer::setSidebandStream(const native_handle_t* stream) {
+  DEBUG_LOG("%s layer:%" PRIu64, __FUNCTION__, mId);
+
+  mSidebandStream = stream;
+  return HWC2::Error::None;
+}
+
+HWC2::Error Layer::setSourceCrop(hwc_frect_t crop) {
+  DEBUG_LOG("%s layer:%" PRIu64
+            "crop rect-left:%f rect-top:%f rect-right:%f rect-bot:%f",
+            __FUNCTION__, mId, crop.left, crop.top, crop.right, crop.bottom);
+
+  mSourceCrop = crop;
+  return HWC2::Error::None;
+}
+
+hwc_frect_t Layer::getSourceCrop() const {
+  hwc_frect_t crop = mSourceCrop;
+  DEBUG_LOG("%s layer:%" PRIu64
+            "crop rect-left:%f rect-top:%f rect-right:%f rect-bot:%f",
+            __FUNCTION__, mId, crop.left, crop.top, crop.right, crop.bottom);
+
+  return crop;
+}
+
+hwc_rect_t Layer::getSourceCropInt() const {
+  hwc_rect_t crop = {};
+  crop.left = static_cast<int>(mSourceCrop.left);
+  crop.top = static_cast<int>(mSourceCrop.top);
+  crop.right = static_cast<int>(mSourceCrop.right);
+  crop.bottom = static_cast<int>(mSourceCrop.bottom);
+  DEBUG_LOG("%s layer:%" PRIu64
+            "crop rect-left:%d rect-top:%d rect-right:%d rect-bot:%d",
+            __FUNCTION__, mId, crop.left, crop.top, crop.right, crop.bottom);
+
+  return crop;
+}
+
+HWC2::Error Layer::setTransform(int32_t transform) {
+  const auto transformType = static_cast<HWC2::Transform>(transform);
+  const auto transformTypeString = to_string(transformType);
+  DEBUG_LOG("%s layer:%" PRIu64 " transform:%s", __FUNCTION__, mId,
+            transformTypeString.c_str());
+
+  mTransform = transformType;
+  return HWC2::Error::None;
+}
+
+hwc_transform_t Layer::getTransform() const {
+  const auto transform = mTransform;
+  const auto transformString = to_string(transform);
+  DEBUG_LOG("%s layer:%" PRIu64 " transform:%s", __FUNCTION__, mId,
+            transformString.c_str());
+
+  return static_cast<hwc_transform_t>(transform);
+}
+
+HWC2::Error Layer::setVisibleRegion(hwc_region_t visible) {
+  DEBUG_LOG("%s layer:%" PRIu64, __FUNCTION__, mId);
+
+  mVisibleRegion.resize(visible.numRects);
+  std::copy_n(visible.rects, visible.numRects, mVisibleRegion.data());
+  return HWC2::Error::None;
+}
+
+std::size_t Layer::getNumVisibleRegions() const {
+  std::size_t num = mVisibleRegion.size();
+  DEBUG_LOG("%s layer:%" PRIu64 " number of visible regions: %zu", __FUNCTION__,
+            mId, num);
+
+  return num;
+}
+
+HWC2::Error Layer::setZ(uint32_t z) {
+  DEBUG_LOG("%s layer:%" PRIu64 " z:%d", __FUNCTION__, mId, z);
+
+  mZ = z;
+  return HWC2::Error::None;
+}
+
+uint32_t Layer::getZ() const {
+  uint32_t z = mZ;
+  DEBUG_LOG("%s layer:%" PRIu64 " z:%d", __FUNCTION__, mId, z);
+
+  return z;
+}
+
+}  // namespace android
\ No newline at end of file
diff --git a/system/hwc2/Layer.h b/system/hwc2/Layer.h
new file mode 100644
index 0000000..f576201
--- /dev/null
+++ b/system/hwc2/Layer.h
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_HWC_LAYER_H
+#define ANDROID_HWC_LAYER_H
+
+#include <vector>
+
+#include "Common.h"
+#include "FencedBuffer.h"
+
+namespace android {
+
+class Layer {
+ public:
+  explicit Layer();
+
+  Layer(const Layer&) = delete;
+  Layer& operator=(const Layer&) = delete;
+
+  Layer(Layer&&) = default;
+  Layer& operator=(Layer&&) = default;
+
+  HWC2::Error setBuffer(buffer_handle_t buffer, int32_t acquireFence);
+  FencedBuffer& getBuffer() { return mBuffer; }
+
+  buffer_handle_t waitAndGetBuffer();
+
+  hwc2_layer_t getId() const { return mId; }
+
+  HWC2::Error setCursorPosition(int32_t x, int32_t y);
+
+  HWC2::Error setSurfaceDamage(hwc_region_t damage);
+
+  HWC2::Error setBlendMode(int32_t mode);
+  HWC2::BlendMode getBlendMode() const;
+
+  HWC2::Error setColor(hwc_color_t color);
+  hwc_color_t getColor() const;
+
+  HWC2::Error setCompositionTypeEnum(HWC2::Composition type);
+  HWC2::Error setCompositionType(int32_t type);
+  HWC2::Composition getCompositionType() const;
+
+  HWC2::Error setDataspace(int32_t dataspace);
+
+  HWC2::Error setDisplayFrame(hwc_rect_t frame);
+  hwc_rect_t getDisplayFrame() const;
+
+  HWC2::Error setPlaneAlpha(float alpha);
+  float getPlaneAlpha() const;
+
+  HWC2::Error setSidebandStream(const native_handle_t* stream);
+
+  HWC2::Error setSourceCrop(hwc_frect_t crop);
+  hwc_frect_t getSourceCrop() const;
+  hwc_rect_t getSourceCropInt() const;
+
+  HWC2::Error setTransform(int32_t transform);
+  hwc_transform_t getTransform() const;
+
+  HWC2::Error setVisibleRegion(hwc_region_t visible);
+  std::size_t getNumVisibleRegions() const;
+
+  HWC2::Error setZ(uint32_t z);
+  uint32_t getZ() const;
+
+ private:
+  const hwc2_layer_t mId;
+  FencedBuffer mBuffer;
+  std::vector<hwc_rect_t> mSurfaceDamage;
+  HWC2::BlendMode mBlendMode = HWC2::BlendMode::None;
+  hwc_color_t mColor = {0, 0, 0, 0};
+  HWC2::Composition mCompositionType = HWC2::Composition::Invalid;
+  hwc_rect_t mDisplayFrame = {0, 0, -1, -1};
+  float mPlaneAlpha = 0.0f;
+  const native_handle_t* mSidebandStream = nullptr;
+  hwc_frect_t mSourceCrop = {0.0f, 0.0f, -1.0f, -1.0f};
+  HWC2::Transform mTransform = HWC2::Transform::None;
+  std::vector<hwc_rect_t> mVisibleRegion;
+  uint32_t mZ = 0;
+};
+
+}  // namespace android
+
+#endif
\ No newline at end of file
diff --git a/system/hwc2/drmTest.cpp b/system/hwc2/drmTest.cpp
index 90d4341..86267da 100644
--- a/system/hwc2/drmTest.cpp
+++ b/system/hwc2/drmTest.cpp
@@ -7,114 +7,110 @@
 #include <string.h>
 #include <sys/mman.h>
 #include <time.h>
+#include <ui/GraphicBuffer.h>
+#include <ui/GraphicBufferAllocator.h>
 #include <unistd.h>
 #include <xf86drm.h>
 #include <xf86drmMode.h>
-#include <ui/GraphicBuffer.h>
-#include <ui/GraphicBufferAllocator.h>
+
 #include "HostConnection.h"
 #include "cros_gralloc_handle.h"
 
 using namespace android;
 
 struct buffer_object {
-    uint32_t width;
-    uint32_t height;
-    uint32_t pitch;
-    uint32_t handle;
-    uint32_t size;
-    uint8_t *vaddr;
-    uint32_t fb_id;
-    const native_handle_t* fb;
+  uint32_t width;
+  uint32_t height;
+  uint32_t pitch;
+  uint32_t handle;
+  uint32_t size;
+  uint8_t *vaddr;
+  uint32_t fb_id;
+  const native_handle_t *fb;
 };
 
 struct buffer_object buf;
 
-static int modeset_create_fb(int fd, struct buffer_object *bo)
-{
-    struct drm_mode_create_dumb create = {};
-    struct drm_mode_map_dumb map = {};
+static int modeset_create_fb(int fd, struct buffer_object *bo) {
+  struct drm_mode_create_dumb create = {};
+  struct drm_mode_map_dumb map = {};
 
-    create.width = bo->width;
-    create.height = bo->height;
-    create.bpp = 32;
-    drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &create);
-    printf("create dumb w %d h %d\n", bo->width, bo->height);
-    getchar();
+  create.width = bo->width;
+  create.height = bo->height;
+  create.bpp = 32;
+  drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &create);
+  printf("create dumb w %d h %d\n", bo->width, bo->height);
+  getchar();
 
-    bo->pitch = create.pitch;
-    bo->size = create.size;
-    bo->handle = create.handle;
-    drmModeAddFB(fd, bo->width, bo->height, 24, 32, bo->pitch,
-    bo->handle, &bo->fb_id);
-    printf("drmModeAddFB\n");
-    getchar();
+  bo->pitch = create.pitch;
+  bo->size = create.size;
+  bo->handle = create.handle;
+  drmModeAddFB(fd, bo->width, bo->height, 24, 32, bo->pitch, bo->handle,
+               &bo->fb_id);
+  printf("drmModeAddFB\n");
+  getchar();
 
-    map.handle = create.handle;
-    drmIoctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &map);
-    printf("map dumb\n");
-    getchar();
-    bo->vaddr = static_cast<unsigned char*>(mmap64(0, create.size, PROT_READ | PROT_WRITE,
-                                                   MAP_SHARED, fd, map.offset));
-    memset(bo->vaddr, 0xff, bo->size);
-    return 0;
+  map.handle = create.handle;
+  drmIoctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &map);
+  printf("map dumb\n");
+  getchar();
+  bo->vaddr = static_cast<unsigned char *>(mmap64(
+      0, create.size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, map.offset));
+  memset(bo->vaddr, 0xff, bo->size);
+  return 0;
 }
 
-static void modeset_destroy_fb(int fd, struct buffer_object *bo)
-{
-    struct drm_mode_destroy_dumb destroy = {};
+static void modeset_destroy_fb(int fd, struct buffer_object *bo) {
+  struct drm_mode_destroy_dumb destroy = {};
 
-    drmModeRmFB(fd, bo->fb_id);
-    munmap(bo->vaddr, bo->size);
-    destroy.handle = bo->handle;
-    drmIoctl(fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy);
+  drmModeRmFB(fd, bo->fb_id);
+  munmap(bo->vaddr, bo->size);
+  destroy.handle = bo->handle;
+  drmIoctl(fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy);
 }
 
 static uint32_t get_property_id(int fd, drmModeObjectProperties *props,
-                                const char *name)
-{
-    drmModePropertyPtr property;
-    uint32_t i, id = 0;
+                                const char *name) {
+  drmModePropertyPtr property;
+  uint32_t i, id = 0;
 
-    /* find property according to the name */
-    for (i = 0; i < props->count_props; i++) {
-        property = drmModeGetProperty(fd, props->props[i]);
-        if (!strcmp(property->name, name))
-        id = property->prop_id;
-        drmModeFreeProperty(property);
-        if (id) {
-            break;
-        }
+  /* find property according to the name */
+  for (i = 0; i < props->count_props; i++) {
+    property = drmModeGetProperty(fd, props->props[i]);
+    if (!strcmp(property->name, name)) id = property->prop_id;
+    drmModeFreeProperty(property);
+    if (id) {
+      break;
     }
-    return id;
+  }
+  return id;
 }
 
 static std::unique_ptr<HostConnection> sHostCon;
 
-static HostConnection* createOrGetHostConnection() {
-    if (!sHostCon) {
-        sHostCon = HostConnection::createUnique();
-    }
-    return sHostCon.get();
+static HostConnection *createOrGetHostConnection() {
+  if (!sHostCon) {
+    sHostCon = HostConnection::createUnique();
+  }
+  return sHostCon.get();
 }
 
-#define DEFINE_AND_VALIDATE_HOST_CONNECTION \
-    HostConnection *hostCon = createOrGetHostConnection(); \
-    if (!hostCon) { \
-        ALOGE("drmTest: Failed to get host connection\n"); \
-        return; \
-    } \
-    ExtendedRCEncoderContext *rcEnc = hostCon->rcEncoder(); \
-    if (!rcEnc) { \
-        ALOGE("drmTest: Failed to get renderControl encoder context\n"); \
-        return; \
-    }
+#define DEFINE_AND_VALIDATE_HOST_CONNECTION                          \
+  HostConnection *hostCon = createOrGetHostConnection();             \
+  if (!hostCon) {                                                    \
+    ALOGE("drmTest: Failed to get host connection\n");               \
+    return;                                                          \
+  }                                                                  \
+  ExtendedRCEncoderContext *rcEnc = hostCon->rcEncoder();            \
+  if (!rcEnc) {                                                      \
+    ALOGE("drmTest: Failed to get renderControl encoder context\n"); \
+    return;                                                          \
+  }
 
 #include "include/drmhwcgralloc.h"
 void convertBoInfo(buffer_handle_t handle, hwc_drm_bo_t *bo) {
   cros_gralloc_handle *gr_handle = (cros_gralloc_handle *)handle;
-  if (!gr_handle)
-    return;
+  if (!gr_handle) return;
 
   bo->width = gr_handle->width;
   bo->height = gr_handle->height;
@@ -126,176 +122,169 @@
   bo->offsets[0] = gr_handle->offsets[0];
 }
 
-
 void grallocAllocBuffer(int fd, struct buffer_object *bo) {
-    buffer_handle_t h;
-    uint32_t stride;
+  buffer_handle_t h;
+  uint32_t stride;
 
-    if (GraphicBufferAllocator::get().allocate(
-        bo->width, bo->height,
-        android::PIXEL_FORMAT_RGBA_8888,
-        1,
-        (GraphicBuffer::USAGE_HW_COMPOSER | GraphicBuffer::USAGE_HW_RENDER),
-        &h, &stride,
-        0, "emulatorDrmTest") == android::OK) {
-        hwc_drm_bo tmp_bo{};
-        convertBoInfo(h, &tmp_bo);
+  if (GraphicBufferAllocator::get().allocate(
+          bo->width, bo->height, android::PIXEL_FORMAT_RGBA_8888, 1,
+          (GraphicBuffer::USAGE_HW_COMPOSER | GraphicBuffer::USAGE_HW_RENDER),
+          &h, &stride, 0, "emulatorDrmTest") == android::OK) {
+    hwc_drm_bo tmp_bo{};
+    convertBoInfo(h, &tmp_bo);
 
-        int ret = drmPrimeFDToHandle(fd, tmp_bo.prime_fds[0], tmp_bo.gem_handles);
-        for (int i = 1; i < HWC_DRM_BO_MAX_PLANES; i++) {
-            tmp_bo.gem_handles[i] = tmp_bo.gem_handles[0];
-        }
-        if (ret) {
-            printf("%s: DRM_IOCTL_PRIME_FD_TO_HANDLE failed: %s (errno %d)\n",
-                  __func__, strerror(errno), errno);
-            return;
-        }
-        ret = drmModeAddFB2(fd, tmp_bo.width, tmp_bo.height, tmp_bo.format,
-                            tmp_bo.gem_handles, tmp_bo.pitches, tmp_bo.offsets, &bo->fb_id,
-                        0);
-
-        printf("allocate buffer\n");
-        DEFINE_AND_VALIDATE_HOST_CONNECTION
-        bo->fb = static_cast<const native_handle_t*>(h);
-        getchar();
-        printf("resource id is %d\n", hostCon->grallocHelper()->getHostHandle(bo->fb));
-    } else {
-        bo->fb = nullptr;
+    int ret = drmPrimeFDToHandle(fd, tmp_bo.prime_fds[0], tmp_bo.gem_handles);
+    for (int i = 1; i < HWC_DRM_BO_MAX_PLANES; i++) {
+      tmp_bo.gem_handles[i] = tmp_bo.gem_handles[0];
     }
+    if (ret) {
+      printf("%s: DRM_IOCTL_PRIME_FD_TO_HANDLE failed: %s (errno %d)\n",
+             __func__, strerror(errno), errno);
+      return;
+    }
+    ret = drmModeAddFB2(fd, tmp_bo.width, tmp_bo.height, tmp_bo.format,
+                        tmp_bo.gem_handles, tmp_bo.pitches, tmp_bo.offsets,
+                        &bo->fb_id, 0);
+
+    printf("allocate buffer\n");
+    DEFINE_AND_VALIDATE_HOST_CONNECTION
+    bo->fb = static_cast<const native_handle_t *>(h);
+    getchar();
+    printf("resource id is %d\n",
+           hostCon->grallocHelper()->getHostHandle(bo->fb));
+  } else {
+    bo->fb = nullptr;
+  }
 }
 
-int main(int argc, char **argv)
-{
-    int fd;
-    drmModeConnector *conn;
-    drmModeRes *res;
-    drmModePlaneRes *plane_res = nullptr;
-    uint32_t conn_id;
-    uint32_t crtc_id;
-    uint32_t plane_id;
+int main(int argc, char **argv) {
+  int fd;
+  drmModeConnector *conn;
+  drmModeRes *res;
+  drmModePlaneRes *plane_res = nullptr;
+  uint32_t conn_id;
+  uint32_t crtc_id;
+  uint32_t plane_id;
 
-    fd = open("/dev/dri/card0", O_RDWR | O_CLOEXEC);
+  fd = open("/dev/dri/card0", O_RDWR | O_CLOEXEC);
 
-    int ret = drmSetClientCap(fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 0);
-    if (ret) {
-        printf("fail to set universal plane %d\n", ret);
-    }
+  int ret = drmSetClientCap(fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 0);
+  if (ret) {
+    printf("fail to set universal plane %d\n", ret);
+  }
 
-    res = drmModeGetResources(fd);
-    crtc_id = res->crtcs[0];
-    conn_id = res->connectors[0];
+  res = drmModeGetResources(fd);
+  crtc_id = res->crtcs[0];
+  conn_id = res->connectors[0];
 
-    plane_res = drmModeGetPlaneResources(fd);
-    plane_id = plane_res->planes[0];
+  plane_res = drmModeGetPlaneResources(fd);
+  plane_id = plane_res->planes[0];
 
-    conn = drmModeGetConnector(fd, conn_id);
-    buf.width = conn->modes[0].hdisplay;
-    buf.height = conn->modes[0].vdisplay;
-     //modeset_create_fb(fd, &buf);
-    grallocAllocBuffer(fd, &buf);
+  conn = drmModeGetConnector(fd, conn_id);
+  buf.width = conn->modes[0].hdisplay;
+  buf.height = conn->modes[0].vdisplay;
+  // modeset_create_fb(fd, &buf);
+  grallocAllocBuffer(fd, &buf);
 
-    drmModeSetCrtc(fd, crtc_id, buf.fb_id,
-                   0, 0, &conn_id, 1, &conn->modes[0]);
-    printf("drmModeSetCrtc\n");
-    getchar();
+  drmModeSetCrtc(fd, crtc_id, buf.fb_id, 0, 0, &conn_id, 1, &conn->modes[0]);
+  printf("drmModeSetCrtc\n");
+  getchar();
 
-    drmModePageFlip(fd, crtc_id, buf.fb_id, DRM_MODE_PAGE_FLIP_EVENT, &crtc_id);
-    printf("drmModePageFlip\n");
-    getchar();
+  drmModePageFlip(fd, crtc_id, buf.fb_id, DRM_MODE_PAGE_FLIP_EVENT, &crtc_id);
+  printf("drmModePageFlip\n");
+  getchar();
 
-//    drmModeSetPlane(fd, plane_id, crtc_id, buf.fb_id, 0, 50, 50, 320, 320,
-//                    100 << 16, 150 << 16, 320 << 16, 320 << 16);
-//    printf("drmModeSetPlane\n");
-//    modeset_destroy_fb(fd, &buf);
+  //    drmModeSetPlane(fd, plane_id, crtc_id, buf.fb_id, 0, 50, 50, 320, 320,
+  //                    100 << 16, 150 << 16, 320 << 16, 320 << 16);
+  //    printf("drmModeSetPlane\n");
+  //    modeset_destroy_fb(fd, &buf);
 
-    drmModeFreeConnector(conn);
-    drmModeFreeResources(res);
-    close(fd);
+  drmModeFreeConnector(conn);
+  drmModeFreeResources(res);
+  close(fd);
 
-    return 0;
+  return 0;
 }
 
-int main_atom(int argc, char **argv)
-{
-    int fd;
-    drmModeConnector *conn = nullptr;
-    drmModeRes *res = nullptr;
-    drmModePlaneRes *plane_res = nullptr;
-    drmModeObjectProperties *props = nullptr;
-    drmModeAtomicReq *req;
-    uint32_t conn_id;
-    uint32_t crtc_id;
-    uint32_t plane_id;
-    uint32_t blob_id;
-    uint32_t property_crtc_id;
-    uint32_t property_mode_id;
-    uint32_t property_active;
+int main_atom(int argc, char **argv) {
+  int fd;
+  drmModeConnector *conn = nullptr;
+  drmModeRes *res = nullptr;
+  drmModePlaneRes *plane_res = nullptr;
+  drmModeObjectProperties *props = nullptr;
+  drmModeAtomicReq *req;
+  uint32_t conn_id;
+  uint32_t crtc_id;
+  uint32_t plane_id;
+  uint32_t blob_id;
+  uint32_t property_crtc_id;
+  uint32_t property_mode_id;
+  uint32_t property_active;
 
-    printf("drm available %d\n", drmAvailable());
-    fd = open("/dev/dri/card0", O_RDWR);
-    printf("openg drm fd %d\n", fd);
+  printf("drm available %d\n", drmAvailable());
+  fd = open("/dev/dri/card0", O_RDWR);
+  printf("openg drm fd %d\n", fd);
 
-    int ret = drmSetClientCap(fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
-    if (ret) {
-        printf("fail to set universal plane %d\n", ret);
-    }
+  int ret = drmSetClientCap(fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
+  if (ret) {
+    printf("fail to set universal plane %d\n", ret);
+  }
 
-    ret = drmSetClientCap(fd, DRM_CLIENT_CAP_ATOMIC, 1);
-    if (ret) {
-        printf("fail to set atomic operation %d\n", ret);
-    }
+  ret = drmSetClientCap(fd, DRM_CLIENT_CAP_ATOMIC, 1);
+  if (ret) {
+    printf("fail to set atomic operation %d\n", ret);
+  }
 
-    res = drmModeGetResources(fd);
-    if (!res) {
-        printf("error to get drmModeGetResources: %d\n", errno);
-    }
+  res = drmModeGetResources(fd);
+  if (!res) {
+    printf("error to get drmModeGetResources: %d\n", errno);
+  }
 
-    crtc_id = res->crtcs[0];
-    conn_id = res->connectors[0];
-            plane_res = drmModeGetPlaneResources(fd);
-    plane_id = plane_res->planes[0];
+  crtc_id = res->crtcs[0];
+  conn_id = res->connectors[0];
+  plane_res = drmModeGetPlaneResources(fd);
+  plane_id = plane_res->planes[0];
 
-    conn = drmModeGetConnector(fd, conn_id);
-    buf.width = conn->modes[0].hdisplay;
-    buf.height = conn->modes[0].vdisplay;
-    modeset_create_fb(fd, &buf);
+  conn = drmModeGetConnector(fd, conn_id);
+  buf.width = conn->modes[0].hdisplay;
+  buf.height = conn->modes[0].vdisplay;
+  modeset_create_fb(fd, &buf);
 
-    /* get connector properties */
-    props = drmModeObjectGetProperties(fd, conn_id, DRM_MODE_OBJECT_CONNECTOR);
-    property_crtc_id = get_property_id(fd, props, "CRTC_ID");
-    drmModeFreeObjectProperties(props);
+  /* get connector properties */
+  props = drmModeObjectGetProperties(fd, conn_id, DRM_MODE_OBJECT_CONNECTOR);
+  property_crtc_id = get_property_id(fd, props, "CRTC_ID");
+  drmModeFreeObjectProperties(props);
 
-    /* get crtc properties */
-    props = drmModeObjectGetProperties(fd, crtc_id, DRM_MODE_OBJECT_CRTC);
-    property_active = get_property_id(fd, props, "ACTIVE");
-    property_mode_id = get_property_id(fd, props, "MODE_ID");
-    drmModeFreeObjectProperties(props);
+  /* get crtc properties */
+  props = drmModeObjectGetProperties(fd, crtc_id, DRM_MODE_OBJECT_CRTC);
+  property_active = get_property_id(fd, props, "ACTIVE");
+  property_mode_id = get_property_id(fd, props, "MODE_ID");
+  drmModeFreeObjectProperties(props);
 
-    /* create blob to store current mode, and return the blob id */
-    drmModeCreatePropertyBlob(fd, &conn->modes[0],
-    sizeof(conn->modes[0]), &blob_id);
+  /* create blob to store current mode, and return the blob id */
+  drmModeCreatePropertyBlob(fd, &conn->modes[0], sizeof(conn->modes[0]),
+                            &blob_id);
 
-    /* start modeseting */
-    req = drmModeAtomicAlloc();
-    drmModeAtomicAddProperty(req, crtc_id, property_active, 1);
-    drmModeAtomicAddProperty(req, crtc_id, property_mode_id, blob_id);
-    drmModeAtomicAddProperty(req, conn_id, property_crtc_id, crtc_id);
-    drmModeAtomicCommit(fd, req, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
-    drmModeAtomicFree(req);
-    printf("drmModeAtomicCommit SetCrtc\n");
-    getchar();
+  /* start modeseting */
+  req = drmModeAtomicAlloc();
+  drmModeAtomicAddProperty(req, crtc_id, property_active, 1);
+  drmModeAtomicAddProperty(req, crtc_id, property_mode_id, blob_id);
+  drmModeAtomicAddProperty(req, conn_id, property_crtc_id, crtc_id);
+  drmModeAtomicCommit(fd, req, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
+  drmModeAtomicFree(req);
+  printf("drmModeAtomicCommit SetCrtc\n");
+  getchar();
 
-    drmModeSetPlane(fd, plane_id, crtc_id, buf.fb_id, 0,
-                    50, 50, 320, 320,
-                    0, 0, 320 << 16, 320 << 16);
-    printf("drmModeSetPlane\n");
-    getchar();
+  drmModeSetPlane(fd, plane_id, crtc_id, buf.fb_id, 0, 50, 50, 320, 320, 0, 0,
+                  320 << 16, 320 << 16);
+  printf("drmModeSetPlane\n");
+  getchar();
 
-    modeset_destroy_fb(fd, &buf);
-    drmModeFreeConnector(conn);
-    drmModeFreePlaneResources(plane_res);
-    drmModeFreeResources(res);
-    close(fd);
+  modeset_destroy_fb(fd, &buf);
+  drmModeFreeConnector(conn);
+  drmModeFreePlaneResources(plane_res);
+  drmModeFreeResources(res);
+  close(fd);
 
-    return 0;
+  return 0;
 }
diff --git a/system/renderControl_enc/renderControl_client_context.cpp b/system/renderControl_enc/renderControl_client_context.cpp
index d9d5b61..2b3f0ae 100644
--- a/system/renderControl_enc/renderControl_client_context.cpp
+++ b/system/renderControl_enc/renderControl_client_context.cpp
@@ -72,6 +72,8 @@
 	rcDestroySyncKHRAsync = (rcDestroySyncKHRAsync_client_proc_t) getProc("rcDestroySyncKHRAsync", userData);
 	rcComposeWithoutPost = (rcComposeWithoutPost_client_proc_t) getProc("rcComposeWithoutPost", userData);
 	rcComposeAsyncWithoutPost = (rcComposeAsyncWithoutPost_client_proc_t) getProc("rcComposeAsyncWithoutPost", userData);
+	rcCreateDisplayById = (rcCreateDisplayById_client_proc_t) getProc("rcCreateDisplayById", userData);
+	rcSetDisplayPoseDpi = (rcSetDisplayPoseDpi_client_proc_t) getProc("rcSetDisplayPoseDpi", userData);
 	return 0;
 }
 
diff --git a/system/renderControl_enc/renderControl_client_context.h b/system/renderControl_enc/renderControl_client_context.h
index 501de7f..cf2f8f0 100644
--- a/system/renderControl_enc/renderControl_client_context.h
+++ b/system/renderControl_enc/renderControl_client_context.h
@@ -72,6 +72,8 @@
 	rcDestroySyncKHRAsync_client_proc_t rcDestroySyncKHRAsync;
 	rcComposeWithoutPost_client_proc_t rcComposeWithoutPost;
 	rcComposeAsyncWithoutPost_client_proc_t rcComposeAsyncWithoutPost;
+	rcCreateDisplayById_client_proc_t rcCreateDisplayById;
+	rcSetDisplayPoseDpi_client_proc_t rcSetDisplayPoseDpi;
 	virtual ~renderControl_client_context_t() {}
 
 	typedef renderControl_client_context_t *CONTEXT_ACCESSOR_TYPE(void);
diff --git a/system/renderControl_enc/renderControl_client_proc.h b/system/renderControl_enc/renderControl_client_proc.h
index e31e843..2bd5d1f 100644
--- a/system/renderControl_enc/renderControl_client_proc.h
+++ b/system/renderControl_enc/renderControl_client_proc.h
@@ -74,6 +74,8 @@
 typedef void (renderControl_APIENTRY *rcDestroySyncKHRAsync_client_proc_t) (void * ctx, uint64_t);
 typedef GLint (renderControl_APIENTRY *rcComposeWithoutPost_client_proc_t) (void * ctx, uint32_t, void*);
 typedef void (renderControl_APIENTRY *rcComposeAsyncWithoutPost_client_proc_t) (void * ctx, uint32_t, void*);
+typedef int (renderControl_APIENTRY *rcCreateDisplayById_client_proc_t) (void * ctx, uint32_t);
+typedef int (renderControl_APIENTRY *rcSetDisplayPoseDpi_client_proc_t) (void * ctx, uint32_t, GLint, GLint, uint32_t, uint32_t, uint32_t);
 
 
 #endif
diff --git a/system/renderControl_enc/renderControl_enc.cpp b/system/renderControl_enc/renderControl_enc.cpp
index 5e6f751..1c544a8 100644
--- a/system/renderControl_enc/renderControl_enc.cpp
+++ b/system/renderControl_enc/renderControl_enc.cpp
@@ -2403,6 +2403,93 @@
 	stream->flush();
 }
 
+int rcCreateDisplayById_enc(void *self , uint32_t displayId)
+{
+	AEMU_SCOPED_TRACE("rcCreateDisplayById encode");
+
+	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_rcCreateDisplayById;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &displayId, 4); ptr += 4;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+
+	int retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("rcCreateDisplayById: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
+int rcSetDisplayPoseDpi_enc(void *self , uint32_t displayId, GLint x, GLint y, uint32_t w, uint32_t h, uint32_t dpi)
+{
+	AEMU_SCOPED_TRACE("rcSetDisplayPoseDpi encode");
+
+	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
+	IOStream *stream = ctx->m_stream;
+	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
+
+	 unsigned char *ptr;
+	 unsigned char *buf;
+	 const size_t sizeWithoutChecksum = 8 + 4 + 4 + 4 + 4 + 4 + 4;
+	 const size_t checksumSize = checksumCalculator->checksumByteSize();
+	 const size_t totalSize = sizeWithoutChecksum + checksumSize;
+	buf = stream->alloc(totalSize);
+	ptr = buf;
+	int tmp = OP_rcSetDisplayPoseDpi;memcpy(ptr, &tmp, 4); ptr += 4;
+	memcpy(ptr, &totalSize, 4);  ptr += 4;
+
+		memcpy(ptr, &displayId, 4); ptr += 4;
+		memcpy(ptr, &x, 4); ptr += 4;
+		memcpy(ptr, &y, 4); ptr += 4;
+		memcpy(ptr, &w, 4); ptr += 4;
+		memcpy(ptr, &h, 4); ptr += 4;
+		memcpy(ptr, &dpi, 4); ptr += 4;
+
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+
+	int retval;
+	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		unsigned char *checksumBufPtr = NULL;
+		unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize];
+		if (checksumSize > 0) checksumBufPtr = &checksumBuf[0];
+		stream->readback(checksumBufPtr, checksumSize);
+		if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) {
+			ALOGE("rcSetDisplayPoseDpi: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
+	return retval;
+}
+
 }  // namespace
 
 renderControl_encoder_context_t::renderControl_encoder_context_t(IOStream *stream, ChecksumCalculator *checksumCalculator)
@@ -2472,5 +2559,7 @@
 	this->rcDestroySyncKHRAsync = &rcDestroySyncKHRAsync_enc;
 	this->rcComposeWithoutPost = &rcComposeWithoutPost_enc;
 	this->rcComposeAsyncWithoutPost = &rcComposeAsyncWithoutPost_enc;
+	this->rcCreateDisplayById = &rcCreateDisplayById_enc;
+	this->rcSetDisplayPoseDpi = &rcSetDisplayPoseDpi_enc;
 }
 
diff --git a/system/renderControl_enc/renderControl_entry.cpp b/system/renderControl_enc/renderControl_entry.cpp
index 305625b..c58ddf5 100644
--- a/system/renderControl_enc/renderControl_entry.cpp
+++ b/system/renderControl_enc/renderControl_entry.cpp
@@ -67,6 +67,8 @@
 	void rcDestroySyncKHRAsync(uint64_t sync);
 	GLint rcComposeWithoutPost(uint32_t bufferSize, void* buffer);
 	void rcComposeAsyncWithoutPost(uint32_t bufferSize, void* buffer);
+	int rcCreateDisplayById(uint32_t displayId);
+	int rcSetDisplayPoseDpi(uint32_t displayId, GLint x, GLint y, uint32_t w, uint32_t h, uint32_t dpi);
 };
 
 #ifndef GET_CONTEXT
@@ -447,3 +449,15 @@
 	ctx->rcComposeAsyncWithoutPost(ctx, bufferSize, buffer);
 }
 
+int rcCreateDisplayById(uint32_t displayId)
+{
+	GET_CONTEXT;
+	return ctx->rcCreateDisplayById(ctx, displayId);
+}
+
+int rcSetDisplayPoseDpi(uint32_t displayId, GLint x, GLint y, uint32_t w, uint32_t h, uint32_t dpi)
+{
+	GET_CONTEXT;
+	return ctx->rcSetDisplayPoseDpi(ctx, displayId, x, y, w, h, dpi);
+}
+
diff --git a/system/renderControl_enc/renderControl_ftable.h b/system/renderControl_enc/renderControl_ftable.h
index 2ee38b5..2adf3bf 100644
--- a/system/renderControl_enc/renderControl_ftable.h
+++ b/system/renderControl_enc/renderControl_ftable.h
@@ -70,6 +70,8 @@
 	{"rcDestroySyncKHRAsync", (void*)rcDestroySyncKHRAsync},
 	{"rcComposeWithoutPost", (void*)rcComposeWithoutPost},
 	{"rcComposeAsyncWithoutPost", (void*)rcComposeAsyncWithoutPost},
+	{"rcCreateDisplayById", (void*)rcCreateDisplayById},
+	{"rcSetDisplayPoseDpi", (void*)rcSetDisplayPoseDpi},
 };
 static const int renderControl_num_funcs = sizeof(renderControl_funcs_by_name) / sizeof(struct _renderControl_funcs_by_name);
 
diff --git a/system/renderControl_enc/renderControl_opcodes.h b/system/renderControl_enc/renderControl_opcodes.h
index a3a6e27..732d3e0 100644
--- a/system/renderControl_enc/renderControl_opcodes.h
+++ b/system/renderControl_enc/renderControl_opcodes.h
@@ -65,7 +65,9 @@
 #define OP_rcDestroySyncKHRAsync 					10059
 #define OP_rcComposeWithoutPost 					10060
 #define OP_rcComposeAsyncWithoutPost 					10061
-#define OP_last 					10062
+#define OP_rcCreateDisplayById 					10062
+#define OP_rcSetDisplayPoseDpi 					10063
+#define OP_last 					10064
 
 
 #endif
diff --git a/system/vulkan/goldfish_vulkan.cpp b/system/vulkan/goldfish_vulkan.cpp
index 8fd790c..c4b3320 100644
--- a/system/vulkan/goldfish_vulkan.cpp
+++ b/system/vulkan/goldfish_vulkan.cpp
@@ -905,8 +905,7 @@
     if (status != ZX_OK)
       return std::nullopt;
 
-    auto result = fuchsia_logger::LogSink::Call::Connect(
-        channel, std::move(remote_socket));
+    auto result = WireCall(channel).Connect(std::move(remote_socket));
 
     if (!result.ok())
       return std::nullopt;
diff --git a/system/vulkan_enc/ResourceTracker.cpp b/system/vulkan_enc/ResourceTracker.cpp
index 407d9a4..6104c2d 100644
--- a/system/vulkan_enc/ResourceTracker.cpp
+++ b/system/vulkan_enc/ResourceTracker.cpp
@@ -178,6 +178,7 @@
 using android::aligned_buf_free;
 using android::base::Optional;
 using android::base::guest::AutoLock;
+using android::base::guest::RecursiveLock;
 using android::base::guest::Lock;
 using android::base::guest::WorkPool;
 
@@ -338,7 +339,7 @@
     };
 
     struct VkQueue_Info {
-        uint32_t placeholder;
+        VkDevice device;
     };
 
     // custom guest-side structs for images/buffers because of AHardwareBuffer :((
@@ -419,6 +420,10 @@
         uint32_t unused;
     };
 
+    struct VkSampler_Info {
+        uint32_t unused;
+    };
+
     struct VkBufferCollectionFUCHSIA_Info {
 #ifdef VK_USE_PLATFORM_FUCHSIA
         android::base::Optional<
@@ -478,6 +483,13 @@
         info_VkCommandPool.erase(pool);
     }
 
+    void unregister_VkSampler(VkSampler sampler) {
+        if (!sampler) return;
+
+        AutoLock lock(mLock);
+        info_VkSampler.erase(sampler);
+    }
+
     void unregister_VkCommandBuffer(VkCommandBuffer commandBuffer) {
         resetCommandBufferStagingInfo(commandBuffer, true /* also reset primaries */, true /* also clear pending descriptor sets */);
 
@@ -709,34 +721,32 @@
         return res;
     }
 
-    VkWriteDescriptorSet
-    createImmutableSamplersFilteredWriteDescriptorSetLocked(
-        const VkWriteDescriptorSet* descriptorWrite,
-        std::vector<VkDescriptorImageInfo>* imageInfoArray) {
+    bool descriptorBindingIsImmutableSampler(
+        VkDescriptorSet dstSet,
+        uint32_t dstBinding) {
 
-        VkWriteDescriptorSet res = *descriptorWrite;
+        return as_goldfish_VkDescriptorSet(dstSet)->reified->bindingIsImmutableSampler[dstBinding];
+    }
 
-        if  (descriptorWrite->descriptorCount == 0) return res;
+    VkDescriptorImageInfo
+    filterNonexistentSampler(
+        const VkDescriptorImageInfo& inputInfo) {
 
-        if  (descriptorWrite->descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER &&
-             descriptorWrite->descriptorType != VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) return res;
+        VkSampler sampler =
+            inputInfo.sampler;
 
-        bool immutableSampler =
-            as_goldfish_VkDescriptorSet(descriptorWrite->dstSet)->reified->bindingIsImmutableSampler[descriptorWrite->dstBinding];
+        VkDescriptorImageInfo res = inputInfo;
 
-        if (!immutableSampler) return res;
-
-        for (uint32_t i = 0; i < descriptorWrite->descriptorCount; ++i) {
-            VkDescriptorImageInfo imageInfo = descriptorWrite->pImageInfo[i];
-            imageInfo.sampler = 0;
-            imageInfoArray->push_back(imageInfo);
+        if (sampler) {
+            auto it = info_VkSampler.find(sampler);
+            bool samplerExists = it != info_VkSampler.end();
+            if (!samplerExists) res.sampler = 0;
         }
 
-        res.pImageInfo = imageInfoArray->data();
-
         return res;
     }
 
+
     void freeDescriptorSetsIfHostAllocated(VkEncoder* enc, VkDevice device, uint32_t descriptorSetCount, const VkDescriptorSet* sets) {
         for (uint32_t i = 0; i < descriptorSetCount; ++i) {
             struct goldfish_VkDescriptorSet* ds = as_goldfish_VkDescriptorSet(sets[i]);
@@ -931,7 +941,7 @@
                 abort();
             }
             mControlDevice = std::make_unique<
-                fuchsia_hardware_goldfish::ControlDevice::SyncClient>(
+                fidl::WireSyncClient<fuchsia_hardware_goldfish::ControlDevice>>(
                 std::move(channel));
 
             fidl::ClientEnd<fuchsia_sysmem::Allocator> sysmem_channel{
@@ -940,7 +950,7 @@
                 ALOGE("failed to open sysmem connection");
             }
             mSysmemAllocator =
-                std::make_unique<fuchsia_sysmem::Allocator::SyncClient>(
+                std::make_unique<fidl::WireSyncClient<fuchsia_sysmem::Allocator>>(
                     std::move(sysmem_channel));
             char name[ZX_MAX_NAME_LEN] = {};
             zx_object_get_property(zx_process_self(), ZX_PROP_NAME, name, sizeof(name));
@@ -949,7 +959,8 @@
             zx_info_handle_basic_t info;
             zx_object_get_info(zx_process_self(), ZX_INFO_HANDLE_BASIC, &info, sizeof(info),
                                nullptr, nullptr);
-            mSysmemAllocator->SetDebugClientInfo(fidl::unowned_str(client_name), info.koid);
+            mSysmemAllocator->SetDebugClientInfo(fidl::StringView::FromExternal(client_name),
+                                                 info.koid);
         }
 #endif
 
@@ -1145,6 +1156,7 @@
         VkExternalMemoryHandleTypeFlags supportedHandleType = 0u;
 #ifdef VK_USE_PLATFORM_FUCHSIA
         supportedHandleType |=
+            VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA |
             VK_EXTERNAL_MEMORY_HANDLE_TYPE_TEMP_ZIRCON_VMO_BIT_FUCHSIA;
 #endif  // VK_USE_PLATFORM_FUCHSIA
 #ifdef VK_USE_PLATFORM_ANDROID_KHR
@@ -1259,6 +1271,8 @@
         VkExtensionProperties* pProperties) {
 
         std::vector<const char*> allowedExtensionNames = {
+            "VK_KHR_vulkan_memory_model",
+            "VK_KHR_buffer_device_address",
             "VK_KHR_maintenance1",
             "VK_KHR_maintenance2",
             "VK_KHR_maintenance3",
@@ -1271,6 +1285,9 @@
             "VK_KHR_timeline_semaphore",
             "VK_AMD_gpu_shader_half_float",
             "VK_NV_shader_subgroup_partitioned",
+            "VK_KHR_shader_subgroup_extended_types",
+            "VK_EXT_subgroup_size_control",
+            "VK_KHR_pipeline_executable_properties",
 #ifdef VK_USE_PLATFORM_ANDROID_KHR
             "VK_KHR_external_semaphore",
             "VK_KHR_external_semaphore_fd",
@@ -1576,6 +1593,23 @@
         }
     }
 
+    void on_vkGetDeviceQueue(void*,
+                             VkDevice device,
+                             uint32_t,
+                             uint32_t,
+                             VkQueue* pQueue) {
+        AutoLock lock(mLock);
+        info_VkQueue[*pQueue].device = device;
+    }
+
+    void on_vkGetDeviceQueue2(void*,
+                              VkDevice device,
+                              const VkDeviceQueueInfo2*,
+                              VkQueue* pQueue) {
+        AutoLock lock(mLock);
+        info_VkQueue[*pQueue].device = device;
+    }
+
     VkResult on_vkCreateInstance(
         void* context,
         VkResult input_result,
@@ -1740,10 +1774,11 @@
         VkExternalMemoryHandleTypeFlagBits handleType,
         uint32_t handle,
         VkMemoryZirconHandlePropertiesFUCHSIA* pProperties) {
-        using fuchsia_hardware_goldfish::wire::MEMORY_PROPERTY_DEVICE_LOCAL;
-        using fuchsia_hardware_goldfish::wire::MEMORY_PROPERTY_HOST_VISIBLE;
+        using fuchsia_hardware_goldfish::wire::kMemoryPropertyDeviceLocal;
+        using fuchsia_hardware_goldfish::wire::kMemoryPropertyHostVisible;
 
-        if (handleType != VK_EXTERNAL_MEMORY_HANDLE_TYPE_TEMP_ZIRCON_VMO_BIT_FUCHSIA) {
+        if (handleType != VK_EXTERNAL_MEMORY_HANDLE_TYPE_TEMP_ZIRCON_VMO_BIT_FUCHSIA &&
+            handleType != VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA) {
             return VK_ERROR_INITIALIZATION_FAILED;
         }
 
@@ -1788,7 +1823,7 @@
             // If an VMO is allocated while ColorBuffer/Buffer is not created,
             // it must be a device-local buffer, since for host-visible buffers,
             // ColorBuffer/Buffer is created at sysmem allocation time.
-            memoryProperty = MEMORY_PROPERTY_DEVICE_LOCAL;
+            memoryProperty = kMemoryPropertyDeviceLocal;
         } else {
             // Importing read-only host memory into the Vulkan driver should not
             // work, but it is not an error to try to do so. Returning a
@@ -1802,10 +1837,10 @@
 
         pProperties->memoryTypeBits = 0;
         for (uint32_t i = 0; i < info.memProps.memoryTypeCount; ++i) {
-            if (((memoryProperty & MEMORY_PROPERTY_DEVICE_LOCAL) &&
+            if (((memoryProperty & kMemoryPropertyDeviceLocal) &&
                  (info.memProps.memoryTypes[i].propertyFlags &
                   VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)) ||
-                ((memoryProperty & MEMORY_PROPERTY_HOST_VISIBLE) &&
+                ((memoryProperty & kMemoryPropertyHostVisible) &&
                  (info.memProps.memoryTypes[i].propertyFlags &
                   VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT))) {
                 pProperties->memoryTypeBits |= 1ull << i;
@@ -1858,7 +1893,11 @@
         if (info.eventHandle != ZX_HANDLE_INVALID) {
             zx_handle_close(info.eventHandle);
         }
+#if VK_HEADER_VERSION < 174
         info.eventHandle = pInfo->handle;
+#else // VK_HEADER_VERSION >= 174
+        info.eventHandle = pInfo->zirconHandle;
+#endif // VK_HEADER_VERSION < 174
         if (info.eventHandle != ZX_HANDLE_INVALID) {
             info.eventKoid = getEventKoid(info.eventHandle);
         }
@@ -1942,7 +1981,7 @@
         }
 
         auto* sysmem_collection =
-            new fuchsia_sysmem::BufferCollection::SyncClient(
+            new fidl::WireSyncClient<fuchsia_sysmem::BufferCollection>(
                 std::move(collection_client));
         *pCollection = reinterpret_cast<VkBufferCollectionFUCHSIA>(sysmem_collection);
 
@@ -1955,7 +1994,7 @@
         VkBufferCollectionFUCHSIA collection,
         const VkAllocationCallbacks*) {
         auto sysmem_collection = reinterpret_cast<
-            fuchsia_sysmem::BufferCollection::SyncClient*>(collection);
+            fidl::WireSyncClient<fuchsia_sysmem::BufferCollection>*>(collection);
         if (sysmem_collection) {
             sysmem_collection->Close();
         }
@@ -1999,9 +2038,9 @@
         buffer_constraints.inaccessible_domain_supported = true;
         buffer_constraints.heap_permitted_count = 2;
         buffer_constraints.heap_permitted[0] =
-            fuchsia_sysmem::wire::HeapType::GOLDFISH_DEVICE_LOCAL;
+            fuchsia_sysmem::wire::HeapType::kGoldfishDeviceLocal;
         buffer_constraints.heap_permitted[1] =
-            fuchsia_sysmem::wire::HeapType::GOLDFISH_HOST_VISIBLE;
+            fuchsia_sysmem::wire::HeapType::kGoldfishHostVisible;
 
         return constraints;
     }
@@ -2011,15 +2050,15 @@
         uint32_t usage = 0u;
         VkImageUsageFlags imageUsage = pImageInfo->usage;
 
-#define SetUsageBit(USAGE)                                           \
-    if (imageUsage & VK_IMAGE_USAGE_##USAGE##_BIT) {                 \
-        usage |= fuchsia_sysmem::wire::VULKAN_IMAGE_USAGE_##USAGE; \
+#define SetUsageBit(BIT, VALUE)                                           \
+    if (imageUsage & VK_IMAGE_USAGE_##BIT##_BIT) {                 \
+        usage |= fuchsia_sysmem::wire::kVulkanImageUsage##VALUE; \
     }
 
-        SetUsageBit(COLOR_ATTACHMENT);
-        SetUsageBit(TRANSFER_SRC);
-        SetUsageBit(TRANSFER_DST);
-        SetUsageBit(SAMPLED);
+        SetUsageBit(COLOR_ATTACHMENT, ColorAttachment);
+        SetUsageBit(TRANSFER_SRC, TransferSrc);
+        SetUsageBit(TRANSFER_DST, TransferDst);
+        SetUsageBit(SAMPLED, Sampled);
 
 #undef SetUsageBit
         return usage;
@@ -2031,20 +2070,20 @@
         VkBufferUsageFlags bufferUsage =
             pBufferConstraintsInfo->pBufferCreateInfo->usage;
 
-#define SetUsageBit(USAGE)                                            \
-    if (bufferUsage & VK_BUFFER_USAGE_##USAGE##_BIT) {                \
-        usage |= fuchsia_sysmem::wire::VULKAN_BUFFER_USAGE_##USAGE; \
+#define SetUsageBit(BIT, VALUE)                                            \
+    if (bufferUsage & VK_BUFFER_USAGE_##BIT##_BIT) {                \
+        usage |= fuchsia_sysmem::wire::kVulkanBufferUsage##VALUE; \
     }
 
-        SetUsageBit(TRANSFER_SRC);
-        SetUsageBit(TRANSFER_DST);
-        SetUsageBit(UNIFORM_TEXEL_BUFFER);
-        SetUsageBit(STORAGE_TEXEL_BUFFER);
-        SetUsageBit(UNIFORM_BUFFER);
-        SetUsageBit(STORAGE_BUFFER);
-        SetUsageBit(INDEX_BUFFER);
-        SetUsageBit(VERTEX_BUFFER);
-        SetUsageBit(INDIRECT_BUFFER);
+        SetUsageBit(TRANSFER_SRC, TransferSrc);
+        SetUsageBit(TRANSFER_DST, TransferDst);
+        SetUsageBit(UNIFORM_TEXEL_BUFFER, UniformTexelBuffer);
+        SetUsageBit(STORAGE_TEXEL_BUFFER, StorageTexelBuffer);
+        SetUsageBit(UNIFORM_BUFFER, UniformBuffer);
+        SetUsageBit(STORAGE_BUFFER, StorageBuffer);
+        SetUsageBit(INDEX_BUFFER, IndexBuffer);
+        SetUsageBit(VERTEX_BUFFER, VertexBuffer);
+        SetUsageBit(INDIRECT_BUFFER, IndirectBuffer);
 
 #undef SetUsageBit
         return usage;
@@ -2059,14 +2098,14 @@
             case VK_FORMAT_B8G8R8A8_SNORM:
             case VK_FORMAT_B8G8R8A8_SSCALED:
             case VK_FORMAT_B8G8R8A8_USCALED:
-                return fuchsia_sysmem::wire::PixelFormatType::BGRA32;
+                return fuchsia_sysmem::wire::PixelFormatType::kBgra32;
             case VK_FORMAT_R8G8B8A8_SINT:
             case VK_FORMAT_R8G8B8A8_UNORM:
             case VK_FORMAT_R8G8B8A8_SRGB:
             case VK_FORMAT_R8G8B8A8_SNORM:
             case VK_FORMAT_R8G8B8A8_SSCALED:
             case VK_FORMAT_R8G8B8A8_USCALED:
-                return fuchsia_sysmem::wire::PixelFormatType::R8G8B8A8;
+                return fuchsia_sysmem::wire::PixelFormatType::kR8G8B8A8;
             case VK_FORMAT_R8_UNORM:
             case VK_FORMAT_R8_UINT:
             case VK_FORMAT_R8_USCALED:
@@ -2074,7 +2113,7 @@
             case VK_FORMAT_R8_SINT:
             case VK_FORMAT_R8_SSCALED:
             case VK_FORMAT_R8_SRGB:
-                return fuchsia_sysmem::wire::PixelFormatType::R8;
+                return fuchsia_sysmem::wire::PixelFormatType::kR8;
             case VK_FORMAT_R8G8_UNORM:
             case VK_FORMAT_R8G8_UINT:
             case VK_FORMAT_R8G8_USCALED:
@@ -2082,9 +2121,9 @@
             case VK_FORMAT_R8G8_SINT:
             case VK_FORMAT_R8G8_SSCALED:
             case VK_FORMAT_R8G8_SRGB:
-                return fuchsia_sysmem::wire::PixelFormatType::R8G8;
+                return fuchsia_sysmem::wire::PixelFormatType::kR8G8;
             default:
-                return fuchsia_sysmem::wire::PixelFormatType::INVALID;
+                return fuchsia_sysmem::wire::PixelFormatType::kInvalid;
         }
     }
 
@@ -2099,7 +2138,7 @@
             case VK_FORMAT_B8G8R8A8_SSCALED:
             case VK_FORMAT_B8G8R8A8_USCALED:
                 return sysmemFormat ==
-                       fuchsia_sysmem::wire::PixelFormatType::BGRA32;
+                       fuchsia_sysmem::wire::PixelFormatType::kBgra32;
             case VK_FORMAT_R8G8B8A8_SINT:
             case VK_FORMAT_R8G8B8A8_UNORM:
             case VK_FORMAT_R8G8B8A8_SRGB:
@@ -2107,7 +2146,7 @@
             case VK_FORMAT_R8G8B8A8_SSCALED:
             case VK_FORMAT_R8G8B8A8_USCALED:
                 return sysmemFormat ==
-                       fuchsia_sysmem::wire::PixelFormatType::R8G8B8A8;
+                       fuchsia_sysmem::wire::PixelFormatType::kR8G8B8A8;
             case VK_FORMAT_R8_UNORM:
             case VK_FORMAT_R8_UINT:
             case VK_FORMAT_R8_USCALED:
@@ -2116,9 +2155,9 @@
             case VK_FORMAT_R8_SSCALED:
             case VK_FORMAT_R8_SRGB:
                 return sysmemFormat ==
-                           fuchsia_sysmem::wire::PixelFormatType::R8 ||
+                           fuchsia_sysmem::wire::PixelFormatType::kR8 ||
                        sysmemFormat ==
-                           fuchsia_sysmem::wire::PixelFormatType::L8;
+                           fuchsia_sysmem::wire::PixelFormatType::kL8;
             case VK_FORMAT_R8G8_UNORM:
             case VK_FORMAT_R8G8_UINT:
             case VK_FORMAT_R8G8_USCALED:
@@ -2127,7 +2166,7 @@
             case VK_FORMAT_R8G8_SSCALED:
             case VK_FORMAT_R8G8_SRGB:
                 return sysmemFormat ==
-                       fuchsia_sysmem::wire::PixelFormatType::R8G8;
+                       fuchsia_sysmem::wire::PixelFormatType::kR8G8;
             default:
                 return false;
         }
@@ -2136,14 +2175,14 @@
     static VkFormat sysmemPixelFormatTypeToVk(
         fuchsia_sysmem::wire::PixelFormatType format) {
         switch (format) {
-            case fuchsia_sysmem::wire::PixelFormatType::BGRA32:
+            case fuchsia_sysmem::wire::PixelFormatType::kBgra32:
                 return VK_FORMAT_B8G8R8A8_SRGB;
-            case fuchsia_sysmem::wire::PixelFormatType::R8G8B8A8:
+            case fuchsia_sysmem::wire::PixelFormatType::kR8G8B8A8:
                 return VK_FORMAT_R8G8B8A8_SRGB;
-            case fuchsia_sysmem::wire::PixelFormatType::L8:
-            case fuchsia_sysmem::wire::PixelFormatType::R8:
+            case fuchsia_sysmem::wire::PixelFormatType::kL8:
+            case fuchsia_sysmem::wire::PixelFormatType::kR8:
                 return VK_FORMAT_R8_UNORM;
-            case fuchsia_sysmem::wire::PixelFormatType::R8G8:
+            case fuchsia_sysmem::wire::PixelFormatType::kR8G8:
                 return VK_FORMAT_R8G8_UNORM;
             default:
                 return VK_FORMAT_UNDEFINED;
@@ -2152,7 +2191,7 @@
 
     VkResult setBufferCollectionConstraints(
         VkEncoder* enc, VkDevice device,
-        fuchsia_sysmem::BufferCollection::SyncClient* collection,
+        fidl::WireSyncClient<fuchsia_sysmem::BufferCollection>* collection,
         const VkImageCreateInfo* pImageInfo) {
         if (pImageInfo == nullptr) {
             ALOGE("setBufferCollectionConstraints: pImageInfo cannot be null.");
@@ -2262,7 +2301,7 @@
         } else {
             auto pixel_format = vkFormatTypeToSysmem(createInfo->format);
             if (pixel_format ==
-                fuchsia_sysmem::wire::PixelFormatType::INVALID) {
+                fuchsia_sysmem::wire::PixelFormatType::kInvalid) {
                 ALOGW("%s: Unsupported VkFormat %u", __func__,
                       static_cast<uint32_t>(createInfo->format));
                 return VK_ERROR_FORMAT_NOT_SUPPORTED;
@@ -2273,7 +2312,7 @@
         if (!formatConstraints || formatConstraints->colorSpaceCount == 0u) {
             imageConstraints.color_spaces_count = 1;
             imageConstraints.color_space[0].type =
-                fuchsia_sysmem::wire::ColorSpaceType::SRGB;
+                fuchsia_sysmem::wire::ColorSpaceType::kSrgb;
         } else {
             imageConstraints.color_spaces_count =
                 formatConstraints->colorSpaceCount;
@@ -2315,9 +2354,8 @@
         imageConstraints.pixel_format.has_format_modifier = true;
         imageConstraints.pixel_format.format_modifier.value =
             (tiling == VK_IMAGE_TILING_LINEAR)
-                ? fuchsia_sysmem::wire::FORMAT_MODIFIER_LINEAR
-                : fuchsia_sysmem::wire::
-                      FORMAT_MODIFIER_GOOGLE_GOLDFISH_OPTIMAL;
+                ? fuchsia_sysmem::wire::kFormatModifierLinear
+                : fuchsia_sysmem::wire::kFormatModifierGoogleGoldfishOptimal;
 
         constraints->image_format_constraints
             [constraints->image_format_constraints_count++] =
@@ -2328,7 +2366,7 @@
     VkResult setBufferCollectionImageConstraints(
         VkEncoder* enc,
         VkDevice device,
-        fuchsia_sysmem::BufferCollection::SyncClient* collection,
+        fidl::WireSyncClient<fuchsia_sysmem::BufferCollection>* collection,
         const VkImageConstraintsInfoFUCHSIA* pImageConstraintsInfo) {
         if (!pImageConstraintsInfo ||
             pImageConstraintsInfo->sType !=
@@ -2413,13 +2451,13 @@
         // and flags.
         VkImageConstraintsInfoFlagsFUCHSIA flags = pImageConstraintsInfo->flags;
         if (flags & VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_RARELY_FUCHSIA)
-            constraints.usage.cpu |= fuchsia_sysmem::wire::cpuUsageRead;
+            constraints.usage.cpu |= fuchsia_sysmem::wire::kCpuUsageRead;
         if (flags & VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_OFTEN_FUCHSIA)
-            constraints.usage.cpu |= fuchsia_sysmem::wire::cpuUsageReadOften;
+            constraints.usage.cpu |= fuchsia_sysmem::wire::kCpuUsageReadOften;
         if (flags & VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_RARELY_FUCHSIA)
-            constraints.usage.cpu |= fuchsia_sysmem::wire::cpuUsageWrite;
+            constraints.usage.cpu |= fuchsia_sysmem::wire::kCpuUsageWrite;
         if (flags & VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_OFTEN_FUCHSIA)
-            constraints.usage.cpu |= fuchsia_sysmem::wire::cpuUsageWriteOften;
+            constraints.usage.cpu |= fuchsia_sysmem::wire::kCpuUsageWriteOften;
 
         constraints.has_buffer_memory_constraints = true;
         auto& memory_constraints = constraints.buffer_memory_constraints;
@@ -2435,13 +2473,13 @@
         if (memory_constraints.inaccessible_domain_supported) {
             memory_constraints.heap_permitted_count = 2;
             memory_constraints.heap_permitted[0] =
-                fuchsia_sysmem::wire::HeapType::GOLDFISH_DEVICE_LOCAL;
+                fuchsia_sysmem::wire::HeapType::kGoldfishDeviceLocal;
             memory_constraints.heap_permitted[1] =
-                fuchsia_sysmem::wire::HeapType::GOLDFISH_HOST_VISIBLE;
+                fuchsia_sysmem::wire::HeapType::kGoldfishHostVisible;
         } else {
             memory_constraints.heap_permitted_count = 1;
             memory_constraints.heap_permitted[0] =
-                fuchsia_sysmem::wire::HeapType::GOLDFISH_HOST_VISIBLE;
+                fuchsia_sysmem::wire::HeapType::kGoldfishHostVisible;
         }
 
         if (constraints.image_format_constraints_count == 0) {
@@ -2451,9 +2489,8 @@
         }
 
         constexpr uint32_t kVulkanPriority = 5;
-        const char* kName = "GoldfishSysmemShared";
-        collection->SetName(kVulkanPriority,
-                            fidl::unowned_str(kName, strlen(kName)));
+        const char kName[] = "GoldfishSysmemShared";
+        collection->SetName(kVulkanPriority, fidl::StringView(kName));
 
         auto result = collection->SetConstraints(true, constraints);
         if (!result.ok()) {
@@ -2479,7 +2516,7 @@
     }
 
     VkResult setBufferCollectionBufferConstraints(
-        fuchsia_sysmem::BufferCollection::SyncClient* collection,
+        fidl::WireSyncClient<fuchsia_sysmem::BufferCollection>* collection,
         const VkBufferConstraintsInfoFUCHSIA* pBufferConstraintsInfo) {
         if (pBufferConstraintsInfo == nullptr) {
             ALOGE(
@@ -2497,8 +2534,8 @@
                 pBufferConstraintsInfo);
 
         constexpr uint32_t kVulkanPriority = 5;
-        const char* kName = "GoldfishBufferSysmemShared";
-        collection->SetName(kVulkanPriority, fidl::unowned_str(kName, strlen(kName)));
+        const char kName[] = "GoldfishBufferSysmemShared";
+        collection->SetName(kVulkanPriority, fidl::StringView(kName));
 
         auto result = collection->SetConstraints(true, constraints);
         if (!result.ok()) {
@@ -2527,7 +2564,7 @@
         const VkImageCreateInfo* pImageInfo) {
         VkEncoder* enc = (VkEncoder*)context;
         auto sysmem_collection = reinterpret_cast<
-            fuchsia_sysmem::BufferCollection::SyncClient*>(collection);
+            fidl::WireSyncClient<fuchsia_sysmem::BufferCollection>*>(collection);
         return setBufferCollectionConstraints(enc, device, sysmem_collection, pImageInfo);
     }
 
@@ -2539,7 +2576,7 @@
         const VkImageConstraintsInfoFUCHSIA* pImageConstraintsInfo) {
         VkEncoder* enc = (VkEncoder*)context;
         auto sysmem_collection = reinterpret_cast<
-            fuchsia_sysmem::BufferCollection::SyncClient*>(collection);
+            fidl::WireSyncClient<fuchsia_sysmem::BufferCollection>*>(collection);
         return setBufferCollectionImageConstraints(
             enc, device, sysmem_collection, pImageConstraintsInfo);
     }
@@ -2551,7 +2588,7 @@
         VkBufferCollectionFUCHSIA collection,
         const VkBufferConstraintsInfoFUCHSIA* pBufferConstraintsInfo) {
         auto sysmem_collection = reinterpret_cast<
-            fuchsia_sysmem::BufferCollection::SyncClient*>(collection);
+            fidl::WireSyncClient<fuchsia_sysmem::BufferCollection>*>(collection);
         return setBufferCollectionBufferConstraints(sysmem_collection,
                                                     pBufferConstraintsInfo);
     }
@@ -2578,7 +2615,7 @@
 
     VkResult getBufferCollectionImageCreateInfoIndexLocked(
         VkBufferCollectionFUCHSIA collection,
-        fuchsia_sysmem::wire::BufferCollectionInfo_2& info,
+        fuchsia_sysmem::wire::BufferCollectionInfo2& info,
         uint32_t* outCreateInfoIndex) {
         if (!info_VkBufferCollectionFUCHSIA[collection]
                  .constraints.hasValue()) {
@@ -2655,7 +2692,7 @@
         VkBufferCollectionProperties2FUCHSIA* pProperties) {
         VkEncoder* enc = (VkEncoder*)context;
         auto sysmem_collection = reinterpret_cast<
-            fuchsia_sysmem::BufferCollection::SyncClient*>(collection);
+            fidl::WireSyncClient<fuchsia_sysmem::BufferCollection>*>(collection);
 
         auto result = sysmem_collection->WaitForBuffersAllocated();
         if (!result.ok() || result.Unwrap()->status != ZX_OK) {
@@ -2663,13 +2700,13 @@
                   GET_STATUS_SAFE(result, status));
             return VK_ERROR_INITIALIZATION_FAILED;
         }
-        fuchsia_sysmem::wire::BufferCollectionInfo_2 info =
+        fuchsia_sysmem::wire::BufferCollectionInfo2 info =
             std::move(result.Unwrap()->buffer_collection_info);
 
         bool is_host_visible = info.settings.buffer_settings.heap ==
-                               fuchsia_sysmem::wire::HeapType::GOLDFISH_HOST_VISIBLE;
+                               fuchsia_sysmem::wire::HeapType::kGoldfishHostVisible;
         bool is_device_local = info.settings.buffer_settings.heap ==
-                               fuchsia_sysmem::wire::HeapType::GOLDFISH_DEVICE_LOCAL;
+                               fuchsia_sysmem::wire::HeapType::kGoldfishDeviceLocal;
         if (!is_host_visible && !is_device_local) {
             ALOGE("buffer collection uses a non-goldfish heap (type 0x%lu)",
                 static_cast<uint64_t>(info.settings.buffer_settings.heap));
@@ -3024,6 +3061,11 @@
 
         const VkImportMemoryZirconHandleInfoFUCHSIA* importVmoInfoPtr =
             vk_find_struct<VkImportMemoryZirconHandleInfoFUCHSIA>(pAllocateInfo);
+        if (!importVmoInfoPtr) {
+            importVmoInfoPtr = reinterpret_cast<const VkImportMemoryZirconHandleInfoFUCHSIA*>(
+                __vk_find_struct(const_cast<void*>(pAllocateInfo->pNext),
+                    VK_STRUCTURE_TYPE_TEMP_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA));
+        }
 
         const VkMemoryDedicatedAllocateInfo* dedicatedAllocInfoPtr =
             vk_find_struct<VkMemoryDedicatedAllocateInfo>(pAllocateInfo);
@@ -3080,8 +3122,10 @@
                 exportAllocateInfoPtr->handleTypes &
                 VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
             exportVmo =
-                exportAllocateInfoPtr->handleTypes &
-                VK_EXTERNAL_MEMORY_HANDLE_TYPE_TEMP_ZIRCON_VMO_BIT_FUCHSIA;
+                (exportAllocateInfoPtr->handleTypes &
+                    VK_EXTERNAL_MEMORY_HANDLE_TYPE_TEMP_ZIRCON_VMO_BIT_FUCHSIA) ||
+                (exportAllocateInfoPtr->handleTypes &
+                    VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA);
         } else if (importAhbInfoPtr) {
             importAhb = true;
         } else if (importBufferCollectionInfoPtr) {
@@ -3172,7 +3216,7 @@
 
 #ifdef VK_USE_PLATFORM_FUCHSIA
             auto collection = reinterpret_cast<
-                fuchsia_sysmem::BufferCollection::SyncClient*>(
+                fidl::WireSyncClient<fuchsia_sysmem::BufferCollection>*>(
                 importBufferCollectionInfoPtr->collection);
             auto result = collection->WaitForBuffersAllocated();
             if (!result.ok() || result.Unwrap()->status != ZX_OK) {
@@ -3180,7 +3224,7 @@
                       GET_STATUS_SAFE(result, status));
                 return VK_ERROR_INITIALIZATION_FAILED;
             }
-            fuchsia_sysmem::wire::BufferCollectionInfo_2& info =
+            fuchsia_sysmem::wire::BufferCollectionInfo2& info =
                 result.Unwrap()->buffer_collection_info;
             uint32_t index = importBufferCollectionInfoPtr->index;
             if (info.buffer_count < index) {
@@ -3290,7 +3334,7 @@
                     }
                 }
 
-                fuchsia_sysmem::BufferCollection::SyncClient collection(
+                fidl::WireSyncClient<fuchsia_sysmem::BufferCollection> collection(
                     std::move(collection_ends->client));
                 if (hasDedicatedImage) {
                     VkResult res = setBufferCollectionConstraints(
@@ -3319,7 +3363,7 @@
                 {
                     auto result = collection.WaitForBuffersAllocated();
                     if (result.ok() && result.Unwrap()->status == ZX_OK) {
-                        fuchsia_sysmem::wire::BufferCollectionInfo_2& info =
+                        fuchsia_sysmem::wire::BufferCollectionInfo2& info =
                             result.Unwrap()->buffer_collection_info;
                         if (!info.buffer_count) {
                             ALOGE(
@@ -3365,7 +3409,7 @@
                             case VK_FORMAT_B8G8R8A8_SSCALED:
                             case VK_FORMAT_B8G8R8A8_USCALED:
                                 format = fuchsia_hardware_goldfish::wire::
-                                    ColorBufferFormatType::BGRA;
+                                    ColorBufferFormatType::kBgra;
                                 break;
                             case VK_FORMAT_R8G8B8A8_SINT:
                             case VK_FORMAT_R8G8B8A8_UNORM:
@@ -3374,7 +3418,7 @@
                             case VK_FORMAT_R8G8B8A8_SSCALED:
                             case VK_FORMAT_R8G8B8A8_USCALED:
                                 format = fuchsia_hardware_goldfish::wire::
-                                    ColorBufferFormatType::RGBA;
+                                    ColorBufferFormatType::kRgba;
                                 break;
                             case VK_FORMAT_R8_UNORM:
                             case VK_FORMAT_R8_UINT:
@@ -3384,7 +3428,7 @@
                             case VK_FORMAT_R8_SSCALED:
                             case VK_FORMAT_R8_SRGB:
                                 format = fuchsia_hardware_goldfish::wire::
-                                    ColorBufferFormatType::LUMINANCE;
+                                    ColorBufferFormatType::kLuminance;
                                 break;
                             case VK_FORMAT_R8G8_UNORM:
                             case VK_FORMAT_R8G8_UINT:
@@ -3394,7 +3438,7 @@
                             case VK_FORMAT_R8G8_SSCALED:
                             case VK_FORMAT_R8G8_SRGB:
                                 format = fuchsia_hardware_goldfish::wire::
-                                    ColorBufferFormatType::RG;
+                                    ColorBufferFormatType::kRg;
                                 break;
                             default:
                                 ALOGE("Unsupported format: %d",
@@ -3402,25 +3446,14 @@
                                 abort();
                         }
 
-                        auto createParams =
-                            fuchsia_hardware_goldfish::wire::
-                                CreateColorBuffer2Params::Builder(
-                                    std::make_unique<
-                                        fuchsia_hardware_goldfish::wire::
-                                            CreateColorBuffer2Params::Frame>())
-                                    .set_width(std::make_unique<uint32_t>(
-                                        pImageCreateInfo->extent.width))
-                                    .set_height(std::make_unique<uint32_t>(
-                                        pImageCreateInfo->extent.height))
-                                    .set_format(
-                                        std::make_unique<
-                                            fuchsia_hardware_goldfish::wire::
-                                                ColorBufferFormatType>(format))
-                                    .set_memory_property(
-                                        std::make_unique<uint32_t>(
-                                            fuchsia_hardware_goldfish::wire::
-                                                MEMORY_PROPERTY_DEVICE_LOCAL))
-                                    .build();
+                        fidl::FidlAllocator allocator;
+                        fuchsia_hardware_goldfish::wire::CreateColorBuffer2Params createParams(
+                            allocator);
+                        createParams.set_width(allocator, pImageCreateInfo->extent.width)
+                            .set_height(allocator, pImageCreateInfo->extent.height)
+                            .set_format(allocator, format)
+                            .set_memory_property(allocator,
+                                fuchsia_hardware_goldfish::wire::kMemoryPropertyDeviceLocal);
 
                         auto result = mControlDevice->CreateColorBuffer2(
                             std::move(vmo_copy), std::move(createParams));
@@ -3441,15 +3474,12 @@
                 }
 
                 if (pBufferConstraintsInfo) {
-                    auto createParams =
-                        fuchsia_hardware_goldfish::wire::CreateBuffer2Params::Builder(
-                            std::make_unique<
-                                fuchsia_hardware_goldfish::wire::CreateBuffer2Params::Frame>())
-                            .set_size(std::make_unique<uint64_t>(
-                                pBufferConstraintsInfo->pBufferCreateInfo->size))
-                            .set_memory_property(std::make_unique<uint32_t>(
-                                fuchsia_hardware_goldfish::wire::MEMORY_PROPERTY_DEVICE_LOCAL))
-                            .build();
+                    fidl::FidlAllocator allocator;
+                    fuchsia_hardware_goldfish::wire::CreateBuffer2Params createParams(allocator);
+                    createParams.set_size(allocator,
+                            pBufferConstraintsInfo->pBufferCreateInfo->size)
+                        .set_memory_property(allocator,
+                            fuchsia_hardware_goldfish::wire::kMemoryPropertyDeviceLocal);
 
                     auto result =
                         mControlDevice->CreateBuffer2(std::move(vmo_copy), std::move(createParams));
@@ -3483,7 +3513,7 @@
                 uint32_t buffer_handle = result.Unwrap()->id;
 
                 if (handle_type == fuchsia_hardware_goldfish::wire::
-                                       BufferHandleType::BUFFER) {
+                                       BufferHandleType::kBuffer) {
                     importBufferInfo.buffer = buffer_handle;
                     vk_append_struct(&structChainIter, &importBufferInfo);
                 } else {
@@ -3913,19 +3943,21 @@
         bool isSysmemBackedMemory = false;
 
         if (extImgCiPtr &&
+            ((extImgCiPtr->handleTypes &
+                VK_EXTERNAL_MEMORY_HANDLE_TYPE_TEMP_ZIRCON_VMO_BIT_FUCHSIA) ||
             (extImgCiPtr->handleTypes &
-             VK_EXTERNAL_MEMORY_HANDLE_TYPE_TEMP_ZIRCON_VMO_BIT_FUCHSIA)) {
+                VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA))) {
             isSysmemBackedMemory = true;
         }
 
         if (extBufferCollectionPtr) {
             auto collection = reinterpret_cast<
-                fuchsia_sysmem::BufferCollection::SyncClient*>(
+                fidl::WireSyncClient<fuchsia_sysmem::BufferCollection>*>(
                 extBufferCollectionPtr->collection);
             uint32_t index = extBufferCollectionPtr->index;
             zx::vmo vmo;
 
-            fuchsia_sysmem::wire::BufferCollectionInfo_2 info;
+            fuchsia_sysmem::wire::BufferCollectionInfo2 info;
 
             auto result = collection->WaitForBuffersAllocated();
             if (result.ok() && result.Unwrap()->status == ZX_OK) {
@@ -3956,7 +3988,7 @@
                     // Buffer handle already exists.
                     // If it is a ColorBuffer, no-op; Otherwise return error.
                     if (buffer_handle_result.value().type !=
-                        fuchsia_hardware_goldfish::wire::BufferHandleType::COLOR_BUFFER) {
+                        fuchsia_hardware_goldfish::wire::BufferHandleType::kColorBuffer) {
                         ALOGE("%s: BufferHandle %u is not a ColorBuffer", __func__,
                               buffer_handle_result.value().id);
                         return VK_ERROR_OUT_OF_HOST_MEMORY;
@@ -3965,29 +3997,25 @@
                     // Buffer handle not found. Create ColorBuffer based on buffer settings.
                     auto format =
                         info.settings.image_format_constraints.pixel_format.type ==
-                                fuchsia_sysmem::wire::PixelFormatType::R8G8B8A8
-                            ? fuchsia_hardware_goldfish::wire::ColorBufferFormatType::RGBA
-                            : fuchsia_hardware_goldfish::wire::ColorBufferFormatType::BGRA;
+                                fuchsia_sysmem::wire::PixelFormatType::kR8G8B8A8
+                            ? fuchsia_hardware_goldfish::wire::ColorBufferFormatType::kRgba
+                            : fuchsia_hardware_goldfish::wire::ColorBufferFormatType::kBgra;
 
                     uint32_t memory_property =
                         info.settings.buffer_settings.heap ==
-                                fuchsia_sysmem::wire::HeapType::GOLDFISH_DEVICE_LOCAL
-                            ? fuchsia_hardware_goldfish::wire::MEMORY_PROPERTY_DEVICE_LOCAL
-                            : fuchsia_hardware_goldfish::wire::MEMORY_PROPERTY_HOST_VISIBLE;
+                                fuchsia_sysmem::wire::HeapType::kGoldfishDeviceLocal
+                            ? fuchsia_hardware_goldfish::wire::kMemoryPropertyDeviceLocal
+                            : fuchsia_hardware_goldfish::wire::kMemoryPropertyHostVisible;
 
-                    auto createParams =
-                        fuchsia_hardware_goldfish::wire::CreateColorBuffer2Params::Builder(
-                            std::make_unique<fuchsia_hardware_goldfish::wire::
-                                                 CreateColorBuffer2Params::Frame>())
-                            .set_width(std::make_unique<uint32_t>(
-                                info.settings.image_format_constraints.min_coded_width))
-                            .set_height(std::make_unique<uint32_t>(
-                                info.settings.image_format_constraints.min_coded_height))
-                            .set_format(std::make_unique<
-                                        fuchsia_hardware_goldfish::wire::ColorBufferFormatType>(
-                                format))
-                            .set_memory_property(std::make_unique<uint32_t>(memory_property))
-                            .build();
+                    fidl::FidlAllocator allocator;
+                    fuchsia_hardware_goldfish::wire::CreateColorBuffer2Params createParams(
+                        allocator);
+                    createParams.set_width(allocator,
+                            info.settings.image_format_constraints.min_coded_width)
+                        .set_height(allocator,
+                            info.settings.image_format_constraints.min_coded_height)
+                        .set_format(allocator, format)
+                        .set_memory_property(allocator, memory_property);
 
                     auto result =
                         mControlDevice->CreateColorBuffer2(std::move(vmo), std::move(createParams));
@@ -3998,7 +4026,7 @@
                 }
 
                 if (info.settings.buffer_settings.heap ==
-                    fuchsia_sysmem::wire::HeapType::GOLDFISH_HOST_VISIBLE) {
+                    fuchsia_sysmem::wire::HeapType::kGoldfishHostVisible) {
                     ALOGD(
                         "%s: Image uses host visible memory heap; set tiling "
                         "to linear to match host ImageCreateInfo",
@@ -4008,6 +4036,10 @@
             }
             isSysmemBackedMemory = true;
         }
+
+        if (isSysmemBackedMemory) {
+            localCreateInfo.flags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
+        }
 #endif
 
         VkResult res;
@@ -4785,25 +4817,62 @@
 
         VkEncoder* enc = (VkEncoder*)context;
 
-        std::vector<std::vector<VkDescriptorImageInfo>> imageInfosPerWrite(
-                descriptorWriteCount);
+        std::vector<VkDescriptorImageInfo> transformedImageInfos;
+        std::vector<VkWriteDescriptorSet> transformedWrites(descriptorWriteCount);
 
-        std::vector<VkWriteDescriptorSet> writesWithSuppressedSamplers;
+        memcpy(transformedWrites.data(), pDescriptorWrites, sizeof(VkWriteDescriptorSet) * descriptorWriteCount);
+
+        size_t imageInfosNeeded = 0;
+        for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
+            if (!isDescriptorTypeImageInfo(transformedWrites[i].descriptorType)) continue;
+            if (!transformedWrites[i].pImageInfo) continue;
+
+            imageInfosNeeded += transformedWrites[i].descriptorCount;
+        }
+
+        transformedImageInfos.resize(imageInfosNeeded);
+
+        size_t imageInfoIndex = 0;
+        for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
+            if (!isDescriptorTypeImageInfo(transformedWrites[i].descriptorType)) continue;
+            if (!transformedWrites[i].pImageInfo) continue;
+
+            for (uint32_t j = 0; j < transformedWrites[i].descriptorCount; ++j) {
+                transformedImageInfos[imageInfoIndex] = transformedWrites[i].pImageInfo[j];
+                ++imageInfoIndex;
+            }
+            transformedWrites[i].pImageInfo = &transformedImageInfos[imageInfoIndex - transformedWrites[i].descriptorCount];
+        }
 
         {
+            // Validate and filter samplers
             AutoLock lock(mLock);
+            size_t imageInfoIndex = 0;
             for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
-                writesWithSuppressedSamplers.push_back(
-                        createImmutableSamplersFilteredWriteDescriptorSetLocked(
-                            pDescriptorWrites + i,
-                            imageInfosPerWrite.data() + i));
+
+                if (!isDescriptorTypeImageInfo(transformedWrites[i].descriptorType)) continue;
+                if (!transformedWrites[i].pImageInfo) continue;
+
+                bool isImmutableSampler =
+                    descriptorBindingIsImmutableSampler(
+                        transformedWrites[i].dstSet,
+                        transformedWrites[i].dstBinding);
+
+                for (uint32_t j = 0; j < transformedWrites[i].descriptorCount; ++j) {
+                    if (isImmutableSampler) {
+                        transformedImageInfos[imageInfoIndex].sampler = 0;
+                    }
+                    transformedImageInfos[imageInfoIndex] =
+                        filterNonexistentSampler(transformedImageInfos[imageInfoIndex]);
+                    ++imageInfoIndex;
+                }
             }
         }
 
         if (mFeatureInfo->hasVulkanBatchedDescriptorSetUpdate) {
             for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
-                VkDescriptorSet set = writesWithSuppressedSamplers[i].dstSet;
-                doEmulatedDescriptorWrite(&writesWithSuppressedSamplers[i],
+                VkDescriptorSet set = transformedWrites[i].dstSet;
+                doEmulatedDescriptorWrite(&transformedWrites[i],
                         as_goldfish_VkDescriptorSet(set)->reified);
             }
 
@@ -4814,7 +4883,7 @@
             }
         } else {
             enc->vkUpdateDescriptorSets(
-                    device, descriptorWriteCount, writesWithSuppressedSamplers.data(),
+                    device, descriptorWriteCount, transformedWrites.data(),
                     descriptorCopyCount, pDescriptorCopies, true /* do lock */);
         }
     }
@@ -4932,8 +5001,10 @@
         const VkExternalMemoryBufferCreateInfo* extBufCiPtr =
             vk_find_struct<VkExternalMemoryBufferCreateInfo>(pCreateInfo);
         if (extBufCiPtr &&
+            ((extBufCiPtr->handleTypes &
+             VK_EXTERNAL_MEMORY_HANDLE_TYPE_TEMP_ZIRCON_VMO_BIT_FUCHSIA) ||
             (extBufCiPtr->handleTypes &
-             VK_EXTERNAL_MEMORY_HANDLE_TYPE_TEMP_ZIRCON_VMO_BIT_FUCHSIA)) {
+             VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA))) {
             isSysmemBackedMemory = true;
         }
 
@@ -4943,7 +5014,7 @@
 
         if (extBufferCollectionPtr) {
             auto collection = reinterpret_cast<
-                fuchsia_sysmem::BufferCollection::SyncClient*>(
+                fidl::WireSyncClient<fuchsia_sysmem::BufferCollection>*>(
                 extBufferCollectionPtr->collection);
             uint32_t index = extBufferCollectionPtr->index;
 
@@ -4960,14 +5031,11 @@
             }
 
             if (vmo && vmo->is_valid()) {
-                auto createParams =
-                    fuchsia_hardware_goldfish::wire::CreateBuffer2Params::Builder(
-                        std::make_unique<
-                            fuchsia_hardware_goldfish::wire::CreateBuffer2Params::Frame>())
-                        .set_size(std::make_unique<uint64_t>(pCreateInfo->size))
-                        .set_memory_property(std::make_unique<uint32_t>(
-                            fuchsia_hardware_goldfish::wire::MEMORY_PROPERTY_DEVICE_LOCAL))
-                        .build();
+                fidl::FidlAllocator allocator;
+                fuchsia_hardware_goldfish::wire::CreateBuffer2Params createParams(allocator);
+                createParams.set_size(allocator, pCreateInfo->size)
+                    .set_memory_property(allocator,
+                        fuchsia_hardware_goldfish::wire::kMemoryPropertyDeviceLocal);
 
                 auto result =
                     mControlDevice->CreateBuffer2(std::move(*vmo), std::move(createParams));
@@ -5134,11 +5202,17 @@
 
 #ifdef VK_USE_PLATFORM_FUCHSIA
         bool exportEvent = exportSemaphoreInfoPtr &&
+            ((exportSemaphoreInfoPtr->handleTypes &
+             VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TEMP_ZIRCON_EVENT_BIT_FUCHSIA) ||
             (exportSemaphoreInfoPtr->handleTypes &
-             VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TEMP_ZIRCON_EVENT_BIT_FUCHSIA);
+             VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA));
 
         if (exportEvent) {
             finalCreateInfo.pNext = nullptr;
+            // If we have timeline semaphores externally, leave it there.
+            const VkSemaphoreTypeCreateInfo* typeCi =
+                vk_find_struct<VkSemaphoreTypeCreateInfo>(pCreateInfo);
+            if (typeCi) finalCreateInfo.pNext = typeCi;
         }
 #endif
 
@@ -5149,6 +5223,10 @@
 
         if (exportSyncFd) {
             finalCreateInfo.pNext = nullptr;
+            // If we have timeline semaphores externally, leave it there.
+            const VkSemaphoreTypeCreateInfo* typeCi =
+                vk_find_struct<VkSemaphoreTypeCreateInfo>(pCreateInfo);
+            if (typeCi) finalCreateInfo.pNext = typeCi;
         }
 #endif
         input_result = enc->vkCreateSemaphore(
@@ -5171,7 +5249,7 @@
 
         info.device = device;
         info.eventHandle = event_handle;
-#ifdef VK_PLATFORM_FUCHSIA
+#ifdef VK_USE_PLATFORM_FUCHSIA
         info.eventKoid = getEventKoid(info.eventHandle);
 #endif
 
@@ -6243,12 +6321,32 @@
 
 #ifdef VK_USE_PLATFORM_FUCHSIA
         if (ext_img_properties) {
-            ext_img_properties->externalMemoryProperties = {
-                .externalMemoryFeatures = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT |
-                                          VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT,
-                .exportFromImportedHandleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_TEMP_ZIRCON_VMO_BIT_FUCHSIA,
-                .compatibleHandleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_TEMP_ZIRCON_VMO_BIT_FUCHSIA,
-            };
+            const VkPhysicalDeviceExternalImageFormatInfo* ext_img_info =
+                vk_find_struct<VkPhysicalDeviceExternalImageFormatInfo>(pImageFormatInfo);
+            if (ext_img_info) {
+                switch (static_cast<uint32_t>(ext_img_info->handleType)) {
+                case VK_EXTERNAL_MEMORY_HANDLE_TYPE_TEMP_ZIRCON_VMO_BIT_FUCHSIA:
+                    ext_img_properties->externalMemoryProperties = {
+                        .externalMemoryFeatures = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT |
+                                                  VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT,
+                        .exportFromImportedHandleTypes =
+                            VK_EXTERNAL_MEMORY_HANDLE_TYPE_TEMP_ZIRCON_VMO_BIT_FUCHSIA,
+                        .compatibleHandleTypes =
+                            VK_EXTERNAL_MEMORY_HANDLE_TYPE_TEMP_ZIRCON_VMO_BIT_FUCHSIA,
+                    };
+                    break;
+                case VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA:
+                    ext_img_properties->externalMemoryProperties = {
+                        .externalMemoryFeatures = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT |
+                                                  VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT,
+                        .exportFromImportedHandleTypes =
+                            VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA,
+                        .compatibleHandleTypes =
+                            VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA,
+                    };
+                    break;
+                }
+            }
         }
 #endif
 
@@ -6300,6 +6398,16 @@
                 VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT |
                 VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT;
         }
+        if (pExternalSemaphoreInfo->handleType ==
+            static_cast<uint32_t>(VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA)) {
+            pExternalSemaphoreProperties->compatibleHandleTypes |=
+                VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA;
+            pExternalSemaphoreProperties->exportFromImportedHandleTypes |=
+                VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA;
+            pExternalSemaphoreProperties->externalSemaphoreFeatures |=
+                VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT |
+                VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT;
+        }
 #endif  // VK_USE_PLATFORM_FUCHSIA
 #ifdef VK_USE_PLATFORM_ANDROID_KHR
         if (pExternalSemaphoreInfo->handleType ==
@@ -6412,6 +6520,14 @@
         struct goldfish_VkCommandBuffer* cb = as_goldfish_VkCommandBuffer(commandBuffer);
         cb->flags = pBeginInfo->flags;
 
+        VkCommandBufferBeginInfo modifiedBeginInfo;
+
+        if (pBeginInfo->pInheritanceInfo && !cb->isSecondary) {
+            modifiedBeginInfo = *pBeginInfo;
+            modifiedBeginInfo.pInheritanceInfo = nullptr;
+            pBeginInfo = &modifiedBeginInfo;
+        }
+
         if (!supportsDeferredCommands()) {
             return enc->vkBeginCommandBuffer(commandBuffer, pBeginInfo, true /* do lock */);
         }
@@ -6573,6 +6689,27 @@
         decDescriptorSetLayoutRef(context, device, descriptorSetLayout, pAllocator);
     }
 
+    VkResult on_vkAllocateCommandBuffers(
+        void* context,
+        VkResult input_result,
+        VkDevice device,
+        const VkCommandBufferAllocateInfo* pAllocateInfo,
+        VkCommandBuffer* pCommandBuffers) {
+
+        (void)input_result;
+
+        VkEncoder* enc = (VkEncoder*)context;
+        VkResult res = enc->vkAllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers, true /* do lock */);
+        if (VK_SUCCESS != res) return res;
+
+        for (uint32_t i = 0; i < pAllocateInfo->commandBufferCount; ++i) {
+            struct goldfish_VkCommandBuffer* cb = as_goldfish_VkCommandBuffer(pCommandBuffers[i]);
+            cb->isSecondary = pAllocateInfo->level == VK_COMMAND_BUFFER_LEVEL_SECONDARY;
+        }
+
+        return res;
+    }
+
     uint32_t getApiVersionFromInstance(VkInstance instance) const {
         AutoLock lock(mLock);
         uint32_t api = kDefaultApiVersion;
@@ -6687,7 +6824,7 @@
     }
 
 private:
-    mutable Lock mLock;
+    mutable RecursiveLock mLock;
     HostVisibleMemoryVirtualizationInfo mHostVisibleMemoryVirtInfo;
     std::unique_ptr<EmulatorFeatureInfo> mFeatureInfo;
     std::unique_ptr<GoldfishAddressSpaceBlockProvider> mGoldfishAddressSpaceBlockProvider;
@@ -6702,9 +6839,9 @@
 
 #ifdef VK_USE_PLATFORM_FUCHSIA
     std::unique_ptr<
-        fuchsia_hardware_goldfish::ControlDevice::SyncClient>
+        fidl::WireSyncClient<fuchsia_hardware_goldfish::ControlDevice>>
         mControlDevice;
-    std::unique_ptr<fuchsia_sysmem::Allocator::SyncClient>
+    std::unique_ptr<fidl::WireSyncClient<fuchsia_sysmem::Allocator>>
         mSysmemAllocator;
 #endif
 
@@ -6942,6 +7079,22 @@
         context, physicalDevice, pMemoryProperties);
 }
 
+void ResourceTracker::on_vkGetDeviceQueue(void* context,
+                                          VkDevice device,
+                                          uint32_t queueFamilyIndex,
+                                          uint32_t queueIndex,
+                                          VkQueue* pQueue) {
+    mImpl->on_vkGetDeviceQueue(context, device, queueFamilyIndex, queueIndex,
+                               pQueue);
+}
+
+void ResourceTracker::on_vkGetDeviceQueue2(void* context,
+                                           VkDevice device,
+                                           const VkDeviceQueueInfo2* pQueueInfo,
+                                           VkQueue* pQueue) {
+    mImpl->on_vkGetDeviceQueue2(context, device, pQueueInfo, pQueue);
+}
+
 VkResult ResourceTracker::on_vkCreateInstance(
     void* context,
     VkResult input_result,
@@ -7689,6 +7842,15 @@
     mImpl->on_vkDestroyDescriptorSetLayout(context, device, descriptorSetLayout, pAllocator);
 }
 
+VkResult ResourceTracker::on_vkAllocateCommandBuffers(
+    void* context,
+    VkResult input_result,
+    VkDevice device,
+    const VkCommandBufferAllocateInfo* pAllocateInfo,
+    VkCommandBuffer* pCommandBuffers) {
+    return mImpl->on_vkAllocateCommandBuffers(context, input_result, device, pAllocateInfo, pCommandBuffers);
+}
+
 void ResourceTracker::deviceMemoryTransform_tohost(
     VkDeviceMemory* memory, uint32_t memoryCount,
     VkDeviceSize* offset, uint32_t offsetCount,
diff --git a/system/vulkan_enc/ResourceTracker.h b/system/vulkan_enc/ResourceTracker.h
index cd5aa13..86e4dde 100644
--- a/system/vulkan_enc/ResourceTracker.h
+++ b/system/vulkan_enc/ResourceTracker.h
@@ -107,6 +107,15 @@
         void* context,
         VkPhysicalDevice physicalDevice,
         VkPhysicalDeviceMemoryProperties2* pMemoryProperties);
+    void on_vkGetDeviceQueue(void* context,
+                             VkDevice device,
+                             uint32_t queueFamilyIndex,
+                             uint32_t queueIndex,
+                             VkQueue* pQueue);
+    void on_vkGetDeviceQueue2(void* context,
+                              VkDevice device,
+                              const VkDeviceQueueInfo2* pQueueInfo,
+                              VkQueue* pQueue);
 
     VkResult on_vkCreateInstance(
         void* context,
@@ -559,6 +568,13 @@
         VkDescriptorSetLayout descriptorSetLayout,
         const VkAllocationCallbacks* pAllocator);
 
+    VkResult on_vkAllocateCommandBuffers(
+        void* context,
+        VkResult input_result,
+        VkDevice device,
+        const VkCommandBufferAllocateInfo* pAllocateInfo,
+        VkCommandBuffer* pCommandBuffers);
+
     bool isMemoryTypeHostVisible(VkDevice device, uint32_t typeIndex) const;
     uint8_t* getMappedPointer(VkDeviceMemory memory);
     VkDeviceSize getMappedSize(VkDeviceMemory memory);
diff --git a/system/vulkan_enc/Resources.h b/system/vulkan_enc/Resources.h
index 74f41ee..67c498e 100644
--- a/system/vulkan_enc/Resources.h
+++ b/system/vulkan_enc/Resources.h
@@ -83,7 +83,7 @@
 #define GOLDFISH_VK_GET_HOST_U64_DECL(type) \
     uint64_t get_host_u64_##type(type);
 
-GOLDFISH_VK_LIST_DISPATCHABLE_HANDLE_TYPES(GOLDFISH_VK_DEFINE_DISPATCHABLE_HANDLE_STRUCT)
+GOLDFISH_VK_LIST_AUTODEFINED_STRUCT_DISPATCHABLE_HANDLE_TYPES(GOLDFISH_VK_DEFINE_DISPATCHABLE_HANDLE_STRUCT)
 GOLDFISH_VK_LIST_DISPATCHABLE_HANDLE_TYPES(GOLDFISH_VK_NEW_FROM_HOST_DECL)
 GOLDFISH_VK_LIST_DISPATCHABLE_HANDLE_TYPES(GOLDFISH_VK_AS_GOLDFISH_DECL)
 GOLDFISH_VK_LIST_DISPATCHABLE_HANDLE_TYPES(GOLDFISH_VK_GET_HOST_DECL)
@@ -116,6 +116,21 @@
     goldfish_vk::DescriptorSetLayoutInfo* layoutInfo;
 };
 
+struct goldfish_VkCommandBuffer {
+    hwvulkan_dispatch_t dispatch;
+    uint64_t underlying;
+    goldfish_vk::VkEncoder* lastUsedEncoder;
+    uint32_t sequenceNumber;
+    goldfish_vk::VkEncoder* privateEncoder;
+    IOStream* privateStream;
+    uint32_t flags;
+    struct goldfish_vk_object_list* poolObjects;
+    struct goldfish_vk_object_list* subObjects;
+    struct goldfish_vk_object_list* superObjects;
+    void* userPtr;
+    bool isSecondary;
+};
+
 } // extern "C"
 
 namespace goldfish_vk {
diff --git a/system/vulkan_enc/VkEncoder.cpp b/system/vulkan_enc/VkEncoder.cpp
index 9767c6c..5660460 100644
--- a/system/vulkan_enc/VkEncoder.cpp
+++ b/system/vulkan_enc/VkEncoder.cpp
@@ -89,13 +89,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkInstanceCreateInfo*)pool->alloc(sizeof(const VkInstanceCreateInfo));
-        deepcopy_VkInstanceCreateInfo(pool, pCreateInfo, (VkInstanceCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkInstanceCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkInstanceCreateInfo*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -109,12 +109,12 @@
     size_t count = 0;
     size_t* countPtr = &count;
     {
-        count_VkInstanceCreateInfo(sFeatureBits, (VkInstanceCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkInstanceCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkInstanceCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_0;
         *countPtr += 8;
@@ -127,7 +127,7 @@
     memcpy(streamPtr, &opcode_vkCreateInstance, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
     memcpy(streamPtr, &packetSize_vkCreateInstance, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
     if (queueSubmitWithCommandsEnabled) { memcpy(streamPtr, &seqno, sizeof(uint32_t)); streamPtr += sizeof(uint32_t); }
-    reservedmarshal_VkInstanceCreateInfo(stream, (VkInstanceCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkInstanceCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkInstanceCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_0, 8);
@@ -135,7 +135,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_1;
@@ -178,7 +178,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -194,7 +194,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyInstance = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -216,7 +216,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkInstance((VkInstance*)&instance);
     stream->flush();
@@ -367,7 +367,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPhysicalDeviceFeatures(sFeatureBits, (VkPhysicalDeviceFeatures*)(pFeatures), countPtr);
+        count_VkPhysicalDeviceFeatures(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceFeatures*)(pFeatures), countPtr);
     }
     uint32_t packetSize_vkGetPhysicalDeviceFeatures = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceFeatures);
@@ -381,8 +381,8 @@
     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPhysicalDeviceFeatures(stream, (VkPhysicalDeviceFeatures*)(pFeatures), streamPtrPtr);
-    unmarshal_VkPhysicalDeviceFeatures(stream, (VkPhysicalDeviceFeatures*)(pFeatures));
+    reservedmarshal_VkPhysicalDeviceFeatures(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceFeatures*)(pFeatures), streamPtrPtr);
+    unmarshal_VkPhysicalDeviceFeatures(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceFeatures*)(pFeatures));
     if (pFeatures)
     {
         transform_fromhost_VkPhysicalDeviceFeatures(sResourceTracker, (VkPhysicalDeviceFeatures*)(pFeatures));
@@ -417,7 +417,7 @@
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
         *countPtr += sizeof(VkFormat);
-        count_VkFormatProperties(sFeatureBits, (VkFormatProperties*)(pFormatProperties), countPtr);
+        count_VkFormatProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFormatProperties*)(pFormatProperties), countPtr);
     }
     uint32_t packetSize_vkGetPhysicalDeviceFormatProperties = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceFormatProperties);
@@ -433,8 +433,8 @@
     *streamPtrPtr += 1 * 8;
     memcpy(*streamPtrPtr, (VkFormat*)&local_format, sizeof(VkFormat));
     *streamPtrPtr += sizeof(VkFormat);
-    reservedmarshal_VkFormatProperties(stream, (VkFormatProperties*)(pFormatProperties), streamPtrPtr);
-    unmarshal_VkFormatProperties(stream, (VkFormatProperties*)(pFormatProperties));
+    reservedmarshal_VkFormatProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFormatProperties*)(pFormatProperties), streamPtrPtr);
+    unmarshal_VkFormatProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFormatProperties*)(pFormatProperties));
     if (pFormatProperties)
     {
         transform_fromhost_VkFormatProperties(sResourceTracker, (VkFormatProperties*)(pFormatProperties));
@@ -485,7 +485,7 @@
         *countPtr += sizeof(VkImageTiling);
         *countPtr += sizeof(VkImageUsageFlags);
         *countPtr += sizeof(VkImageCreateFlags);
-        count_VkImageFormatProperties(sFeatureBits, (VkImageFormatProperties*)(pImageFormatProperties), countPtr);
+        count_VkImageFormatProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageFormatProperties*)(pImageFormatProperties), countPtr);
     }
     uint32_t packetSize_vkGetPhysicalDeviceImageFormatProperties = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceImageFormatProperties);
@@ -509,8 +509,8 @@
     *streamPtrPtr += sizeof(VkImageUsageFlags);
     memcpy(*streamPtrPtr, (VkImageCreateFlags*)&local_flags, sizeof(VkImageCreateFlags));
     *streamPtrPtr += sizeof(VkImageCreateFlags);
-    reservedmarshal_VkImageFormatProperties(stream, (VkImageFormatProperties*)(pImageFormatProperties), streamPtrPtr);
-    unmarshal_VkImageFormatProperties(stream, (VkImageFormatProperties*)(pImageFormatProperties));
+    reservedmarshal_VkImageFormatProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageFormatProperties*)(pImageFormatProperties), streamPtrPtr);
+    unmarshal_VkImageFormatProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageFormatProperties*)(pImageFormatProperties));
     if (pImageFormatProperties)
     {
         transform_fromhost_VkImageFormatProperties(sResourceTracker, (VkImageFormatProperties*)(pImageFormatProperties));
@@ -544,7 +544,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPhysicalDeviceProperties(sFeatureBits, (VkPhysicalDeviceProperties*)(pProperties), countPtr);
+        count_VkPhysicalDeviceProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceProperties*)(pProperties), countPtr);
     }
     uint32_t packetSize_vkGetPhysicalDeviceProperties = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceProperties);
@@ -558,8 +558,8 @@
     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPhysicalDeviceProperties(stream, (VkPhysicalDeviceProperties*)(pProperties), streamPtrPtr);
-    unmarshal_VkPhysicalDeviceProperties(stream, (VkPhysicalDeviceProperties*)(pProperties));
+    reservedmarshal_VkPhysicalDeviceProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceProperties*)(pProperties), streamPtrPtr);
+    unmarshal_VkPhysicalDeviceProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceProperties*)(pProperties));
     if (pProperties)
     {
         transform_fromhost_VkPhysicalDeviceProperties(sResourceTracker, (VkPhysicalDeviceProperties*)(pProperties));
@@ -606,7 +606,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
                 {
-                    count_VkQueueFamilyProperties(sFeatureBits, (VkQueueFamilyProperties*)(pQueueFamilyProperties + i), countPtr);
+                    count_VkQueueFamilyProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkQueueFamilyProperties*)(pQueueFamilyProperties + i), countPtr);
                 }
             }
         }
@@ -642,7 +642,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
         {
-            reservedmarshal_VkQueueFamilyProperties(stream, (VkQueueFamilyProperties*)(pQueueFamilyProperties + i), streamPtrPtr);
+            reservedmarshal_VkQueueFamilyProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkQueueFamilyProperties*)(pQueueFamilyProperties + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -669,7 +669,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
             {
-                unmarshal_VkQueueFamilyProperties(stream, (VkQueueFamilyProperties*)(pQueueFamilyProperties + i));
+                unmarshal_VkQueueFamilyProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkQueueFamilyProperties*)(pQueueFamilyProperties + i));
             }
         }
     }
@@ -709,7 +709,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPhysicalDeviceMemoryProperties(sFeatureBits, (VkPhysicalDeviceMemoryProperties*)(pMemoryProperties), countPtr);
+        count_VkPhysicalDeviceMemoryProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceMemoryProperties*)(pMemoryProperties), countPtr);
     }
     uint32_t packetSize_vkGetPhysicalDeviceMemoryProperties = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceMemoryProperties);
@@ -723,8 +723,8 @@
     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPhysicalDeviceMemoryProperties(stream, (VkPhysicalDeviceMemoryProperties*)(pMemoryProperties), streamPtrPtr);
-    unmarshal_VkPhysicalDeviceMemoryProperties(stream, (VkPhysicalDeviceMemoryProperties*)(pMemoryProperties));
+    reservedmarshal_VkPhysicalDeviceMemoryProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceMemoryProperties*)(pMemoryProperties), streamPtrPtr);
+    unmarshal_VkPhysicalDeviceMemoryProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceMemoryProperties*)(pMemoryProperties));
     if (pMemoryProperties)
     {
         transform_fromhost_VkPhysicalDeviceMemoryProperties(sResourceTracker, (VkPhysicalDeviceMemoryProperties*)(pMemoryProperties));
@@ -867,13 +867,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkDeviceCreateInfo*)pool->alloc(sizeof(const VkDeviceCreateInfo));
-        deepcopy_VkDeviceCreateInfo(pool, pCreateInfo, (VkDeviceCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkDeviceCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkDeviceCreateInfo*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -889,12 +889,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDeviceCreateInfo(sFeatureBits, (VkDeviceCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkDeviceCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -911,7 +911,7 @@
     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDeviceCreateInfo(stream, (VkDeviceCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkDeviceCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -919,7 +919,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -963,7 +963,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -979,7 +979,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyDevice = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -1001,7 +1001,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkDevice((VkDevice*)&device);
     stream->flush();
@@ -1058,7 +1058,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
                 {
-                    count_VkExtensionProperties(sFeatureBits, (VkExtensionProperties*)(pProperties + i), countPtr);
+                    count_VkExtensionProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtensionProperties*)(pProperties + i), countPtr);
                 }
             }
         }
@@ -1120,7 +1120,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            reservedmarshal_VkExtensionProperties(stream, (VkExtensionProperties*)(pProperties + i), streamPtrPtr);
+            reservedmarshal_VkExtensionProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtensionProperties*)(pProperties + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -1147,7 +1147,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                unmarshal_VkExtensionProperties(stream, (VkExtensionProperties*)(pProperties + i));
+                unmarshal_VkExtensionProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtensionProperties*)(pProperties + i));
             }
         }
     }
@@ -1222,7 +1222,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
                 {
-                    count_VkExtensionProperties(sFeatureBits, (VkExtensionProperties*)(pProperties + i), countPtr);
+                    count_VkExtensionProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtensionProperties*)(pProperties + i), countPtr);
                 }
             }
         }
@@ -1288,7 +1288,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            reservedmarshal_VkExtensionProperties(stream, (VkExtensionProperties*)(pProperties + i), streamPtrPtr);
+            reservedmarshal_VkExtensionProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtensionProperties*)(pProperties + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -1315,7 +1315,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                unmarshal_VkExtensionProperties(stream, (VkExtensionProperties*)(pProperties + i));
+                unmarshal_VkExtensionProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtensionProperties*)(pProperties + i));
             }
         }
     }
@@ -1368,7 +1368,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
                 {
-                    count_VkLayerProperties(sFeatureBits, (VkLayerProperties*)(pProperties + i), countPtr);
+                    count_VkLayerProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkLayerProperties*)(pProperties + i), countPtr);
                 }
             }
         }
@@ -1400,7 +1400,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            reservedmarshal_VkLayerProperties(stream, (VkLayerProperties*)(pProperties + i), streamPtrPtr);
+            reservedmarshal_VkLayerProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkLayerProperties*)(pProperties + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -1427,7 +1427,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                unmarshal_VkLayerProperties(stream, (VkLayerProperties*)(pProperties + i));
+                unmarshal_VkLayerProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkLayerProperties*)(pProperties + i));
             }
         }
     }
@@ -1485,7 +1485,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
                 {
-                    count_VkLayerProperties(sFeatureBits, (VkLayerProperties*)(pProperties + i), countPtr);
+                    count_VkLayerProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkLayerProperties*)(pProperties + i), countPtr);
                 }
             }
         }
@@ -1521,7 +1521,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            reservedmarshal_VkLayerProperties(stream, (VkLayerProperties*)(pProperties + i), streamPtrPtr);
+            reservedmarshal_VkLayerProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkLayerProperties*)(pProperties + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -1548,7 +1548,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                unmarshal_VkLayerProperties(stream, (VkLayerProperties*)(pProperties + i));
+                unmarshal_VkLayerProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkLayerProperties*)(pProperties + i));
             }
         }
     }
@@ -1629,6 +1629,8 @@
     stream->read((uint64_t*)&cgen_var_2, 8);
     stream->handleMapping()->mapHandles_u64_VkQueue(&cgen_var_2, (VkQueue*)pQueue, 1);
     stream->unsetHandleMapping();
+    sResourceTracker->on_vkGetDeviceQueue(this, device, queueFamilyIndex,
+                                          queueIndex, pQueue);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -1662,7 +1664,7 @@
         local_pSubmits = (VkSubmitInfo*)pool->alloc(((submitCount)) * sizeof(const VkSubmitInfo));
         for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i)
         {
-            deepcopy_VkSubmitInfo(pool, pSubmits + i, (VkSubmitInfo*)(local_pSubmits + i));
+            deepcopy_VkSubmitInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubmits + i, (VkSubmitInfo*)(local_pSubmits + i));
         }
     }
     local_fence = fence;
@@ -1681,7 +1683,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i)
         {
-            count_VkSubmitInfo(sFeatureBits, (VkSubmitInfo*)(local_pSubmits + i), countPtr);
+            count_VkSubmitInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubmitInfo*)(local_pSubmits + i), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 1 * 8;
@@ -1702,7 +1704,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i)
     {
-        reservedmarshal_VkSubmitInfo(stream, (VkSubmitInfo*)(local_pSubmits + i), streamPtrPtr);
+        reservedmarshal_VkSubmitInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubmitInfo*)(local_pSubmits + i), streamPtrPtr);
     }
     uint64_t cgen_var_1;
     *&cgen_var_1 = get_host_u64_VkFence((*&local_fence));
@@ -1822,13 +1824,13 @@
     if (pAllocateInfo)
     {
         local_pAllocateInfo = (VkMemoryAllocateInfo*)pool->alloc(sizeof(const VkMemoryAllocateInfo));
-        deepcopy_VkMemoryAllocateInfo(pool, pAllocateInfo, (VkMemoryAllocateInfo*)(local_pAllocateInfo));
+        deepcopy_VkMemoryAllocateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocateInfo, (VkMemoryAllocateInfo*)(local_pAllocateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocateInfo)
@@ -1844,12 +1846,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkMemoryAllocateInfo(sFeatureBits, (VkMemoryAllocateInfo*)(local_pAllocateInfo), countPtr);
+        count_VkMemoryAllocateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryAllocateInfo*)(local_pAllocateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -1866,7 +1868,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkMemoryAllocateInfo(stream, (VkMemoryAllocateInfo*)(local_pAllocateInfo), streamPtrPtr);
+    reservedmarshal_VkMemoryAllocateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryAllocateInfo*)(local_pAllocateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -1874,7 +1876,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -1919,7 +1921,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     sResourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)&local_memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
@@ -1934,7 +1936,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkFreeMemory = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -1960,7 +1962,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkDeviceMemory((VkDeviceMemory*)&memory);
     stream->flush();
@@ -2020,7 +2022,7 @@
         local_pMemoryRanges = (VkMappedMemoryRange*)pool->alloc(((memoryRangeCount)) * sizeof(const VkMappedMemoryRange));
         for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i)
         {
-            deepcopy_VkMappedMemoryRange(pool, pMemoryRanges + i, (VkMappedMemoryRange*)(local_pMemoryRanges + i));
+            deepcopy_VkMappedMemoryRange(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pMemoryRanges + i, (VkMappedMemoryRange*)(local_pMemoryRanges + i));
         }
     }
     if (local_pMemoryRanges)
@@ -2038,7 +2040,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i)
         {
-            count_VkMappedMemoryRange(sFeatureBits, (VkMappedMemoryRange*)(local_pMemoryRanges + i), countPtr);
+            count_VkMappedMemoryRange(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMappedMemoryRange*)(local_pMemoryRanges + i), countPtr);
         }
     }
     uint32_t packetSize_vkFlushMappedMemoryRanges = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -2057,7 +2059,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i)
     {
-        reservedmarshal_VkMappedMemoryRange(stream, (VkMappedMemoryRange*)(local_pMemoryRanges + i), streamPtrPtr);
+        reservedmarshal_VkMappedMemoryRange(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMappedMemoryRange*)(local_pMemoryRanges + i), streamPtrPtr);
     }
     if (!sResourceTracker->usingDirectMapping())
     {
@@ -2113,7 +2115,7 @@
         local_pMemoryRanges = (VkMappedMemoryRange*)pool->alloc(((memoryRangeCount)) * sizeof(const VkMappedMemoryRange));
         for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i)
         {
-            deepcopy_VkMappedMemoryRange(pool, pMemoryRanges + i, (VkMappedMemoryRange*)(local_pMemoryRanges + i));
+            deepcopy_VkMappedMemoryRange(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pMemoryRanges + i, (VkMappedMemoryRange*)(local_pMemoryRanges + i));
         }
     }
     if (local_pMemoryRanges)
@@ -2131,7 +2133,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i)
         {
-            count_VkMappedMemoryRange(sFeatureBits, (VkMappedMemoryRange*)(local_pMemoryRanges + i), countPtr);
+            count_VkMappedMemoryRange(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMappedMemoryRange*)(local_pMemoryRanges + i), countPtr);
         }
     }
     uint32_t packetSize_vkInvalidateMappedMemoryRanges = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -2150,7 +2152,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i)
     {
-        reservedmarshal_VkMappedMemoryRange(stream, (VkMappedMemoryRange*)(local_pMemoryRanges + i), streamPtrPtr);
+        reservedmarshal_VkMappedMemoryRange(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMappedMemoryRange*)(local_pMemoryRanges + i), streamPtrPtr);
     }
     VkResult vkInvalidateMappedMemoryRanges_VkResult_return = (VkResult)0;
     stream->read(&vkInvalidateMappedMemoryRanges_VkResult_return, sizeof(VkResult));
@@ -2390,7 +2392,7 @@
         *countPtr += 1 * 8;
         uint64_t cgen_var_1;
         *countPtr += 1 * 8;
-        count_VkMemoryRequirements(sFeatureBits, (VkMemoryRequirements*)(pMemoryRequirements), countPtr);
+        count_VkMemoryRequirements(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements*)(pMemoryRequirements), countPtr);
     }
     uint32_t packetSize_vkGetBufferMemoryRequirements = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetBufferMemoryRequirements);
@@ -2408,8 +2410,8 @@
     *&cgen_var_1 = get_host_u64_VkBuffer((*&local_buffer));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkMemoryRequirements(stream, (VkMemoryRequirements*)(pMemoryRequirements), streamPtrPtr);
-    unmarshal_VkMemoryRequirements(stream, (VkMemoryRequirements*)(pMemoryRequirements));
+    reservedmarshal_VkMemoryRequirements(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements*)(pMemoryRequirements), streamPtrPtr);
+    unmarshal_VkMemoryRequirements(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements*)(pMemoryRequirements));
     if (pMemoryRequirements)
     {
         transform_fromhost_VkMemoryRequirements(sResourceTracker, (VkMemoryRequirements*)(pMemoryRequirements));
@@ -2445,7 +2447,7 @@
         *countPtr += 1 * 8;
         uint64_t cgen_var_1;
         *countPtr += 1 * 8;
-        count_VkMemoryRequirements(sFeatureBits, (VkMemoryRequirements*)(pMemoryRequirements), countPtr);
+        count_VkMemoryRequirements(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements*)(pMemoryRequirements), countPtr);
     }
     uint32_t packetSize_vkGetImageMemoryRequirements = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetImageMemoryRequirements);
@@ -2463,8 +2465,8 @@
     *&cgen_var_1 = get_host_u64_VkImage((*&local_image));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkMemoryRequirements(stream, (VkMemoryRequirements*)(pMemoryRequirements), streamPtrPtr);
-    unmarshal_VkMemoryRequirements(stream, (VkMemoryRequirements*)(pMemoryRequirements));
+    reservedmarshal_VkMemoryRequirements(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements*)(pMemoryRequirements), streamPtrPtr);
+    unmarshal_VkMemoryRequirements(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements*)(pMemoryRequirements));
     if (pMemoryRequirements)
     {
         transform_fromhost_VkMemoryRequirements(sResourceTracker, (VkMemoryRequirements*)(pMemoryRequirements));
@@ -2515,7 +2517,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
                 {
-                    count_VkSparseImageMemoryRequirements(sFeatureBits, (VkSparseImageMemoryRequirements*)(pSparseMemoryRequirements + i), countPtr);
+                    count_VkSparseImageMemoryRequirements(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageMemoryRequirements*)(pSparseMemoryRequirements + i), countPtr);
                 }
             }
         }
@@ -2555,7 +2557,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
         {
-            reservedmarshal_VkSparseImageMemoryRequirements(stream, (VkSparseImageMemoryRequirements*)(pSparseMemoryRequirements + i), streamPtrPtr);
+            reservedmarshal_VkSparseImageMemoryRequirements(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageMemoryRequirements*)(pSparseMemoryRequirements + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -2582,7 +2584,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
             {
-                unmarshal_VkSparseImageMemoryRequirements(stream, (VkSparseImageMemoryRequirements*)(pSparseMemoryRequirements + i));
+                unmarshal_VkSparseImageMemoryRequirements(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageMemoryRequirements*)(pSparseMemoryRequirements + i));
             }
         }
     }
@@ -2657,7 +2659,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
                 {
-                    count_VkSparseImageFormatProperties(sFeatureBits, (VkSparseImageFormatProperties*)(pProperties + i), countPtr);
+                    count_VkSparseImageFormatProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageFormatProperties*)(pProperties + i), countPtr);
                 }
             }
         }
@@ -2703,7 +2705,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            reservedmarshal_VkSparseImageFormatProperties(stream, (VkSparseImageFormatProperties*)(pProperties + i), streamPtrPtr);
+            reservedmarshal_VkSparseImageFormatProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageFormatProperties*)(pProperties + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -2730,7 +2732,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                unmarshal_VkSparseImageFormatProperties(stream, (VkSparseImageFormatProperties*)(pProperties + i));
+                unmarshal_VkSparseImageFormatProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageFormatProperties*)(pProperties + i));
             }
         }
     }
@@ -2777,7 +2779,7 @@
         local_pBindInfo = (VkBindSparseInfo*)pool->alloc(((bindInfoCount)) * sizeof(const VkBindSparseInfo));
         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
         {
-            deepcopy_VkBindSparseInfo(pool, pBindInfo + i, (VkBindSparseInfo*)(local_pBindInfo + i));
+            deepcopy_VkBindSparseInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBindInfo + i, (VkBindSparseInfo*)(local_pBindInfo + i));
         }
     }
     local_fence = fence;
@@ -2796,7 +2798,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
         {
-            count_VkBindSparseInfo(sFeatureBits, (VkBindSparseInfo*)(local_pBindInfo + i), countPtr);
+            count_VkBindSparseInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBindSparseInfo*)(local_pBindInfo + i), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 1 * 8;
@@ -2817,7 +2819,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
     {
-        reservedmarshal_VkBindSparseInfo(stream, (VkBindSparseInfo*)(local_pBindInfo + i), streamPtrPtr);
+        reservedmarshal_VkBindSparseInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBindSparseInfo*)(local_pBindInfo + i), streamPtrPtr);
     }
     uint64_t cgen_var_1;
     *&cgen_var_1 = get_host_u64_VkFence((*&local_fence));
@@ -2855,13 +2857,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkFenceCreateInfo*)pool->alloc(sizeof(const VkFenceCreateInfo));
-        deepcopy_VkFenceCreateInfo(pool, pCreateInfo, (VkFenceCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkFenceCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkFenceCreateInfo*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -2877,12 +2879,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkFenceCreateInfo(sFeatureBits, (VkFenceCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkFenceCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFenceCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -2899,7 +2901,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkFenceCreateInfo(stream, (VkFenceCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkFenceCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFenceCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -2907,7 +2909,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -2952,7 +2954,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -2970,7 +2972,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyFence = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -2996,7 +2998,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkFence((VkFence*)&fence);
     stream->flush();
@@ -3221,13 +3223,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkSemaphoreCreateInfo*)pool->alloc(sizeof(const VkSemaphoreCreateInfo));
-        deepcopy_VkSemaphoreCreateInfo(pool, pCreateInfo, (VkSemaphoreCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkSemaphoreCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkSemaphoreCreateInfo*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -3243,12 +3245,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkSemaphoreCreateInfo(sFeatureBits, (VkSemaphoreCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkSemaphoreCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSemaphoreCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -3265,7 +3267,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkSemaphoreCreateInfo(stream, (VkSemaphoreCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkSemaphoreCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSemaphoreCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -3273,7 +3275,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -3318,7 +3320,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -3336,7 +3338,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroySemaphore = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -3362,7 +3364,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkSemaphore((VkSemaphore*)&semaphore);
     stream->flush();
@@ -3395,13 +3397,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkEventCreateInfo*)pool->alloc(sizeof(const VkEventCreateInfo));
-        deepcopy_VkEventCreateInfo(pool, pCreateInfo, (VkEventCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkEventCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkEventCreateInfo*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -3417,12 +3419,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkEventCreateInfo(sFeatureBits, (VkEventCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkEventCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkEventCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -3439,7 +3441,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkEventCreateInfo(stream, (VkEventCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkEventCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkEventCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -3447,7 +3449,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -3492,7 +3494,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -3510,7 +3512,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyEvent = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -3536,7 +3538,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkEvent((VkEvent*)&event);
     stream->flush();
@@ -3719,13 +3721,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkQueryPoolCreateInfo*)pool->alloc(sizeof(const VkQueryPoolCreateInfo));
-        deepcopy_VkQueryPoolCreateInfo(pool, pCreateInfo, (VkQueryPoolCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkQueryPoolCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkQueryPoolCreateInfo*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -3741,12 +3743,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkQueryPoolCreateInfo(sFeatureBits, (VkQueryPoolCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkQueryPoolCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkQueryPoolCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -3763,7 +3765,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkQueryPoolCreateInfo(stream, (VkQueryPoolCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkQueryPoolCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkQueryPoolCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -3771,7 +3773,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -3816,7 +3818,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -3834,7 +3836,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyQueryPool = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -3860,7 +3862,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkQueryPool((VkQueryPool*)&queryPool);
     stream->flush();
@@ -3980,13 +3982,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkBufferCreateInfo*)pool->alloc(sizeof(const VkBufferCreateInfo));
-        deepcopy_VkBufferCreateInfo(pool, pCreateInfo, (VkBufferCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkBufferCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkBufferCreateInfo*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -4002,12 +4004,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkBufferCreateInfo(sFeatureBits, (VkBufferCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkBufferCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -4024,7 +4026,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkBufferCreateInfo(stream, (VkBufferCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkBufferCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -4032,7 +4034,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -4077,7 +4079,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -4095,7 +4097,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyBuffer = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -4121,7 +4123,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkBuffer((VkBuffer*)&buffer);
     stream->flush();
@@ -4154,13 +4156,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkBufferViewCreateInfo*)pool->alloc(sizeof(const VkBufferViewCreateInfo));
-        deepcopy_VkBufferViewCreateInfo(pool, pCreateInfo, (VkBufferViewCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkBufferViewCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkBufferViewCreateInfo*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -4176,12 +4178,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkBufferViewCreateInfo(sFeatureBits, (VkBufferViewCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkBufferViewCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferViewCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -4198,7 +4200,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkBufferViewCreateInfo(stream, (VkBufferViewCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkBufferViewCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferViewCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -4206,7 +4208,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -4251,7 +4253,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -4269,7 +4271,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyBufferView = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -4295,7 +4297,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkBufferView((VkBufferView*)&bufferView);
     stream->flush();
@@ -4328,13 +4330,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkImageCreateInfo*)pool->alloc(sizeof(const VkImageCreateInfo));
-        deepcopy_VkImageCreateInfo(pool, pCreateInfo, (VkImageCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkImageCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkImageCreateInfo*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     sResourceTracker->unwrap_VkNativeBufferANDROID(pCreateInfo, local_pCreateInfo);
     local_pAllocator = nullptr;
@@ -4351,12 +4353,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkImageCreateInfo(sFeatureBits, (VkImageCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkImageCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -4373,7 +4375,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkImageCreateInfo(stream, (VkImageCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkImageCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -4381,7 +4383,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -4426,7 +4428,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -4444,7 +4446,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyImage = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -4470,7 +4472,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkImage((VkImage*)&image);
     stream->flush();
@@ -4504,7 +4506,7 @@
     if (pSubresource)
     {
         local_pSubresource = (VkImageSubresource*)pool->alloc(sizeof(const VkImageSubresource));
-        deepcopy_VkImageSubresource(pool, pSubresource, (VkImageSubresource*)(local_pSubresource));
+        deepcopy_VkImageSubresource(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubresource, (VkImageSubresource*)(local_pSubresource));
     }
     if (local_pSubresource)
     {
@@ -4517,8 +4519,8 @@
         *countPtr += 1 * 8;
         uint64_t cgen_var_1;
         *countPtr += 1 * 8;
-        count_VkImageSubresource(sFeatureBits, (VkImageSubresource*)(local_pSubresource), countPtr);
-        count_VkSubresourceLayout(sFeatureBits, (VkSubresourceLayout*)(pLayout), countPtr);
+        count_VkImageSubresource(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageSubresource*)(local_pSubresource), countPtr);
+        count_VkSubresourceLayout(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubresourceLayout*)(pLayout), countPtr);
     }
     uint32_t packetSize_vkGetImageSubresourceLayout = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetImageSubresourceLayout);
@@ -4536,9 +4538,9 @@
     *&cgen_var_1 = get_host_u64_VkImage((*&local_image));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkImageSubresource(stream, (VkImageSubresource*)(local_pSubresource), streamPtrPtr);
-    reservedmarshal_VkSubresourceLayout(stream, (VkSubresourceLayout*)(pLayout), streamPtrPtr);
-    unmarshal_VkSubresourceLayout(stream, (VkSubresourceLayout*)(pLayout));
+    reservedmarshal_VkImageSubresource(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageSubresource*)(local_pSubresource), streamPtrPtr);
+    reservedmarshal_VkSubresourceLayout(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubresourceLayout*)(pLayout), streamPtrPtr);
+    unmarshal_VkSubresourceLayout(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubresourceLayout*)(pLayout));
     if (pLayout)
     {
         transform_fromhost_VkSubresourceLayout(sResourceTracker, (VkSubresourceLayout*)(pLayout));
@@ -4572,13 +4574,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkImageViewCreateInfo*)pool->alloc(sizeof(const VkImageViewCreateInfo));
-        deepcopy_VkImageViewCreateInfo(pool, pCreateInfo, (VkImageViewCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkImageViewCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkImageViewCreateInfo*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -4594,12 +4596,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkImageViewCreateInfo(sFeatureBits, (VkImageViewCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkImageViewCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageViewCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -4616,7 +4618,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkImageViewCreateInfo(stream, (VkImageViewCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkImageViewCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageViewCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -4624,7 +4626,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -4669,7 +4671,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -4687,7 +4689,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyImageView = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -4713,7 +4715,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkImageView((VkImageView*)&imageView);
     stream->flush();
@@ -4746,13 +4748,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkShaderModuleCreateInfo*)pool->alloc(sizeof(const VkShaderModuleCreateInfo));
-        deepcopy_VkShaderModuleCreateInfo(pool, pCreateInfo, (VkShaderModuleCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkShaderModuleCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkShaderModuleCreateInfo*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -4768,12 +4770,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkShaderModuleCreateInfo(sFeatureBits, (VkShaderModuleCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkShaderModuleCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkShaderModuleCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -4790,7 +4792,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkShaderModuleCreateInfo(stream, (VkShaderModuleCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkShaderModuleCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkShaderModuleCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -4798,7 +4800,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -4843,7 +4845,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -4861,7 +4863,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyShaderModule = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -4887,7 +4889,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkShaderModule((VkShaderModule*)&shaderModule);
     stream->flush();
@@ -4920,13 +4922,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkPipelineCacheCreateInfo*)pool->alloc(sizeof(const VkPipelineCacheCreateInfo));
-        deepcopy_VkPipelineCacheCreateInfo(pool, pCreateInfo, (VkPipelineCacheCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkPipelineCacheCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkPipelineCacheCreateInfo*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -4942,12 +4944,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPipelineCacheCreateInfo(sFeatureBits, (VkPipelineCacheCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkPipelineCacheCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineCacheCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -4964,7 +4966,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPipelineCacheCreateInfo(stream, (VkPipelineCacheCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkPipelineCacheCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineCacheCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -4972,7 +4974,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -5017,7 +5019,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -5035,7 +5037,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyPipelineCache = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -5061,7 +5063,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkPipelineCache((VkPipelineCache*)&pipelineCache);
     stream->flush();
@@ -5287,14 +5289,14 @@
         local_pCreateInfos = (VkGraphicsPipelineCreateInfo*)pool->alloc(((createInfoCount)) * sizeof(const VkGraphicsPipelineCreateInfo));
         for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i)
         {
-            deepcopy_VkGraphicsPipelineCreateInfo(pool, pCreateInfos + i, (VkGraphicsPipelineCreateInfo*)(local_pCreateInfos + i));
+            deepcopy_VkGraphicsPipelineCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfos + i, (VkGraphicsPipelineCreateInfo*)(local_pCreateInfos + i));
         }
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfos)
@@ -5318,13 +5320,13 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i)
         {
-            count_VkGraphicsPipelineCreateInfo(sFeatureBits, (VkGraphicsPipelineCreateInfo*)(local_pCreateInfos + i), countPtr);
+            count_VkGraphicsPipelineCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkGraphicsPipelineCreateInfo*)(local_pCreateInfos + i), countPtr);
         }
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         if (((createInfoCount)))
         {
@@ -5351,7 +5353,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i)
     {
-        reservedmarshal_VkGraphicsPipelineCreateInfo(stream, (VkGraphicsPipelineCreateInfo*)(local_pCreateInfos + i), streamPtrPtr);
+        reservedmarshal_VkGraphicsPipelineCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkGraphicsPipelineCreateInfo*)(local_pCreateInfos + i), streamPtrPtr);
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
@@ -5360,7 +5362,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     if (((createInfoCount)))
@@ -5423,14 +5425,14 @@
         local_pCreateInfos = (VkComputePipelineCreateInfo*)pool->alloc(((createInfoCount)) * sizeof(const VkComputePipelineCreateInfo));
         for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i)
         {
-            deepcopy_VkComputePipelineCreateInfo(pool, pCreateInfos + i, (VkComputePipelineCreateInfo*)(local_pCreateInfos + i));
+            deepcopy_VkComputePipelineCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfos + i, (VkComputePipelineCreateInfo*)(local_pCreateInfos + i));
         }
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfos)
@@ -5454,13 +5456,13 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i)
         {
-            count_VkComputePipelineCreateInfo(sFeatureBits, (VkComputePipelineCreateInfo*)(local_pCreateInfos + i), countPtr);
+            count_VkComputePipelineCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkComputePipelineCreateInfo*)(local_pCreateInfos + i), countPtr);
         }
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         if (((createInfoCount)))
         {
@@ -5487,7 +5489,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i)
     {
-        reservedmarshal_VkComputePipelineCreateInfo(stream, (VkComputePipelineCreateInfo*)(local_pCreateInfos + i), streamPtrPtr);
+        reservedmarshal_VkComputePipelineCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkComputePipelineCreateInfo*)(local_pCreateInfos + i), streamPtrPtr);
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
@@ -5496,7 +5498,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     if (((createInfoCount)))
@@ -5551,7 +5553,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -5569,7 +5571,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyPipeline = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -5595,7 +5597,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkPipeline((VkPipeline*)&pipeline);
     stream->flush();
@@ -5628,13 +5630,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkPipelineLayoutCreateInfo*)pool->alloc(sizeof(const VkPipelineLayoutCreateInfo));
-        deepcopy_VkPipelineLayoutCreateInfo(pool, pCreateInfo, (VkPipelineLayoutCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkPipelineLayoutCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkPipelineLayoutCreateInfo*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -5650,12 +5652,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPipelineLayoutCreateInfo(sFeatureBits, (VkPipelineLayoutCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkPipelineLayoutCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineLayoutCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -5672,7 +5674,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPipelineLayoutCreateInfo(stream, (VkPipelineLayoutCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkPipelineLayoutCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineLayoutCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -5680,7 +5682,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -5725,7 +5727,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -5743,7 +5745,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyPipelineLayout = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -5769,7 +5771,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkPipelineLayout((VkPipelineLayout*)&pipelineLayout);
     stream->flush();
@@ -5802,13 +5804,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkSamplerCreateInfo*)pool->alloc(sizeof(const VkSamplerCreateInfo));
-        deepcopy_VkSamplerCreateInfo(pool, pCreateInfo, (VkSamplerCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkSamplerCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkSamplerCreateInfo*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -5824,12 +5826,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkSamplerCreateInfo(sFeatureBits, (VkSamplerCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkSamplerCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSamplerCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -5846,7 +5848,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkSamplerCreateInfo(stream, (VkSamplerCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkSamplerCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSamplerCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -5854,7 +5856,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -5899,7 +5901,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -5917,7 +5919,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroySampler = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -5943,7 +5945,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkSampler((VkSampler*)&sampler);
     stream->flush();
@@ -5976,13 +5978,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkDescriptorSetLayoutCreateInfo*)pool->alloc(sizeof(const VkDescriptorSetLayoutCreateInfo));
-        deepcopy_VkDescriptorSetLayoutCreateInfo(pool, pCreateInfo, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkDescriptorSetLayoutCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -5998,12 +6000,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDescriptorSetLayoutCreateInfo(sFeatureBits, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkDescriptorSetLayoutCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -6020,7 +6022,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDescriptorSetLayoutCreateInfo(stream, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkDescriptorSetLayoutCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -6028,7 +6030,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -6073,7 +6075,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -6091,7 +6093,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyDescriptorSetLayout = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -6117,7 +6119,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkDescriptorSetLayout((VkDescriptorSetLayout*)&descriptorSetLayout);
     stream->flush();
@@ -6150,13 +6152,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkDescriptorPoolCreateInfo*)pool->alloc(sizeof(const VkDescriptorPoolCreateInfo));
-        deepcopy_VkDescriptorPoolCreateInfo(pool, pCreateInfo, (VkDescriptorPoolCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkDescriptorPoolCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkDescriptorPoolCreateInfo*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -6172,12 +6174,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDescriptorPoolCreateInfo(sFeatureBits, (VkDescriptorPoolCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkDescriptorPoolCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorPoolCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -6194,7 +6196,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDescriptorPoolCreateInfo(stream, (VkDescriptorPoolCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkDescriptorPoolCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorPoolCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -6202,7 +6204,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -6247,7 +6249,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -6265,7 +6267,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyDescriptorPool = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -6291,7 +6293,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkDescriptorPool((VkDescriptorPool*)&descriptorPool);
     stream->flush();
@@ -6378,7 +6380,7 @@
     if (pAllocateInfo)
     {
         local_pAllocateInfo = (VkDescriptorSetAllocateInfo*)pool->alloc(sizeof(const VkDescriptorSetAllocateInfo));
-        deepcopy_VkDescriptorSetAllocateInfo(pool, pAllocateInfo, (VkDescriptorSetAllocateInfo*)(local_pAllocateInfo));
+        deepcopy_VkDescriptorSetAllocateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocateInfo, (VkDescriptorSetAllocateInfo*)(local_pAllocateInfo));
     }
     if (local_pAllocateInfo)
     {
@@ -6389,7 +6391,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDescriptorSetAllocateInfo(sFeatureBits, (VkDescriptorSetAllocateInfo*)(local_pAllocateInfo), countPtr);
+        count_VkDescriptorSetAllocateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorSetAllocateInfo*)(local_pAllocateInfo), countPtr);
         if (pAllocateInfo->descriptorSetCount)
         {
             *countPtr += pAllocateInfo->descriptorSetCount * 8;
@@ -6407,7 +6409,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDescriptorSetAllocateInfo(stream, (VkDescriptorSetAllocateInfo*)(local_pAllocateInfo), streamPtrPtr);
+    reservedmarshal_VkDescriptorSetAllocateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorSetAllocateInfo*)(local_pAllocateInfo), streamPtrPtr);
     /* is handle, possibly out */;
     if (pAllocateInfo->descriptorSetCount)
     {
@@ -6558,7 +6560,7 @@
         local_pDescriptorWrites = (VkWriteDescriptorSet*)pool->alloc(((descriptorWriteCount)) * sizeof(const VkWriteDescriptorSet));
         for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i)
         {
-            deepcopy_VkWriteDescriptorSet(pool, pDescriptorWrites + i, (VkWriteDescriptorSet*)(local_pDescriptorWrites + i));
+            deepcopy_VkWriteDescriptorSet(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pDescriptorWrites + i, (VkWriteDescriptorSet*)(local_pDescriptorWrites + i));
         }
     }
     local_descriptorCopyCount = descriptorCopyCount;
@@ -6568,7 +6570,7 @@
         local_pDescriptorCopies = (VkCopyDescriptorSet*)pool->alloc(((descriptorCopyCount)) * sizeof(const VkCopyDescriptorSet));
         for (uint32_t i = 0; i < (uint32_t)((descriptorCopyCount)); ++i)
         {
-            deepcopy_VkCopyDescriptorSet(pool, pDescriptorCopies + i, (VkCopyDescriptorSet*)(local_pDescriptorCopies + i));
+            deepcopy_VkCopyDescriptorSet(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pDescriptorCopies + i, (VkCopyDescriptorSet*)(local_pDescriptorCopies + i));
         }
     }
     if (local_pDescriptorWrites)
@@ -6593,12 +6595,12 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i)
         {
-            count_VkWriteDescriptorSet(sFeatureBits, (VkWriteDescriptorSet*)(local_pDescriptorWrites + i), countPtr);
+            count_VkWriteDescriptorSet(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkWriteDescriptorSet*)(local_pDescriptorWrites + i), countPtr);
         }
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((descriptorCopyCount)); ++i)
         {
-            count_VkCopyDescriptorSet(sFeatureBits, (VkCopyDescriptorSet*)(local_pDescriptorCopies + i), countPtr);
+            count_VkCopyDescriptorSet(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyDescriptorSet*)(local_pDescriptorCopies + i), countPtr);
         }
     }
     uint32_t packetSize_vkUpdateDescriptorSets = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -6617,13 +6619,13 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i)
     {
-        reservedmarshal_VkWriteDescriptorSet(stream, (VkWriteDescriptorSet*)(local_pDescriptorWrites + i), streamPtrPtr);
+        reservedmarshal_VkWriteDescriptorSet(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkWriteDescriptorSet*)(local_pDescriptorWrites + i), streamPtrPtr);
     }
     memcpy(*streamPtrPtr, (uint32_t*)&local_descriptorCopyCount, sizeof(uint32_t));
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((descriptorCopyCount)); ++i)
     {
-        reservedmarshal_VkCopyDescriptorSet(stream, (VkCopyDescriptorSet*)(local_pDescriptorCopies + i), streamPtrPtr);
+        reservedmarshal_VkCopyDescriptorSet(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyDescriptorSet*)(local_pDescriptorCopies + i), streamPtrPtr);
     }
     stream->flush();
     ++encodeCount;;
@@ -6655,13 +6657,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkFramebufferCreateInfo*)pool->alloc(sizeof(const VkFramebufferCreateInfo));
-        deepcopy_VkFramebufferCreateInfo(pool, pCreateInfo, (VkFramebufferCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkFramebufferCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkFramebufferCreateInfo*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -6677,12 +6679,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkFramebufferCreateInfo(sFeatureBits, (VkFramebufferCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkFramebufferCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFramebufferCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -6699,7 +6701,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkFramebufferCreateInfo(stream, (VkFramebufferCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkFramebufferCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFramebufferCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -6707,7 +6709,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -6752,7 +6754,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -6770,7 +6772,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyFramebuffer = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -6796,7 +6798,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkFramebuffer((VkFramebuffer*)&framebuffer);
     stream->flush();
@@ -6829,13 +6831,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkRenderPassCreateInfo*)pool->alloc(sizeof(const VkRenderPassCreateInfo));
-        deepcopy_VkRenderPassCreateInfo(pool, pCreateInfo, (VkRenderPassCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkRenderPassCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkRenderPassCreateInfo*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -6851,12 +6853,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkRenderPassCreateInfo(sFeatureBits, (VkRenderPassCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkRenderPassCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRenderPassCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -6873,7 +6875,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkRenderPassCreateInfo(stream, (VkRenderPassCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkRenderPassCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRenderPassCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -6881,7 +6883,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -6926,7 +6928,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -6944,7 +6946,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyRenderPass = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -6970,7 +6972,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkRenderPass((VkRenderPass*)&renderPass);
     stream->flush();
@@ -7005,7 +7007,7 @@
         *countPtr += 1 * 8;
         uint64_t cgen_var_1;
         *countPtr += 1 * 8;
-        count_VkExtent2D(sFeatureBits, (VkExtent2D*)(pGranularity), countPtr);
+        count_VkExtent2D(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtent2D*)(pGranularity), countPtr);
     }
     uint32_t packetSize_vkGetRenderAreaGranularity = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetRenderAreaGranularity);
@@ -7023,8 +7025,8 @@
     *&cgen_var_1 = get_host_u64_VkRenderPass((*&local_renderPass));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkExtent2D(stream, (VkExtent2D*)(pGranularity), streamPtrPtr);
-    unmarshal_VkExtent2D(stream, (VkExtent2D*)(pGranularity));
+    reservedmarshal_VkExtent2D(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtent2D*)(pGranularity), streamPtrPtr);
+    unmarshal_VkExtent2D(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtent2D*)(pGranularity));
     if (pGranularity)
     {
         transform_fromhost_VkExtent2D(sResourceTracker, (VkExtent2D*)(pGranularity));
@@ -7058,13 +7060,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkCommandPoolCreateInfo*)pool->alloc(sizeof(const VkCommandPoolCreateInfo));
-        deepcopy_VkCommandPoolCreateInfo(pool, pCreateInfo, (VkCommandPoolCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkCommandPoolCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkCommandPoolCreateInfo*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -7080,12 +7082,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkCommandPoolCreateInfo(sFeatureBits, (VkCommandPoolCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkCommandPoolCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCommandPoolCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -7102,7 +7104,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkCommandPoolCreateInfo(stream, (VkCommandPoolCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkCommandPoolCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCommandPoolCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -7110,7 +7112,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -7155,7 +7157,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -7173,7 +7175,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyCommandPool = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -7199,7 +7201,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkCommandPool((VkCommandPool*)&commandPool);
     stream->flush();
@@ -7286,7 +7288,7 @@
     if (pAllocateInfo)
     {
         local_pAllocateInfo = (VkCommandBufferAllocateInfo*)pool->alloc(sizeof(const VkCommandBufferAllocateInfo));
-        deepcopy_VkCommandBufferAllocateInfo(pool, pAllocateInfo, (VkCommandBufferAllocateInfo*)(local_pAllocateInfo));
+        deepcopy_VkCommandBufferAllocateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocateInfo, (VkCommandBufferAllocateInfo*)(local_pAllocateInfo));
     }
     if (local_pAllocateInfo)
     {
@@ -7297,7 +7299,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkCommandBufferAllocateInfo(sFeatureBits, (VkCommandBufferAllocateInfo*)(local_pAllocateInfo), countPtr);
+        count_VkCommandBufferAllocateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCommandBufferAllocateInfo*)(local_pAllocateInfo), countPtr);
         if (pAllocateInfo->commandBufferCount)
         {
             *countPtr += pAllocateInfo->commandBufferCount * 8;
@@ -7315,7 +7317,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkCommandBufferAllocateInfo(stream, (VkCommandBufferAllocateInfo*)(local_pAllocateInfo), streamPtrPtr);
+    reservedmarshal_VkCommandBufferAllocateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCommandBufferAllocateInfo*)(local_pAllocateInfo), streamPtrPtr);
     /* is handle, possibly out */;
     if (pAllocateInfo->commandBufferCount)
     {
@@ -7455,7 +7457,7 @@
     if (pBeginInfo)
     {
         local_pBeginInfo = (VkCommandBufferBeginInfo*)pool->alloc(sizeof(const VkCommandBufferBeginInfo));
-        deepcopy_VkCommandBufferBeginInfo(pool, pBeginInfo, (VkCommandBufferBeginInfo*)(local_pBeginInfo));
+        deepcopy_VkCommandBufferBeginInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBeginInfo, (VkCommandBufferBeginInfo*)(local_pBeginInfo));
     }
     if (local_pBeginInfo)
     {
@@ -7466,7 +7468,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkCommandBufferBeginInfo(sFeatureBits, (VkCommandBufferBeginInfo*)(local_pBeginInfo), countPtr);
+        count_VkCommandBufferBeginInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCommandBufferBeginInfo*)(local_pBeginInfo), countPtr);
     }
     uint32_t packetSize_vkBeginCommandBuffer = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkBeginCommandBuffer -= 8;
@@ -7482,7 +7484,7 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkCommandBufferBeginInfo(stream, (VkCommandBufferBeginInfo*)(local_pBeginInfo), streamPtrPtr);
+    reservedmarshal_VkCommandBufferBeginInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCommandBufferBeginInfo*)(local_pBeginInfo), streamPtrPtr);
     VkResult vkBeginCommandBuffer_VkResult_return = (VkResult)0;
     stream->read(&vkBeginCommandBuffer_VkResult_return, sizeof(VkResult));
     ++encodeCount;;
@@ -7667,7 +7669,7 @@
         local_pViewports = (VkViewport*)pool->alloc(((viewportCount)) * sizeof(const VkViewport));
         for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
         {
-            deepcopy_VkViewport(pool, pViewports + i, (VkViewport*)(local_pViewports + i));
+            deepcopy_VkViewport(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pViewports + i, (VkViewport*)(local_pViewports + i));
         }
     }
     if (local_pViewports)
@@ -7686,7 +7688,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
         {
-            count_VkViewport(sFeatureBits, (VkViewport*)(local_pViewports + i), countPtr);
+            count_VkViewport(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkViewport*)(local_pViewports + i), countPtr);
         }
     }
     uint32_t packetSize_vkCmdSetViewport = 4 + 4 + count;
@@ -7709,7 +7711,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
     {
-        reservedmarshal_VkViewport(stream, (VkViewport*)(local_pViewports + i), streamPtrPtr);
+        reservedmarshal_VkViewport(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkViewport*)(local_pViewports + i), streamPtrPtr);
     }
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
@@ -7745,7 +7747,7 @@
         local_pScissors = (VkRect2D*)pool->alloc(((scissorCount)) * sizeof(const VkRect2D));
         for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i)
         {
-            deepcopy_VkRect2D(pool, pScissors + i, (VkRect2D*)(local_pScissors + i));
+            deepcopy_VkRect2D(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pScissors + i, (VkRect2D*)(local_pScissors + i));
         }
     }
     if (local_pScissors)
@@ -7764,7 +7766,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i)
         {
-            count_VkRect2D(sFeatureBits, (VkRect2D*)(local_pScissors + i), countPtr);
+            count_VkRect2D(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRect2D*)(local_pScissors + i), countPtr);
         }
     }
     uint32_t packetSize_vkCmdSetScissor = 4 + 4 + count;
@@ -7787,7 +7789,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i)
     {
-        reservedmarshal_VkRect2D(stream, (VkRect2D*)(local_pScissors + i), streamPtrPtr);
+        reservedmarshal_VkRect2D(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRect2D*)(local_pScissors + i), streamPtrPtr);
     }
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
@@ -8801,7 +8803,7 @@
         local_pRegions = (VkBufferCopy*)pool->alloc(((regionCount)) * sizeof(const VkBufferCopy));
         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
         {
-            deepcopy_VkBufferCopy(pool, pRegions + i, (VkBufferCopy*)(local_pRegions + i));
+            deepcopy_VkBufferCopy(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRegions + i, (VkBufferCopy*)(local_pRegions + i));
         }
     }
     if (local_pRegions)
@@ -8823,7 +8825,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
         {
-            count_VkBufferCopy(sFeatureBits, (VkBufferCopy*)(local_pRegions + i), countPtr);
+            count_VkBufferCopy(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferCopy*)(local_pRegions + i), countPtr);
         }
     }
     uint32_t packetSize_vkCmdCopyBuffer = 4 + 4 + count;
@@ -8852,7 +8854,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
     {
-        reservedmarshal_VkBufferCopy(stream, (VkBufferCopy*)(local_pRegions + i), streamPtrPtr);
+        reservedmarshal_VkBufferCopy(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferCopy*)(local_pRegions + i), streamPtrPtr);
     }
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
@@ -8897,7 +8899,7 @@
         local_pRegions = (VkImageCopy*)pool->alloc(((regionCount)) * sizeof(const VkImageCopy));
         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
         {
-            deepcopy_VkImageCopy(pool, pRegions + i, (VkImageCopy*)(local_pRegions + i));
+            deepcopy_VkImageCopy(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRegions + i, (VkImageCopy*)(local_pRegions + i));
         }
     }
     if (local_pRegions)
@@ -8921,7 +8923,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
         {
-            count_VkImageCopy(sFeatureBits, (VkImageCopy*)(local_pRegions + i), countPtr);
+            count_VkImageCopy(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageCopy*)(local_pRegions + i), countPtr);
         }
     }
     uint32_t packetSize_vkCmdCopyImage = 4 + 4 + count;
@@ -8954,7 +8956,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
     {
-        reservedmarshal_VkImageCopy(stream, (VkImageCopy*)(local_pRegions + i), streamPtrPtr);
+        reservedmarshal_VkImageCopy(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageCopy*)(local_pRegions + i), streamPtrPtr);
     }
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
@@ -9001,7 +9003,7 @@
         local_pRegions = (VkImageBlit*)pool->alloc(((regionCount)) * sizeof(const VkImageBlit));
         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
         {
-            deepcopy_VkImageBlit(pool, pRegions + i, (VkImageBlit*)(local_pRegions + i));
+            deepcopy_VkImageBlit(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRegions + i, (VkImageBlit*)(local_pRegions + i));
         }
     }
     local_filter = filter;
@@ -9026,7 +9028,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
         {
-            count_VkImageBlit(sFeatureBits, (VkImageBlit*)(local_pRegions + i), countPtr);
+            count_VkImageBlit(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageBlit*)(local_pRegions + i), countPtr);
         }
         *countPtr += sizeof(VkFilter);
     }
@@ -9060,7 +9062,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
     {
-        reservedmarshal_VkImageBlit(stream, (VkImageBlit*)(local_pRegions + i), streamPtrPtr);
+        reservedmarshal_VkImageBlit(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageBlit*)(local_pRegions + i), streamPtrPtr);
     }
     memcpy(*streamPtrPtr, (VkFilter*)&local_filter, sizeof(VkFilter));
     *streamPtrPtr += sizeof(VkFilter);
@@ -9104,7 +9106,7 @@
         local_pRegions = (VkBufferImageCopy*)pool->alloc(((regionCount)) * sizeof(const VkBufferImageCopy));
         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
         {
-            deepcopy_VkBufferImageCopy(pool, pRegions + i, (VkBufferImageCopy*)(local_pRegions + i));
+            deepcopy_VkBufferImageCopy(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRegions + i, (VkBufferImageCopy*)(local_pRegions + i));
         }
     }
     if (local_pRegions)
@@ -9127,7 +9129,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
         {
-            count_VkBufferImageCopy(sFeatureBits, (VkBufferImageCopy*)(local_pRegions + i), countPtr);
+            count_VkBufferImageCopy(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferImageCopy*)(local_pRegions + i), countPtr);
         }
     }
     uint32_t packetSize_vkCmdCopyBufferToImage = 4 + 4 + count;
@@ -9158,7 +9160,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
     {
-        reservedmarshal_VkBufferImageCopy(stream, (VkBufferImageCopy*)(local_pRegions + i), streamPtrPtr);
+        reservedmarshal_VkBufferImageCopy(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferImageCopy*)(local_pRegions + i), streamPtrPtr);
     }
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
@@ -9200,7 +9202,7 @@
         local_pRegions = (VkBufferImageCopy*)pool->alloc(((regionCount)) * sizeof(const VkBufferImageCopy));
         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
         {
-            deepcopy_VkBufferImageCopy(pool, pRegions + i, (VkBufferImageCopy*)(local_pRegions + i));
+            deepcopy_VkBufferImageCopy(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRegions + i, (VkBufferImageCopy*)(local_pRegions + i));
         }
     }
     if (local_pRegions)
@@ -9223,7 +9225,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
         {
-            count_VkBufferImageCopy(sFeatureBits, (VkBufferImageCopy*)(local_pRegions + i), countPtr);
+            count_VkBufferImageCopy(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferImageCopy*)(local_pRegions + i), countPtr);
         }
     }
     uint32_t packetSize_vkCmdCopyImageToBuffer = 4 + 4 + count;
@@ -9254,7 +9256,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
     {
-        reservedmarshal_VkBufferImageCopy(stream, (VkBufferImageCopy*)(local_pRegions + i), streamPtrPtr);
+        reservedmarshal_VkBufferImageCopy(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferImageCopy*)(local_pRegions + i), streamPtrPtr);
     }
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
@@ -9427,7 +9429,7 @@
     if (pColor)
     {
         local_pColor = (VkClearColorValue*)pool->alloc(sizeof(const VkClearColorValue));
-        deepcopy_VkClearColorValue(pool, pColor, (VkClearColorValue*)(local_pColor));
+        deepcopy_VkClearColorValue(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pColor, (VkClearColorValue*)(local_pColor));
     }
     local_rangeCount = rangeCount;
     local_pRanges = nullptr;
@@ -9436,7 +9438,7 @@
         local_pRanges = (VkImageSubresourceRange*)pool->alloc(((rangeCount)) * sizeof(const VkImageSubresourceRange));
         for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i)
         {
-            deepcopy_VkImageSubresourceRange(pool, pRanges + i, (VkImageSubresourceRange*)(local_pRanges + i));
+            deepcopy_VkImageSubresourceRange(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRanges + i, (VkImageSubresourceRange*)(local_pRanges + i));
         }
     }
     if (local_pColor)
@@ -9458,11 +9460,11 @@
         uint64_t cgen_var_1;
         *countPtr += 1 * 8;
         *countPtr += sizeof(VkImageLayout);
-        count_VkClearColorValue(sFeatureBits, (VkClearColorValue*)(local_pColor), countPtr);
+        count_VkClearColorValue(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkClearColorValue*)(local_pColor), countPtr);
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i)
         {
-            count_VkImageSubresourceRange(sFeatureBits, (VkImageSubresourceRange*)(local_pRanges + i), countPtr);
+            count_VkImageSubresourceRange(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageSubresourceRange*)(local_pRanges + i), countPtr);
         }
     }
     uint32_t packetSize_vkCmdClearColorImage = 4 + 4 + count;
@@ -9485,12 +9487,12 @@
     *streamPtrPtr += 1 * 8;
     memcpy(*streamPtrPtr, (VkImageLayout*)&local_imageLayout, sizeof(VkImageLayout));
     *streamPtrPtr += sizeof(VkImageLayout);
-    reservedmarshal_VkClearColorValue(stream, (VkClearColorValue*)(local_pColor), streamPtrPtr);
+    reservedmarshal_VkClearColorValue(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkClearColorValue*)(local_pColor), streamPtrPtr);
     memcpy(*streamPtrPtr, (uint32_t*)&local_rangeCount, sizeof(uint32_t));
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i)
     {
-        reservedmarshal_VkImageSubresourceRange(stream, (VkImageSubresourceRange*)(local_pRanges + i), streamPtrPtr);
+        reservedmarshal_VkImageSubresourceRange(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageSubresourceRange*)(local_pRanges + i), streamPtrPtr);
     }
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
@@ -9528,7 +9530,7 @@
     if (pDepthStencil)
     {
         local_pDepthStencil = (VkClearDepthStencilValue*)pool->alloc(sizeof(const VkClearDepthStencilValue));
-        deepcopy_VkClearDepthStencilValue(pool, pDepthStencil, (VkClearDepthStencilValue*)(local_pDepthStencil));
+        deepcopy_VkClearDepthStencilValue(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pDepthStencil, (VkClearDepthStencilValue*)(local_pDepthStencil));
     }
     local_rangeCount = rangeCount;
     local_pRanges = nullptr;
@@ -9537,7 +9539,7 @@
         local_pRanges = (VkImageSubresourceRange*)pool->alloc(((rangeCount)) * sizeof(const VkImageSubresourceRange));
         for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i)
         {
-            deepcopy_VkImageSubresourceRange(pool, pRanges + i, (VkImageSubresourceRange*)(local_pRanges + i));
+            deepcopy_VkImageSubresourceRange(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRanges + i, (VkImageSubresourceRange*)(local_pRanges + i));
         }
     }
     if (local_pDepthStencil)
@@ -9559,11 +9561,11 @@
         uint64_t cgen_var_1;
         *countPtr += 1 * 8;
         *countPtr += sizeof(VkImageLayout);
-        count_VkClearDepthStencilValue(sFeatureBits, (VkClearDepthStencilValue*)(local_pDepthStencil), countPtr);
+        count_VkClearDepthStencilValue(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkClearDepthStencilValue*)(local_pDepthStencil), countPtr);
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i)
         {
-            count_VkImageSubresourceRange(sFeatureBits, (VkImageSubresourceRange*)(local_pRanges + i), countPtr);
+            count_VkImageSubresourceRange(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageSubresourceRange*)(local_pRanges + i), countPtr);
         }
     }
     uint32_t packetSize_vkCmdClearDepthStencilImage = 4 + 4 + count;
@@ -9586,12 +9588,12 @@
     *streamPtrPtr += 1 * 8;
     memcpy(*streamPtrPtr, (VkImageLayout*)&local_imageLayout, sizeof(VkImageLayout));
     *streamPtrPtr += sizeof(VkImageLayout);
-    reservedmarshal_VkClearDepthStencilValue(stream, (VkClearDepthStencilValue*)(local_pDepthStencil), streamPtrPtr);
+    reservedmarshal_VkClearDepthStencilValue(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkClearDepthStencilValue*)(local_pDepthStencil), streamPtrPtr);
     memcpy(*streamPtrPtr, (uint32_t*)&local_rangeCount, sizeof(uint32_t));
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i)
     {
-        reservedmarshal_VkImageSubresourceRange(stream, (VkImageSubresourceRange*)(local_pRanges + i), streamPtrPtr);
+        reservedmarshal_VkImageSubresourceRange(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageSubresourceRange*)(local_pRanges + i), streamPtrPtr);
     }
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
@@ -9628,7 +9630,7 @@
         local_pAttachments = (VkClearAttachment*)pool->alloc(((attachmentCount)) * sizeof(const VkClearAttachment));
         for (uint32_t i = 0; i < (uint32_t)((attachmentCount)); ++i)
         {
-            deepcopy_VkClearAttachment(pool, pAttachments + i, (VkClearAttachment*)(local_pAttachments + i));
+            deepcopy_VkClearAttachment(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAttachments + i, (VkClearAttachment*)(local_pAttachments + i));
         }
     }
     local_rectCount = rectCount;
@@ -9638,7 +9640,7 @@
         local_pRects = (VkClearRect*)pool->alloc(((rectCount)) * sizeof(const VkClearRect));
         for (uint32_t i = 0; i < (uint32_t)((rectCount)); ++i)
         {
-            deepcopy_VkClearRect(pool, pRects + i, (VkClearRect*)(local_pRects + i));
+            deepcopy_VkClearRect(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRects + i, (VkClearRect*)(local_pRects + i));
         }
     }
     if (local_pAttachments)
@@ -9663,12 +9665,12 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((attachmentCount)); ++i)
         {
-            count_VkClearAttachment(sFeatureBits, (VkClearAttachment*)(local_pAttachments + i), countPtr);
+            count_VkClearAttachment(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkClearAttachment*)(local_pAttachments + i), countPtr);
         }
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((rectCount)); ++i)
         {
-            count_VkClearRect(sFeatureBits, (VkClearRect*)(local_pRects + i), countPtr);
+            count_VkClearRect(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkClearRect*)(local_pRects + i), countPtr);
         }
     }
     uint32_t packetSize_vkCmdClearAttachments = 4 + 4 + count;
@@ -9689,13 +9691,13 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((attachmentCount)); ++i)
     {
-        reservedmarshal_VkClearAttachment(stream, (VkClearAttachment*)(local_pAttachments + i), streamPtrPtr);
+        reservedmarshal_VkClearAttachment(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkClearAttachment*)(local_pAttachments + i), streamPtrPtr);
     }
     memcpy(*streamPtrPtr, (uint32_t*)&local_rectCount, sizeof(uint32_t));
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((rectCount)); ++i)
     {
-        reservedmarshal_VkClearRect(stream, (VkClearRect*)(local_pRects + i), streamPtrPtr);
+        reservedmarshal_VkClearRect(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkClearRect*)(local_pRects + i), streamPtrPtr);
     }
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
@@ -9740,7 +9742,7 @@
         local_pRegions = (VkImageResolve*)pool->alloc(((regionCount)) * sizeof(const VkImageResolve));
         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
         {
-            deepcopy_VkImageResolve(pool, pRegions + i, (VkImageResolve*)(local_pRegions + i));
+            deepcopy_VkImageResolve(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRegions + i, (VkImageResolve*)(local_pRegions + i));
         }
     }
     if (local_pRegions)
@@ -9764,7 +9766,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
         {
-            count_VkImageResolve(sFeatureBits, (VkImageResolve*)(local_pRegions + i), countPtr);
+            count_VkImageResolve(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageResolve*)(local_pRegions + i), countPtr);
         }
     }
     uint32_t packetSize_vkCmdResolveImage = 4 + 4 + count;
@@ -9797,7 +9799,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
     {
-        reservedmarshal_VkImageResolve(stream, (VkImageResolve*)(local_pRegions + i), streamPtrPtr);
+        reservedmarshal_VkImageResolve(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageResolve*)(local_pRegions + i), streamPtrPtr);
     }
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
@@ -9961,7 +9963,7 @@
         local_pMemoryBarriers = (VkMemoryBarrier*)pool->alloc(((memoryBarrierCount)) * sizeof(const VkMemoryBarrier));
         for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i)
         {
-            deepcopy_VkMemoryBarrier(pool, pMemoryBarriers + i, (VkMemoryBarrier*)(local_pMemoryBarriers + i));
+            deepcopy_VkMemoryBarrier(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pMemoryBarriers + i, (VkMemoryBarrier*)(local_pMemoryBarriers + i));
         }
     }
     local_bufferMemoryBarrierCount = bufferMemoryBarrierCount;
@@ -9971,7 +9973,7 @@
         local_pBufferMemoryBarriers = (VkBufferMemoryBarrier*)pool->alloc(((bufferMemoryBarrierCount)) * sizeof(const VkBufferMemoryBarrier));
         for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i)
         {
-            deepcopy_VkBufferMemoryBarrier(pool, pBufferMemoryBarriers + i, (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i));
+            deepcopy_VkBufferMemoryBarrier(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBufferMemoryBarriers + i, (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i));
         }
     }
     local_imageMemoryBarrierCount = imageMemoryBarrierCount;
@@ -9981,7 +9983,7 @@
         local_pImageMemoryBarriers = (VkImageMemoryBarrier*)pool->alloc(((imageMemoryBarrierCount)) * sizeof(const VkImageMemoryBarrier));
         for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i)
         {
-            deepcopy_VkImageMemoryBarrier(pool, pImageMemoryBarriers + i, (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i));
+            deepcopy_VkImageMemoryBarrier(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pImageMemoryBarriers + i, (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i));
         }
     }
     if (local_pMemoryBarriers)
@@ -10020,17 +10022,17 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i)
         {
-            count_VkMemoryBarrier(sFeatureBits, (VkMemoryBarrier*)(local_pMemoryBarriers + i), countPtr);
+            count_VkMemoryBarrier(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryBarrier*)(local_pMemoryBarriers + i), countPtr);
         }
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i)
         {
-            count_VkBufferMemoryBarrier(sFeatureBits, (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i), countPtr);
+            count_VkBufferMemoryBarrier(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i), countPtr);
         }
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i)
         {
-            count_VkImageMemoryBarrier(sFeatureBits, (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i), countPtr);
+            count_VkImageMemoryBarrier(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i), countPtr);
         }
     }
     uint32_t packetSize_vkCmdWaitEvents = 4 + 4 + count;
@@ -10067,19 +10069,19 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i)
     {
-        reservedmarshal_VkMemoryBarrier(stream, (VkMemoryBarrier*)(local_pMemoryBarriers + i), streamPtrPtr);
+        reservedmarshal_VkMemoryBarrier(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryBarrier*)(local_pMemoryBarriers + i), streamPtrPtr);
     }
     memcpy(*streamPtrPtr, (uint32_t*)&local_bufferMemoryBarrierCount, sizeof(uint32_t));
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i)
     {
-        reservedmarshal_VkBufferMemoryBarrier(stream, (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i), streamPtrPtr);
+        reservedmarshal_VkBufferMemoryBarrier(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i), streamPtrPtr);
     }
     memcpy(*streamPtrPtr, (uint32_t*)&local_imageMemoryBarrierCount, sizeof(uint32_t));
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i)
     {
-        reservedmarshal_VkImageMemoryBarrier(stream, (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i), streamPtrPtr);
+        reservedmarshal_VkImageMemoryBarrier(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i), streamPtrPtr);
     }
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
@@ -10129,7 +10131,7 @@
         local_pMemoryBarriers = (VkMemoryBarrier*)pool->alloc(((memoryBarrierCount)) * sizeof(const VkMemoryBarrier));
         for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i)
         {
-            deepcopy_VkMemoryBarrier(pool, pMemoryBarriers + i, (VkMemoryBarrier*)(local_pMemoryBarriers + i));
+            deepcopy_VkMemoryBarrier(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pMemoryBarriers + i, (VkMemoryBarrier*)(local_pMemoryBarriers + i));
         }
     }
     local_bufferMemoryBarrierCount = bufferMemoryBarrierCount;
@@ -10139,7 +10141,7 @@
         local_pBufferMemoryBarriers = (VkBufferMemoryBarrier*)pool->alloc(((bufferMemoryBarrierCount)) * sizeof(const VkBufferMemoryBarrier));
         for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i)
         {
-            deepcopy_VkBufferMemoryBarrier(pool, pBufferMemoryBarriers + i, (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i));
+            deepcopy_VkBufferMemoryBarrier(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBufferMemoryBarriers + i, (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i));
         }
     }
     local_imageMemoryBarrierCount = imageMemoryBarrierCount;
@@ -10149,7 +10151,7 @@
         local_pImageMemoryBarriers = (VkImageMemoryBarrier*)pool->alloc(((imageMemoryBarrierCount)) * sizeof(const VkImageMemoryBarrier));
         for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i)
         {
-            deepcopy_VkImageMemoryBarrier(pool, pImageMemoryBarriers + i, (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i));
+            deepcopy_VkImageMemoryBarrier(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pImageMemoryBarriers + i, (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i));
         }
     }
     if (local_pMemoryBarriers)
@@ -10184,17 +10186,17 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i)
         {
-            count_VkMemoryBarrier(sFeatureBits, (VkMemoryBarrier*)(local_pMemoryBarriers + i), countPtr);
+            count_VkMemoryBarrier(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryBarrier*)(local_pMemoryBarriers + i), countPtr);
         }
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i)
         {
-            count_VkBufferMemoryBarrier(sFeatureBits, (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i), countPtr);
+            count_VkBufferMemoryBarrier(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i), countPtr);
         }
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i)
         {
-            count_VkImageMemoryBarrier(sFeatureBits, (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i), countPtr);
+            count_VkImageMemoryBarrier(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i), countPtr);
         }
     }
     uint32_t packetSize_vkCmdPipelineBarrier = 4 + 4 + count;
@@ -10221,19 +10223,19 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i)
     {
-        reservedmarshal_VkMemoryBarrier(stream, (VkMemoryBarrier*)(local_pMemoryBarriers + i), streamPtrPtr);
+        reservedmarshal_VkMemoryBarrier(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryBarrier*)(local_pMemoryBarriers + i), streamPtrPtr);
     }
     memcpy(*streamPtrPtr, (uint32_t*)&local_bufferMemoryBarrierCount, sizeof(uint32_t));
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i)
     {
-        reservedmarshal_VkBufferMemoryBarrier(stream, (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i), streamPtrPtr);
+        reservedmarshal_VkBufferMemoryBarrier(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i), streamPtrPtr);
     }
     memcpy(*streamPtrPtr, (uint32_t*)&local_imageMemoryBarrierCount, sizeof(uint32_t));
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i)
     {
-        reservedmarshal_VkImageMemoryBarrier(stream, (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i), streamPtrPtr);
+        reservedmarshal_VkImageMemoryBarrier(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i), streamPtrPtr);
     }
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
@@ -10663,7 +10665,7 @@
     if (pRenderPassBegin)
     {
         local_pRenderPassBegin = (VkRenderPassBeginInfo*)pool->alloc(sizeof(const VkRenderPassBeginInfo));
-        deepcopy_VkRenderPassBeginInfo(pool, pRenderPassBegin, (VkRenderPassBeginInfo*)(local_pRenderPassBegin));
+        deepcopy_VkRenderPassBeginInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRenderPassBegin, (VkRenderPassBeginInfo*)(local_pRenderPassBegin));
     }
     local_contents = contents;
     if (local_pRenderPassBegin)
@@ -10675,7 +10677,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkRenderPassBeginInfo(sFeatureBits, (VkRenderPassBeginInfo*)(local_pRenderPassBegin), countPtr);
+        count_VkRenderPassBeginInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRenderPassBeginInfo*)(local_pRenderPassBegin), countPtr);
         *countPtr += sizeof(VkSubpassContents);
     }
     uint32_t packetSize_vkCmdBeginRenderPass = 4 + 4 + count;
@@ -10692,7 +10694,7 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkRenderPassBeginInfo(stream, (VkRenderPassBeginInfo*)(local_pRenderPassBegin), streamPtrPtr);
+    reservedmarshal_VkRenderPassBeginInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRenderPassBeginInfo*)(local_pRenderPassBegin), streamPtrPtr);
     memcpy(*streamPtrPtr, (VkSubpassContents*)&local_contents, sizeof(VkSubpassContents));
     *streamPtrPtr += sizeof(VkSubpassContents);
     ++encodeCount;;
@@ -10915,7 +10917,7 @@
         local_pBindInfos = (VkBindBufferMemoryInfo*)pool->alloc(((bindInfoCount)) * sizeof(const VkBindBufferMemoryInfo));
         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
         {
-            deepcopy_VkBindBufferMemoryInfo(pool, pBindInfos + i, (VkBindBufferMemoryInfo*)(local_pBindInfos + i));
+            deepcopy_VkBindBufferMemoryInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBindInfos + i, (VkBindBufferMemoryInfo*)(local_pBindInfos + i));
         }
     }
     if (local_pBindInfos)
@@ -10933,7 +10935,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
         {
-            count_VkBindBufferMemoryInfo(sFeatureBits, (VkBindBufferMemoryInfo*)(local_pBindInfos + i), countPtr);
+            count_VkBindBufferMemoryInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBindBufferMemoryInfo*)(local_pBindInfos + i), countPtr);
         }
     }
     uint32_t packetSize_vkBindBufferMemory2 = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -10952,7 +10954,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
     {
-        reservedmarshal_VkBindBufferMemoryInfo(stream, (VkBindBufferMemoryInfo*)(local_pBindInfos + i), streamPtrPtr);
+        reservedmarshal_VkBindBufferMemoryInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBindBufferMemoryInfo*)(local_pBindInfos + i), streamPtrPtr);
     }
     VkResult vkBindBufferMemory2_VkResult_return = (VkResult)0;
     stream->read(&vkBindBufferMemory2_VkResult_return, sizeof(VkResult));
@@ -10988,7 +10990,7 @@
         local_pBindInfos = (VkBindImageMemoryInfo*)pool->alloc(((bindInfoCount)) * sizeof(const VkBindImageMemoryInfo));
         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
         {
-            deepcopy_VkBindImageMemoryInfo(pool, pBindInfos + i, (VkBindImageMemoryInfo*)(local_pBindInfos + i));
+            deepcopy_VkBindImageMemoryInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBindInfos + i, (VkBindImageMemoryInfo*)(local_pBindInfos + i));
         }
     }
     if (local_pBindInfos)
@@ -11006,7 +11008,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
         {
-            count_VkBindImageMemoryInfo(sFeatureBits, (VkBindImageMemoryInfo*)(local_pBindInfos + i), countPtr);
+            count_VkBindImageMemoryInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBindImageMemoryInfo*)(local_pBindInfos + i), countPtr);
         }
     }
     uint32_t packetSize_vkBindImageMemory2 = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -11025,7 +11027,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
     {
-        reservedmarshal_VkBindImageMemoryInfo(stream, (VkBindImageMemoryInfo*)(local_pBindInfos + i), streamPtrPtr);
+        reservedmarshal_VkBindImageMemoryInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBindImageMemoryInfo*)(local_pBindInfos + i), streamPtrPtr);
     }
     VkResult vkBindImageMemory2_VkResult_return = (VkResult)0;
     stream->read(&vkBindImageMemory2_VkResult_return, sizeof(VkResult));
@@ -11254,7 +11256,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i)
                 {
-                    count_VkPhysicalDeviceGroupProperties(sFeatureBits, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i), countPtr);
+                    count_VkPhysicalDeviceGroupProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i), countPtr);
                 }
             }
         }
@@ -11290,7 +11292,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i)
         {
-            reservedmarshal_VkPhysicalDeviceGroupProperties(stream, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i), streamPtrPtr);
+            reservedmarshal_VkPhysicalDeviceGroupProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -11317,7 +11319,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i)
             {
-                unmarshal_VkPhysicalDeviceGroupProperties(stream, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i));
+                unmarshal_VkPhysicalDeviceGroupProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i));
             }
         }
     }
@@ -11361,7 +11363,7 @@
     if (pInfo)
     {
         local_pInfo = (VkImageMemoryRequirementsInfo2*)pool->alloc(sizeof(const VkImageMemoryRequirementsInfo2));
-        deepcopy_VkImageMemoryRequirementsInfo2(pool, pInfo, (VkImageMemoryRequirementsInfo2*)(local_pInfo));
+        deepcopy_VkImageMemoryRequirementsInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo, (VkImageMemoryRequirementsInfo2*)(local_pInfo));
     }
     if (local_pInfo)
     {
@@ -11372,8 +11374,8 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkImageMemoryRequirementsInfo2(sFeatureBits, (VkImageMemoryRequirementsInfo2*)(local_pInfo), countPtr);
-        count_VkMemoryRequirements2(sFeatureBits, (VkMemoryRequirements2*)(pMemoryRequirements), countPtr);
+        count_VkImageMemoryRequirementsInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageMemoryRequirementsInfo2*)(local_pInfo), countPtr);
+        count_VkMemoryRequirements2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements), countPtr);
     }
     uint32_t packetSize_vkGetImageMemoryRequirements2 = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetImageMemoryRequirements2);
@@ -11387,9 +11389,9 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkImageMemoryRequirementsInfo2(stream, (VkImageMemoryRequirementsInfo2*)(local_pInfo), streamPtrPtr);
-    reservedmarshal_VkMemoryRequirements2(stream, (VkMemoryRequirements2*)(pMemoryRequirements), streamPtrPtr);
-    unmarshal_VkMemoryRequirements2(stream, (VkMemoryRequirements2*)(pMemoryRequirements));
+    reservedmarshal_VkImageMemoryRequirementsInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageMemoryRequirementsInfo2*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements), streamPtrPtr);
+    unmarshal_VkMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements));
     if (pMemoryRequirements)
     {
         transform_fromhost_VkMemoryRequirements2(sResourceTracker, (VkMemoryRequirements2*)(pMemoryRequirements));
@@ -11421,7 +11423,7 @@
     if (pInfo)
     {
         local_pInfo = (VkBufferMemoryRequirementsInfo2*)pool->alloc(sizeof(const VkBufferMemoryRequirementsInfo2));
-        deepcopy_VkBufferMemoryRequirementsInfo2(pool, pInfo, (VkBufferMemoryRequirementsInfo2*)(local_pInfo));
+        deepcopy_VkBufferMemoryRequirementsInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo, (VkBufferMemoryRequirementsInfo2*)(local_pInfo));
     }
     if (local_pInfo)
     {
@@ -11432,8 +11434,8 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkBufferMemoryRequirementsInfo2(sFeatureBits, (VkBufferMemoryRequirementsInfo2*)(local_pInfo), countPtr);
-        count_VkMemoryRequirements2(sFeatureBits, (VkMemoryRequirements2*)(pMemoryRequirements), countPtr);
+        count_VkBufferMemoryRequirementsInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferMemoryRequirementsInfo2*)(local_pInfo), countPtr);
+        count_VkMemoryRequirements2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements), countPtr);
     }
     uint32_t packetSize_vkGetBufferMemoryRequirements2 = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetBufferMemoryRequirements2);
@@ -11447,9 +11449,9 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkBufferMemoryRequirementsInfo2(stream, (VkBufferMemoryRequirementsInfo2*)(local_pInfo), streamPtrPtr);
-    reservedmarshal_VkMemoryRequirements2(stream, (VkMemoryRequirements2*)(pMemoryRequirements), streamPtrPtr);
-    unmarshal_VkMemoryRequirements2(stream, (VkMemoryRequirements2*)(pMemoryRequirements));
+    reservedmarshal_VkBufferMemoryRequirementsInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferMemoryRequirementsInfo2*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements), streamPtrPtr);
+    unmarshal_VkMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements));
     if (pMemoryRequirements)
     {
         transform_fromhost_VkMemoryRequirements2(sResourceTracker, (VkMemoryRequirements2*)(pMemoryRequirements));
@@ -11482,7 +11484,7 @@
     if (pInfo)
     {
         local_pInfo = (VkImageSparseMemoryRequirementsInfo2*)pool->alloc(sizeof(const VkImageSparseMemoryRequirementsInfo2));
-        deepcopy_VkImageSparseMemoryRequirementsInfo2(pool, pInfo, (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo));
+        deepcopy_VkImageSparseMemoryRequirementsInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo, (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo));
     }
     if (local_pInfo)
     {
@@ -11493,7 +11495,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkImageSparseMemoryRequirementsInfo2(sFeatureBits, (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo), countPtr);
+        count_VkImageSparseMemoryRequirementsInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (pSparseMemoryRequirementCount)
@@ -11508,7 +11510,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
                 {
-                    count_VkSparseImageMemoryRequirements2(sFeatureBits, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i), countPtr);
+                    count_VkSparseImageMemoryRequirements2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i), countPtr);
                 }
             }
         }
@@ -11525,7 +11527,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkImageSparseMemoryRequirementsInfo2(stream, (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkImageSparseMemoryRequirementsInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pSparseMemoryRequirementCount;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -11545,7 +11547,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
         {
-            reservedmarshal_VkSparseImageMemoryRequirements2(stream, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i), streamPtrPtr);
+            reservedmarshal_VkSparseImageMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -11572,7 +11574,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
             {
-                unmarshal_VkSparseImageMemoryRequirements2(stream, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
+                unmarshal_VkSparseImageMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
             }
         }
     }
@@ -11612,7 +11614,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPhysicalDeviceFeatures2(sFeatureBits, (VkPhysicalDeviceFeatures2*)(pFeatures), countPtr);
+        count_VkPhysicalDeviceFeatures2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceFeatures2*)(pFeatures), countPtr);
     }
     uint32_t packetSize_vkGetPhysicalDeviceFeatures2 = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceFeatures2);
@@ -11626,8 +11628,8 @@
     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPhysicalDeviceFeatures2(stream, (VkPhysicalDeviceFeatures2*)(pFeatures), streamPtrPtr);
-    unmarshal_VkPhysicalDeviceFeatures2(stream, (VkPhysicalDeviceFeatures2*)(pFeatures));
+    reservedmarshal_VkPhysicalDeviceFeatures2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceFeatures2*)(pFeatures), streamPtrPtr);
+    unmarshal_VkPhysicalDeviceFeatures2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceFeatures2*)(pFeatures));
     if (pFeatures)
     {
         transform_fromhost_VkPhysicalDeviceFeatures2(sResourceTracker, (VkPhysicalDeviceFeatures2*)(pFeatures));
@@ -11658,7 +11660,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPhysicalDeviceProperties2(sFeatureBits, (VkPhysicalDeviceProperties2*)(pProperties), countPtr);
+        count_VkPhysicalDeviceProperties2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceProperties2*)(pProperties), countPtr);
     }
     uint32_t packetSize_vkGetPhysicalDeviceProperties2 = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceProperties2);
@@ -11672,8 +11674,8 @@
     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPhysicalDeviceProperties2(stream, (VkPhysicalDeviceProperties2*)(pProperties), streamPtrPtr);
-    unmarshal_VkPhysicalDeviceProperties2(stream, (VkPhysicalDeviceProperties2*)(pProperties));
+    reservedmarshal_VkPhysicalDeviceProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceProperties2*)(pProperties), streamPtrPtr);
+    unmarshal_VkPhysicalDeviceProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceProperties2*)(pProperties));
     if (pProperties)
     {
         transform_fromhost_VkPhysicalDeviceProperties2(sResourceTracker, (VkPhysicalDeviceProperties2*)(pProperties));
@@ -11709,7 +11711,7 @@
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
         *countPtr += sizeof(VkFormat);
-        count_VkFormatProperties2(sFeatureBits, (VkFormatProperties2*)(pFormatProperties), countPtr);
+        count_VkFormatProperties2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFormatProperties2*)(pFormatProperties), countPtr);
     }
     uint32_t packetSize_vkGetPhysicalDeviceFormatProperties2 = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceFormatProperties2);
@@ -11725,8 +11727,8 @@
     *streamPtrPtr += 1 * 8;
     memcpy(*streamPtrPtr, (VkFormat*)&local_format, sizeof(VkFormat));
     *streamPtrPtr += sizeof(VkFormat);
-    reservedmarshal_VkFormatProperties2(stream, (VkFormatProperties2*)(pFormatProperties), streamPtrPtr);
-    unmarshal_VkFormatProperties2(stream, (VkFormatProperties2*)(pFormatProperties));
+    reservedmarshal_VkFormatProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFormatProperties2*)(pFormatProperties), streamPtrPtr);
+    unmarshal_VkFormatProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFormatProperties2*)(pFormatProperties));
     if (pFormatProperties)
     {
         transform_fromhost_VkFormatProperties2(sResourceTracker, (VkFormatProperties2*)(pFormatProperties));
@@ -11758,7 +11760,7 @@
     if (pImageFormatInfo)
     {
         local_pImageFormatInfo = (VkPhysicalDeviceImageFormatInfo2*)pool->alloc(sizeof(const VkPhysicalDeviceImageFormatInfo2));
-        deepcopy_VkPhysicalDeviceImageFormatInfo2(pool, pImageFormatInfo, (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo));
+        deepcopy_VkPhysicalDeviceImageFormatInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pImageFormatInfo, (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo));
     }
     if (local_pImageFormatInfo)
     {
@@ -11769,8 +11771,8 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPhysicalDeviceImageFormatInfo2(sFeatureBits, (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo), countPtr);
-        count_VkImageFormatProperties2(sFeatureBits, (VkImageFormatProperties2*)(pImageFormatProperties), countPtr);
+        count_VkPhysicalDeviceImageFormatInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo), countPtr);
+        count_VkImageFormatProperties2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageFormatProperties2*)(pImageFormatProperties), countPtr);
     }
     uint32_t packetSize_vkGetPhysicalDeviceImageFormatProperties2 = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceImageFormatProperties2);
@@ -11784,9 +11786,9 @@
     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPhysicalDeviceImageFormatInfo2(stream, (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo), streamPtrPtr);
-    reservedmarshal_VkImageFormatProperties2(stream, (VkImageFormatProperties2*)(pImageFormatProperties), streamPtrPtr);
-    unmarshal_VkImageFormatProperties2(stream, (VkImageFormatProperties2*)(pImageFormatProperties));
+    reservedmarshal_VkPhysicalDeviceImageFormatInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo), streamPtrPtr);
+    reservedmarshal_VkImageFormatProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageFormatProperties2*)(pImageFormatProperties), streamPtrPtr);
+    unmarshal_VkImageFormatProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageFormatProperties2*)(pImageFormatProperties));
     if (pImageFormatProperties)
     {
         transform_fromhost_VkImageFormatProperties2(sResourceTracker, (VkImageFormatProperties2*)(pImageFormatProperties));
@@ -11835,7 +11837,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
                 {
-                    count_VkQueueFamilyProperties2(sFeatureBits, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i), countPtr);
+                    count_VkQueueFamilyProperties2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i), countPtr);
                 }
             }
         }
@@ -11871,7 +11873,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
         {
-            reservedmarshal_VkQueueFamilyProperties2(stream, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i), streamPtrPtr);
+            reservedmarshal_VkQueueFamilyProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -11898,7 +11900,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
             {
-                unmarshal_VkQueueFamilyProperties2(stream, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i));
+                unmarshal_VkQueueFamilyProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i));
             }
         }
     }
@@ -11938,7 +11940,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPhysicalDeviceMemoryProperties2(sFeatureBits, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties), countPtr);
+        count_VkPhysicalDeviceMemoryProperties2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties), countPtr);
     }
     uint32_t packetSize_vkGetPhysicalDeviceMemoryProperties2 = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceMemoryProperties2);
@@ -11952,8 +11954,8 @@
     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPhysicalDeviceMemoryProperties2(stream, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties), streamPtrPtr);
-    unmarshal_VkPhysicalDeviceMemoryProperties2(stream, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
+    reservedmarshal_VkPhysicalDeviceMemoryProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties), streamPtrPtr);
+    unmarshal_VkPhysicalDeviceMemoryProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
     if (pMemoryProperties)
     {
         transform_fromhost_VkPhysicalDeviceMemoryProperties2(sResourceTracker, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
@@ -11987,7 +11989,7 @@
     if (pFormatInfo)
     {
         local_pFormatInfo = (VkPhysicalDeviceSparseImageFormatInfo2*)pool->alloc(sizeof(const VkPhysicalDeviceSparseImageFormatInfo2));
-        deepcopy_VkPhysicalDeviceSparseImageFormatInfo2(pool, pFormatInfo, (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo));
+        deepcopy_VkPhysicalDeviceSparseImageFormatInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pFormatInfo, (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo));
     }
     if (local_pFormatInfo)
     {
@@ -11998,7 +12000,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPhysicalDeviceSparseImageFormatInfo2(sFeatureBits, (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo), countPtr);
+        count_VkPhysicalDeviceSparseImageFormatInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (pPropertyCount)
@@ -12013,7 +12015,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
                 {
-                    count_VkSparseImageFormatProperties2(sFeatureBits, (VkSparseImageFormatProperties2*)(pProperties + i), countPtr);
+                    count_VkSparseImageFormatProperties2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageFormatProperties2*)(pProperties + i), countPtr);
                 }
             }
         }
@@ -12030,7 +12032,7 @@
     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPhysicalDeviceSparseImageFormatInfo2(stream, (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo), streamPtrPtr);
+    reservedmarshal_VkPhysicalDeviceSparseImageFormatInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pPropertyCount;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -12050,7 +12052,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            reservedmarshal_VkSparseImageFormatProperties2(stream, (VkSparseImageFormatProperties2*)(pProperties + i), streamPtrPtr);
+            reservedmarshal_VkSparseImageFormatProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageFormatProperties2*)(pProperties + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -12077,7 +12079,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                unmarshal_VkSparseImageFormatProperties2(stream, (VkSparseImageFormatProperties2*)(pProperties + i));
+                unmarshal_VkSparseImageFormatProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageFormatProperties2*)(pProperties + i));
             }
         }
     }
@@ -12172,7 +12174,7 @@
     if (pQueueInfo)
     {
         local_pQueueInfo = (VkDeviceQueueInfo2*)pool->alloc(sizeof(const VkDeviceQueueInfo2));
-        deepcopy_VkDeviceQueueInfo2(pool, pQueueInfo, (VkDeviceQueueInfo2*)(local_pQueueInfo));
+        deepcopy_VkDeviceQueueInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pQueueInfo, (VkDeviceQueueInfo2*)(local_pQueueInfo));
     }
     if (local_pQueueInfo)
     {
@@ -12183,7 +12185,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDeviceQueueInfo2(sFeatureBits, (VkDeviceQueueInfo2*)(local_pQueueInfo), countPtr);
+        count_VkDeviceQueueInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceQueueInfo2*)(local_pQueueInfo), countPtr);
         uint64_t cgen_var_1;
         *countPtr += 8;
     }
@@ -12199,7 +12201,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDeviceQueueInfo2(stream, (VkDeviceQueueInfo2*)(local_pQueueInfo), streamPtrPtr);
+    reservedmarshal_VkDeviceQueueInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceQueueInfo2*)(local_pQueueInfo), streamPtrPtr);
     /* is handle, possibly out */;
     uint64_t cgen_var_1;
     *&cgen_var_1 = (uint64_t)((*pQueue));
@@ -12209,6 +12211,7 @@
     uint64_t cgen_var_2;
     stream->read((uint64_t*)&cgen_var_2, 8);
     stream->handleMapping()->mapHandles_u64_VkQueue(&cgen_var_2, (VkQueue*)pQueue, 1);
+    sResourceTracker->on_vkGetDeviceQueue2(this, device, pQueueInfo, pQueue);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -12238,13 +12241,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkSamplerYcbcrConversionCreateInfo*)pool->alloc(sizeof(const VkSamplerYcbcrConversionCreateInfo));
-        deepcopy_VkSamplerYcbcrConversionCreateInfo(pool, pCreateInfo, (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkSamplerYcbcrConversionCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -12260,12 +12263,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkSamplerYcbcrConversionCreateInfo(sFeatureBits, (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkSamplerYcbcrConversionCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -12282,7 +12285,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkSamplerYcbcrConversionCreateInfo(stream, (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkSamplerYcbcrConversionCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -12290,7 +12293,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -12335,7 +12338,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -12353,7 +12356,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroySamplerYcbcrConversion = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -12379,7 +12382,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkSamplerYcbcrConversion((VkSamplerYcbcrConversion*)&ycbcrConversion);
     stream->flush();
@@ -12412,13 +12415,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkDescriptorUpdateTemplateCreateInfo*)pool->alloc(sizeof(const VkDescriptorUpdateTemplateCreateInfo));
-        deepcopy_VkDescriptorUpdateTemplateCreateInfo(pool, pCreateInfo, (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkDescriptorUpdateTemplateCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -12434,12 +12437,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDescriptorUpdateTemplateCreateInfo(sFeatureBits, (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkDescriptorUpdateTemplateCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -12456,7 +12459,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDescriptorUpdateTemplateCreateInfo(stream, (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkDescriptorUpdateTemplateCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -12464,7 +12467,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -12510,7 +12513,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -12528,7 +12531,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyDescriptorUpdateTemplate = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -12554,7 +12557,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkDescriptorUpdateTemplate((VkDescriptorUpdateTemplate*)&descriptorUpdateTemplate);
     stream->flush();
@@ -12662,7 +12665,7 @@
     if (pExternalBufferInfo)
     {
         local_pExternalBufferInfo = (VkPhysicalDeviceExternalBufferInfo*)pool->alloc(sizeof(const VkPhysicalDeviceExternalBufferInfo));
-        deepcopy_VkPhysicalDeviceExternalBufferInfo(pool, pExternalBufferInfo, (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo));
+        deepcopy_VkPhysicalDeviceExternalBufferInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pExternalBufferInfo, (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo));
     }
     if (local_pExternalBufferInfo)
     {
@@ -12674,8 +12677,8 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPhysicalDeviceExternalBufferInfo(sFeatureBits, (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo), countPtr);
-        count_VkExternalBufferProperties(sFeatureBits, (VkExternalBufferProperties*)(pExternalBufferProperties), countPtr);
+        count_VkPhysicalDeviceExternalBufferInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo), countPtr);
+        count_VkExternalBufferProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalBufferProperties*)(pExternalBufferProperties), countPtr);
     }
     uint32_t packetSize_vkGetPhysicalDeviceExternalBufferProperties = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceExternalBufferProperties);
@@ -12689,9 +12692,9 @@
     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPhysicalDeviceExternalBufferInfo(stream, (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo), streamPtrPtr);
-    reservedmarshal_VkExternalBufferProperties(stream, (VkExternalBufferProperties*)(pExternalBufferProperties), streamPtrPtr);
-    unmarshal_VkExternalBufferProperties(stream, (VkExternalBufferProperties*)(pExternalBufferProperties));
+    reservedmarshal_VkPhysicalDeviceExternalBufferInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo), streamPtrPtr);
+    reservedmarshal_VkExternalBufferProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalBufferProperties*)(pExternalBufferProperties), streamPtrPtr);
+    unmarshal_VkExternalBufferProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalBufferProperties*)(pExternalBufferProperties));
     if (pExternalBufferProperties)
     {
         sResourceTracker->transformImpl_VkExternalBufferProperties_fromhost(pExternalBufferProperties, 1);
@@ -12724,7 +12727,7 @@
     if (pExternalFenceInfo)
     {
         local_pExternalFenceInfo = (VkPhysicalDeviceExternalFenceInfo*)pool->alloc(sizeof(const VkPhysicalDeviceExternalFenceInfo));
-        deepcopy_VkPhysicalDeviceExternalFenceInfo(pool, pExternalFenceInfo, (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo));
+        deepcopy_VkPhysicalDeviceExternalFenceInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pExternalFenceInfo, (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo));
     }
     if (local_pExternalFenceInfo)
     {
@@ -12735,8 +12738,8 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPhysicalDeviceExternalFenceInfo(sFeatureBits, (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo), countPtr);
-        count_VkExternalFenceProperties(sFeatureBits, (VkExternalFenceProperties*)(pExternalFenceProperties), countPtr);
+        count_VkPhysicalDeviceExternalFenceInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo), countPtr);
+        count_VkExternalFenceProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalFenceProperties*)(pExternalFenceProperties), countPtr);
     }
     uint32_t packetSize_vkGetPhysicalDeviceExternalFenceProperties = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceExternalFenceProperties);
@@ -12750,9 +12753,9 @@
     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPhysicalDeviceExternalFenceInfo(stream, (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo), streamPtrPtr);
-    reservedmarshal_VkExternalFenceProperties(stream, (VkExternalFenceProperties*)(pExternalFenceProperties), streamPtrPtr);
-    unmarshal_VkExternalFenceProperties(stream, (VkExternalFenceProperties*)(pExternalFenceProperties));
+    reservedmarshal_VkPhysicalDeviceExternalFenceInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo), streamPtrPtr);
+    reservedmarshal_VkExternalFenceProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalFenceProperties*)(pExternalFenceProperties), streamPtrPtr);
+    unmarshal_VkExternalFenceProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalFenceProperties*)(pExternalFenceProperties));
     if (pExternalFenceProperties)
     {
         transform_fromhost_VkExternalFenceProperties(sResourceTracker, (VkExternalFenceProperties*)(pExternalFenceProperties));
@@ -12784,7 +12787,7 @@
     if (pExternalSemaphoreInfo)
     {
         local_pExternalSemaphoreInfo = (VkPhysicalDeviceExternalSemaphoreInfo*)pool->alloc(sizeof(const VkPhysicalDeviceExternalSemaphoreInfo));
-        deepcopy_VkPhysicalDeviceExternalSemaphoreInfo(pool, pExternalSemaphoreInfo, (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo));
+        deepcopy_VkPhysicalDeviceExternalSemaphoreInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pExternalSemaphoreInfo, (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo));
     }
     if (local_pExternalSemaphoreInfo)
     {
@@ -12795,8 +12798,8 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPhysicalDeviceExternalSemaphoreInfo(sFeatureBits, (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo), countPtr);
-        count_VkExternalSemaphoreProperties(sFeatureBits, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties), countPtr);
+        count_VkPhysicalDeviceExternalSemaphoreInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo), countPtr);
+        count_VkExternalSemaphoreProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties), countPtr);
     }
     uint32_t packetSize_vkGetPhysicalDeviceExternalSemaphoreProperties = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceExternalSemaphoreProperties);
@@ -12810,9 +12813,9 @@
     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPhysicalDeviceExternalSemaphoreInfo(stream, (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo), streamPtrPtr);
-    reservedmarshal_VkExternalSemaphoreProperties(stream, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties), streamPtrPtr);
-    unmarshal_VkExternalSemaphoreProperties(stream, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
+    reservedmarshal_VkPhysicalDeviceExternalSemaphoreInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo), streamPtrPtr);
+    reservedmarshal_VkExternalSemaphoreProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties), streamPtrPtr);
+    unmarshal_VkExternalSemaphoreProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
     if (pExternalSemaphoreProperties)
     {
         transform_fromhost_VkExternalSemaphoreProperties(sResourceTracker, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
@@ -12845,7 +12848,7 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkDescriptorSetLayoutCreateInfo*)pool->alloc(sizeof(const VkDescriptorSetLayoutCreateInfo));
-        deepcopy_VkDescriptorSetLayoutCreateInfo(pool, pCreateInfo, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkDescriptorSetLayoutCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo));
     }
     if (local_pCreateInfo)
     {
@@ -12856,8 +12859,8 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDescriptorSetLayoutCreateInfo(sFeatureBits, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo), countPtr);
-        count_VkDescriptorSetLayoutSupport(sFeatureBits, (VkDescriptorSetLayoutSupport*)(pSupport), countPtr);
+        count_VkDescriptorSetLayoutCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkDescriptorSetLayoutSupport(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorSetLayoutSupport*)(pSupport), countPtr);
     }
     uint32_t packetSize_vkGetDescriptorSetLayoutSupport = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetDescriptorSetLayoutSupport);
@@ -12871,9 +12874,9 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDescriptorSetLayoutCreateInfo(stream, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo), streamPtrPtr);
-    reservedmarshal_VkDescriptorSetLayoutSupport(stream, (VkDescriptorSetLayoutSupport*)(pSupport), streamPtrPtr);
-    unmarshal_VkDescriptorSetLayoutSupport(stream, (VkDescriptorSetLayoutSupport*)(pSupport));
+    reservedmarshal_VkDescriptorSetLayoutCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkDescriptorSetLayoutSupport(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorSetLayoutSupport*)(pSupport), streamPtrPtr);
+    unmarshal_VkDescriptorSetLayoutSupport(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorSetLayoutSupport*)(pSupport));
     if (pSupport)
     {
         transform_fromhost_VkDescriptorSetLayoutSupport(sResourceTracker, (VkDescriptorSetLayoutSupport*)(pSupport));
@@ -13073,13 +13076,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkRenderPassCreateInfo2*)pool->alloc(sizeof(const VkRenderPassCreateInfo2));
-        deepcopy_VkRenderPassCreateInfo2(pool, pCreateInfo, (VkRenderPassCreateInfo2*)(local_pCreateInfo));
+        deepcopy_VkRenderPassCreateInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkRenderPassCreateInfo2*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -13095,12 +13098,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkRenderPassCreateInfo2(sFeatureBits, (VkRenderPassCreateInfo2*)(local_pCreateInfo), countPtr);
+        count_VkRenderPassCreateInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRenderPassCreateInfo2*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -13117,7 +13120,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkRenderPassCreateInfo2(stream, (VkRenderPassCreateInfo2*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkRenderPassCreateInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRenderPassCreateInfo2*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -13125,7 +13128,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -13167,13 +13170,13 @@
     if (pRenderPassBegin)
     {
         local_pRenderPassBegin = (VkRenderPassBeginInfo*)pool->alloc(sizeof(const VkRenderPassBeginInfo));
-        deepcopy_VkRenderPassBeginInfo(pool, pRenderPassBegin, (VkRenderPassBeginInfo*)(local_pRenderPassBegin));
+        deepcopy_VkRenderPassBeginInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRenderPassBegin, (VkRenderPassBeginInfo*)(local_pRenderPassBegin));
     }
     local_pSubpassBeginInfo = nullptr;
     if (pSubpassBeginInfo)
     {
         local_pSubpassBeginInfo = (VkSubpassBeginInfo*)pool->alloc(sizeof(const VkSubpassBeginInfo));
-        deepcopy_VkSubpassBeginInfo(pool, pSubpassBeginInfo, (VkSubpassBeginInfo*)(local_pSubpassBeginInfo));
+        deepcopy_VkSubpassBeginInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubpassBeginInfo, (VkSubpassBeginInfo*)(local_pSubpassBeginInfo));
     }
     if (local_pRenderPassBegin)
     {
@@ -13188,8 +13191,8 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkRenderPassBeginInfo(sFeatureBits, (VkRenderPassBeginInfo*)(local_pRenderPassBegin), countPtr);
-        count_VkSubpassBeginInfo(sFeatureBits, (VkSubpassBeginInfo*)(local_pSubpassBeginInfo), countPtr);
+        count_VkRenderPassBeginInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRenderPassBeginInfo*)(local_pRenderPassBegin), countPtr);
+        count_VkSubpassBeginInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassBeginInfo*)(local_pSubpassBeginInfo), countPtr);
     }
     uint32_t packetSize_vkCmdBeginRenderPass2 = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdBeginRenderPass2 -= 8;
@@ -13205,8 +13208,8 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkRenderPassBeginInfo(stream, (VkRenderPassBeginInfo*)(local_pRenderPassBegin), streamPtrPtr);
-    reservedmarshal_VkSubpassBeginInfo(stream, (VkSubpassBeginInfo*)(local_pSubpassBeginInfo), streamPtrPtr);
+    reservedmarshal_VkRenderPassBeginInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRenderPassBeginInfo*)(local_pRenderPassBegin), streamPtrPtr);
+    reservedmarshal_VkSubpassBeginInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassBeginInfo*)(local_pSubpassBeginInfo), streamPtrPtr);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -13235,13 +13238,13 @@
     if (pSubpassBeginInfo)
     {
         local_pSubpassBeginInfo = (VkSubpassBeginInfo*)pool->alloc(sizeof(const VkSubpassBeginInfo));
-        deepcopy_VkSubpassBeginInfo(pool, pSubpassBeginInfo, (VkSubpassBeginInfo*)(local_pSubpassBeginInfo));
+        deepcopy_VkSubpassBeginInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubpassBeginInfo, (VkSubpassBeginInfo*)(local_pSubpassBeginInfo));
     }
     local_pSubpassEndInfo = nullptr;
     if (pSubpassEndInfo)
     {
         local_pSubpassEndInfo = (VkSubpassEndInfo*)pool->alloc(sizeof(const VkSubpassEndInfo));
-        deepcopy_VkSubpassEndInfo(pool, pSubpassEndInfo, (VkSubpassEndInfo*)(local_pSubpassEndInfo));
+        deepcopy_VkSubpassEndInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubpassEndInfo, (VkSubpassEndInfo*)(local_pSubpassEndInfo));
     }
     if (local_pSubpassBeginInfo)
     {
@@ -13256,8 +13259,8 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkSubpassBeginInfo(sFeatureBits, (VkSubpassBeginInfo*)(local_pSubpassBeginInfo), countPtr);
-        count_VkSubpassEndInfo(sFeatureBits, (VkSubpassEndInfo*)(local_pSubpassEndInfo), countPtr);
+        count_VkSubpassBeginInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassBeginInfo*)(local_pSubpassBeginInfo), countPtr);
+        count_VkSubpassEndInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassEndInfo*)(local_pSubpassEndInfo), countPtr);
     }
     uint32_t packetSize_vkCmdNextSubpass2 = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdNextSubpass2 -= 8;
@@ -13273,8 +13276,8 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkSubpassBeginInfo(stream, (VkSubpassBeginInfo*)(local_pSubpassBeginInfo), streamPtrPtr);
-    reservedmarshal_VkSubpassEndInfo(stream, (VkSubpassEndInfo*)(local_pSubpassEndInfo), streamPtrPtr);
+    reservedmarshal_VkSubpassBeginInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassBeginInfo*)(local_pSubpassBeginInfo), streamPtrPtr);
+    reservedmarshal_VkSubpassEndInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassEndInfo*)(local_pSubpassEndInfo), streamPtrPtr);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -13301,7 +13304,7 @@
     if (pSubpassEndInfo)
     {
         local_pSubpassEndInfo = (VkSubpassEndInfo*)pool->alloc(sizeof(const VkSubpassEndInfo));
-        deepcopy_VkSubpassEndInfo(pool, pSubpassEndInfo, (VkSubpassEndInfo*)(local_pSubpassEndInfo));
+        deepcopy_VkSubpassEndInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubpassEndInfo, (VkSubpassEndInfo*)(local_pSubpassEndInfo));
     }
     if (local_pSubpassEndInfo)
     {
@@ -13312,7 +13315,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkSubpassEndInfo(sFeatureBits, (VkSubpassEndInfo*)(local_pSubpassEndInfo), countPtr);
+        count_VkSubpassEndInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassEndInfo*)(local_pSubpassEndInfo), countPtr);
     }
     uint32_t packetSize_vkCmdEndRenderPass2 = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdEndRenderPass2 -= 8;
@@ -13328,7 +13331,7 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkSubpassEndInfo(stream, (VkSubpassEndInfo*)(local_pSubpassEndInfo), streamPtrPtr);
+    reservedmarshal_VkSubpassEndInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassEndInfo*)(local_pSubpassEndInfo), streamPtrPtr);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -13472,7 +13475,7 @@
     if (pWaitInfo)
     {
         local_pWaitInfo = (VkSemaphoreWaitInfo*)pool->alloc(sizeof(const VkSemaphoreWaitInfo));
-        deepcopy_VkSemaphoreWaitInfo(pool, pWaitInfo, (VkSemaphoreWaitInfo*)(local_pWaitInfo));
+        deepcopy_VkSemaphoreWaitInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pWaitInfo, (VkSemaphoreWaitInfo*)(local_pWaitInfo));
     }
     local_timeout = timeout;
     if (local_pWaitInfo)
@@ -13484,7 +13487,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkSemaphoreWaitInfo(sFeatureBits, (VkSemaphoreWaitInfo*)(local_pWaitInfo), countPtr);
+        count_VkSemaphoreWaitInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSemaphoreWaitInfo*)(local_pWaitInfo), countPtr);
         *countPtr += sizeof(uint64_t);
     }
     uint32_t packetSize_vkWaitSemaphores = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -13499,7 +13502,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkSemaphoreWaitInfo(stream, (VkSemaphoreWaitInfo*)(local_pWaitInfo), streamPtrPtr);
+    reservedmarshal_VkSemaphoreWaitInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSemaphoreWaitInfo*)(local_pWaitInfo), streamPtrPtr);
     memcpy(*streamPtrPtr, (uint64_t*)&local_timeout, sizeof(uint64_t));
     *streamPtrPtr += sizeof(uint64_t);
     VkResult vkWaitSemaphores_VkResult_return = (VkResult)0;
@@ -13531,7 +13534,7 @@
     if (pSignalInfo)
     {
         local_pSignalInfo = (VkSemaphoreSignalInfo*)pool->alloc(sizeof(const VkSemaphoreSignalInfo));
-        deepcopy_VkSemaphoreSignalInfo(pool, pSignalInfo, (VkSemaphoreSignalInfo*)(local_pSignalInfo));
+        deepcopy_VkSemaphoreSignalInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSignalInfo, (VkSemaphoreSignalInfo*)(local_pSignalInfo));
     }
     if (local_pSignalInfo)
     {
@@ -13542,7 +13545,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkSemaphoreSignalInfo(sFeatureBits, (VkSemaphoreSignalInfo*)(local_pSignalInfo), countPtr);
+        count_VkSemaphoreSignalInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSemaphoreSignalInfo*)(local_pSignalInfo), countPtr);
     }
     uint32_t packetSize_vkSignalSemaphore = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkSignalSemaphore);
@@ -13556,7 +13559,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkSemaphoreSignalInfo(stream, (VkSemaphoreSignalInfo*)(local_pSignalInfo), streamPtrPtr);
+    reservedmarshal_VkSemaphoreSignalInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSemaphoreSignalInfo*)(local_pSignalInfo), streamPtrPtr);
     VkResult vkSignalSemaphore_VkResult_return = (VkResult)0;
     stream->read(&vkSignalSemaphore_VkResult_return, sizeof(VkResult));
     ++encodeCount;;
@@ -13586,7 +13589,7 @@
     if (pInfo)
     {
         local_pInfo = (VkBufferDeviceAddressInfo*)pool->alloc(sizeof(const VkBufferDeviceAddressInfo));
-        deepcopy_VkBufferDeviceAddressInfo(pool, pInfo, (VkBufferDeviceAddressInfo*)(local_pInfo));
+        deepcopy_VkBufferDeviceAddressInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo, (VkBufferDeviceAddressInfo*)(local_pInfo));
     }
     if (local_pInfo)
     {
@@ -13597,7 +13600,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkBufferDeviceAddressInfo(sFeatureBits, (VkBufferDeviceAddressInfo*)(local_pInfo), countPtr);
+        count_VkBufferDeviceAddressInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferDeviceAddressInfo*)(local_pInfo), countPtr);
     }
     uint32_t packetSize_vkGetBufferDeviceAddress = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetBufferDeviceAddress);
@@ -13611,7 +13614,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkBufferDeviceAddressInfo(stream, (VkBufferDeviceAddressInfo*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkBufferDeviceAddressInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferDeviceAddressInfo*)(local_pInfo), streamPtrPtr);
     VkDeviceAddress vkGetBufferDeviceAddress_VkDeviceAddress_return = (VkDeviceAddress)0;
     stream->read(&vkGetBufferDeviceAddress_VkDeviceAddress_return, sizeof(VkDeviceAddress));
     ++encodeCount;;
@@ -13641,7 +13644,7 @@
     if (pInfo)
     {
         local_pInfo = (VkBufferDeviceAddressInfo*)pool->alloc(sizeof(const VkBufferDeviceAddressInfo));
-        deepcopy_VkBufferDeviceAddressInfo(pool, pInfo, (VkBufferDeviceAddressInfo*)(local_pInfo));
+        deepcopy_VkBufferDeviceAddressInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo, (VkBufferDeviceAddressInfo*)(local_pInfo));
     }
     if (local_pInfo)
     {
@@ -13652,7 +13655,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkBufferDeviceAddressInfo(sFeatureBits, (VkBufferDeviceAddressInfo*)(local_pInfo), countPtr);
+        count_VkBufferDeviceAddressInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferDeviceAddressInfo*)(local_pInfo), countPtr);
     }
     uint32_t packetSize_vkGetBufferOpaqueCaptureAddress = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetBufferOpaqueCaptureAddress);
@@ -13666,7 +13669,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkBufferDeviceAddressInfo(stream, (VkBufferDeviceAddressInfo*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkBufferDeviceAddressInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferDeviceAddressInfo*)(local_pInfo), streamPtrPtr);
     uint64_t vkGetBufferOpaqueCaptureAddress_uint64_t_return = (uint64_t)0;
     stream->read(&vkGetBufferOpaqueCaptureAddress_uint64_t_return, sizeof(uint64_t));
     ++encodeCount;;
@@ -13696,7 +13699,7 @@
     if (pInfo)
     {
         local_pInfo = (VkDeviceMemoryOpaqueCaptureAddressInfo*)pool->alloc(sizeof(const VkDeviceMemoryOpaqueCaptureAddressInfo));
-        deepcopy_VkDeviceMemoryOpaqueCaptureAddressInfo(pool, pInfo, (VkDeviceMemoryOpaqueCaptureAddressInfo*)(local_pInfo));
+        deepcopy_VkDeviceMemoryOpaqueCaptureAddressInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo, (VkDeviceMemoryOpaqueCaptureAddressInfo*)(local_pInfo));
     }
     if (local_pInfo)
     {
@@ -13707,7 +13710,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDeviceMemoryOpaqueCaptureAddressInfo(sFeatureBits, (VkDeviceMemoryOpaqueCaptureAddressInfo*)(local_pInfo), countPtr);
+        count_VkDeviceMemoryOpaqueCaptureAddressInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceMemoryOpaqueCaptureAddressInfo*)(local_pInfo), countPtr);
     }
     uint32_t packetSize_vkGetDeviceMemoryOpaqueCaptureAddress = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceMemoryOpaqueCaptureAddress);
@@ -13721,7 +13724,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDeviceMemoryOpaqueCaptureAddressInfo(stream, (VkDeviceMemoryOpaqueCaptureAddressInfo*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkDeviceMemoryOpaqueCaptureAddressInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceMemoryOpaqueCaptureAddressInfo*)(local_pInfo), streamPtrPtr);
     uint64_t vkGetDeviceMemoryOpaqueCaptureAddress_uint64_t_return = (uint64_t)0;
     stream->read(&vkGetDeviceMemoryOpaqueCaptureAddress_uint64_t_return, sizeof(uint64_t));
     ++encodeCount;;
@@ -13756,7 +13759,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -13774,7 +13777,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroySurfaceKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -13800,7 +13803,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkSurfaceKHR((VkSurfaceKHR*)&surface);
     stream->flush();
@@ -13896,7 +13899,7 @@
         *countPtr += 1 * 8;
         uint64_t cgen_var_1;
         *countPtr += 1 * 8;
-        count_VkSurfaceCapabilitiesKHR(sFeatureBits, (VkSurfaceCapabilitiesKHR*)(pSurfaceCapabilities), countPtr);
+        count_VkSurfaceCapabilitiesKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSurfaceCapabilitiesKHR*)(pSurfaceCapabilities), countPtr);
     }
     uint32_t packetSize_vkGetPhysicalDeviceSurfaceCapabilitiesKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceSurfaceCapabilitiesKHR);
@@ -13914,8 +13917,8 @@
     *&cgen_var_1 = get_host_u64_VkSurfaceKHR((*&local_surface));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkSurfaceCapabilitiesKHR(stream, (VkSurfaceCapabilitiesKHR*)(pSurfaceCapabilities), streamPtrPtr);
-    unmarshal_VkSurfaceCapabilitiesKHR(stream, (VkSurfaceCapabilitiesKHR*)(pSurfaceCapabilities));
+    reservedmarshal_VkSurfaceCapabilitiesKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSurfaceCapabilitiesKHR*)(pSurfaceCapabilities), streamPtrPtr);
+    unmarshal_VkSurfaceCapabilitiesKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSurfaceCapabilitiesKHR*)(pSurfaceCapabilities));
     if (pSurfaceCapabilities)
     {
         transform_fromhost_VkSurfaceCapabilitiesKHR(sResourceTracker, (VkSurfaceCapabilitiesKHR*)(pSurfaceCapabilities));
@@ -13969,7 +13972,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pSurfaceFormatCount)); ++i)
                 {
-                    count_VkSurfaceFormatKHR(sFeatureBits, (VkSurfaceFormatKHR*)(pSurfaceFormats + i), countPtr);
+                    count_VkSurfaceFormatKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSurfaceFormatKHR*)(pSurfaceFormats + i), countPtr);
                 }
             }
         }
@@ -14009,7 +14012,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pSurfaceFormatCount)); ++i)
         {
-            reservedmarshal_VkSurfaceFormatKHR(stream, (VkSurfaceFormatKHR*)(pSurfaceFormats + i), streamPtrPtr);
+            reservedmarshal_VkSurfaceFormatKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSurfaceFormatKHR*)(pSurfaceFormats + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -14036,7 +14039,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pSurfaceFormatCount)); ++i)
             {
-                unmarshal_VkSurfaceFormatKHR(stream, (VkSurfaceFormatKHR*)(pSurfaceFormats + i));
+                unmarshal_VkSurfaceFormatKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSurfaceFormatKHR*)(pSurfaceFormats + i));
             }
         }
     }
@@ -14193,13 +14196,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkSwapchainCreateInfoKHR*)pool->alloc(sizeof(const VkSwapchainCreateInfoKHR));
-        deepcopy_VkSwapchainCreateInfoKHR(pool, pCreateInfo, (VkSwapchainCreateInfoKHR*)(local_pCreateInfo));
+        deepcopy_VkSwapchainCreateInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkSwapchainCreateInfoKHR*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -14215,12 +14218,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkSwapchainCreateInfoKHR(sFeatureBits, (VkSwapchainCreateInfoKHR*)(local_pCreateInfo), countPtr);
+        count_VkSwapchainCreateInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSwapchainCreateInfoKHR*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -14237,7 +14240,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkSwapchainCreateInfoKHR(stream, (VkSwapchainCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkSwapchainCreateInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSwapchainCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -14245,7 +14248,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -14290,7 +14293,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -14308,7 +14311,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroySwapchainKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -14334,7 +14337,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkSwapchainKHR((VkSwapchainKHR*)&swapchain);
     stream->flush();
@@ -14571,7 +14574,7 @@
     if (pPresentInfo)
     {
         local_pPresentInfo = (VkPresentInfoKHR*)pool->alloc(sizeof(const VkPresentInfoKHR));
-        deepcopy_VkPresentInfoKHR(pool, pPresentInfo, (VkPresentInfoKHR*)(local_pPresentInfo));
+        deepcopy_VkPresentInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pPresentInfo, (VkPresentInfoKHR*)(local_pPresentInfo));
     }
     if (local_pPresentInfo)
     {
@@ -14582,7 +14585,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPresentInfoKHR(sFeatureBits, (VkPresentInfoKHR*)(local_pPresentInfo), countPtr);
+        count_VkPresentInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPresentInfoKHR*)(local_pPresentInfo), countPtr);
     }
     uint32_t packetSize_vkQueuePresentKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkQueuePresentKHR);
@@ -14596,7 +14599,7 @@
     *&cgen_var_0 = get_host_u64_VkQueue((*&local_queue));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPresentInfoKHR(stream, (VkPresentInfoKHR*)(local_pPresentInfo), streamPtrPtr);
+    reservedmarshal_VkPresentInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPresentInfoKHR*)(local_pPresentInfo), streamPtrPtr);
     VkResult vkQueuePresentKHR_VkResult_return = (VkResult)0;
     stream->read(&vkQueuePresentKHR_VkResult_return, sizeof(VkResult));
     ++encodeCount;;
@@ -14626,7 +14629,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDeviceGroupPresentCapabilitiesKHR(sFeatureBits, (VkDeviceGroupPresentCapabilitiesKHR*)(pDeviceGroupPresentCapabilities), countPtr);
+        count_VkDeviceGroupPresentCapabilitiesKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceGroupPresentCapabilitiesKHR*)(pDeviceGroupPresentCapabilities), countPtr);
     }
     uint32_t packetSize_vkGetDeviceGroupPresentCapabilitiesKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceGroupPresentCapabilitiesKHR);
@@ -14640,8 +14643,8 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDeviceGroupPresentCapabilitiesKHR(stream, (VkDeviceGroupPresentCapabilitiesKHR*)(pDeviceGroupPresentCapabilities), streamPtrPtr);
-    unmarshal_VkDeviceGroupPresentCapabilitiesKHR(stream, (VkDeviceGroupPresentCapabilitiesKHR*)(pDeviceGroupPresentCapabilities));
+    reservedmarshal_VkDeviceGroupPresentCapabilitiesKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceGroupPresentCapabilitiesKHR*)(pDeviceGroupPresentCapabilities), streamPtrPtr);
+    unmarshal_VkDeviceGroupPresentCapabilitiesKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceGroupPresentCapabilitiesKHR*)(pDeviceGroupPresentCapabilities));
     if (pDeviceGroupPresentCapabilities)
     {
         transform_fromhost_VkDeviceGroupPresentCapabilitiesKHR(sResourceTracker, (VkDeviceGroupPresentCapabilitiesKHR*)(pDeviceGroupPresentCapabilities));
@@ -14773,7 +14776,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pRectCount)); ++i)
                 {
-                    count_VkRect2D(sFeatureBits, (VkRect2D*)(pRects + i), countPtr);
+                    count_VkRect2D(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRect2D*)(pRects + i), countPtr);
                 }
             }
         }
@@ -14813,7 +14816,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pRectCount)); ++i)
         {
-            reservedmarshal_VkRect2D(stream, (VkRect2D*)(pRects + i), streamPtrPtr);
+            reservedmarshal_VkRect2D(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRect2D*)(pRects + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -14840,7 +14843,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pRectCount)); ++i)
             {
-                unmarshal_VkRect2D(stream, (VkRect2D*)(pRects + i));
+                unmarshal_VkRect2D(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRect2D*)(pRects + i));
             }
         }
     }
@@ -14884,7 +14887,7 @@
     if (pAcquireInfo)
     {
         local_pAcquireInfo = (VkAcquireNextImageInfoKHR*)pool->alloc(sizeof(const VkAcquireNextImageInfoKHR));
-        deepcopy_VkAcquireNextImageInfoKHR(pool, pAcquireInfo, (VkAcquireNextImageInfoKHR*)(local_pAcquireInfo));
+        deepcopy_VkAcquireNextImageInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAcquireInfo, (VkAcquireNextImageInfoKHR*)(local_pAcquireInfo));
     }
     if (local_pAcquireInfo)
     {
@@ -14895,7 +14898,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkAcquireNextImageInfoKHR(sFeatureBits, (VkAcquireNextImageInfoKHR*)(local_pAcquireInfo), countPtr);
+        count_VkAcquireNextImageInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAcquireNextImageInfoKHR*)(local_pAcquireInfo), countPtr);
         *countPtr += sizeof(uint32_t);
     }
     uint32_t packetSize_vkAcquireNextImage2KHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -14910,7 +14913,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkAcquireNextImageInfoKHR(stream, (VkAcquireNextImageInfoKHR*)(local_pAcquireInfo), streamPtrPtr);
+    reservedmarshal_VkAcquireNextImageInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAcquireNextImageInfoKHR*)(local_pAcquireInfo), streamPtrPtr);
     memcpy(*streamPtrPtr, (uint32_t*)pImageIndex, sizeof(uint32_t));
     *streamPtrPtr += sizeof(uint32_t);
     stream->read((uint32_t*)pImageIndex, sizeof(uint32_t));
@@ -14960,7 +14963,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
                 {
-                    count_VkDisplayPropertiesKHR(sFeatureBits, (VkDisplayPropertiesKHR*)(pProperties + i), countPtr);
+                    count_VkDisplayPropertiesKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPropertiesKHR*)(pProperties + i), countPtr);
                 }
             }
         }
@@ -14996,7 +14999,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            reservedmarshal_VkDisplayPropertiesKHR(stream, (VkDisplayPropertiesKHR*)(pProperties + i), streamPtrPtr);
+            reservedmarshal_VkDisplayPropertiesKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPropertiesKHR*)(pProperties + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -15023,7 +15026,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                unmarshal_VkDisplayPropertiesKHR(stream, (VkDisplayPropertiesKHR*)(pProperties + i));
+                unmarshal_VkDisplayPropertiesKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPropertiesKHR*)(pProperties + i));
             }
         }
     }
@@ -15081,7 +15084,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
                 {
-                    count_VkDisplayPlanePropertiesKHR(sFeatureBits, (VkDisplayPlanePropertiesKHR*)(pProperties + i), countPtr);
+                    count_VkDisplayPlanePropertiesKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPlanePropertiesKHR*)(pProperties + i), countPtr);
                 }
             }
         }
@@ -15117,7 +15120,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            reservedmarshal_VkDisplayPlanePropertiesKHR(stream, (VkDisplayPlanePropertiesKHR*)(pProperties + i), streamPtrPtr);
+            reservedmarshal_VkDisplayPlanePropertiesKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPlanePropertiesKHR*)(pProperties + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -15144,7 +15147,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                unmarshal_VkDisplayPlanePropertiesKHR(stream, (VkDisplayPlanePropertiesKHR*)(pProperties + i));
+                unmarshal_VkDisplayPlanePropertiesKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPlanePropertiesKHR*)(pProperties + i));
             }
         }
     }
@@ -15332,7 +15335,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
                 {
-                    count_VkDisplayModePropertiesKHR(sFeatureBits, (VkDisplayModePropertiesKHR*)(pProperties + i), countPtr);
+                    count_VkDisplayModePropertiesKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayModePropertiesKHR*)(pProperties + i), countPtr);
                 }
             }
         }
@@ -15372,7 +15375,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            reservedmarshal_VkDisplayModePropertiesKHR(stream, (VkDisplayModePropertiesKHR*)(pProperties + i), streamPtrPtr);
+            reservedmarshal_VkDisplayModePropertiesKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayModePropertiesKHR*)(pProperties + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -15399,7 +15402,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                unmarshal_VkDisplayModePropertiesKHR(stream, (VkDisplayModePropertiesKHR*)(pProperties + i));
+                unmarshal_VkDisplayModePropertiesKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayModePropertiesKHR*)(pProperties + i));
             }
         }
     }
@@ -15448,13 +15451,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkDisplayModeCreateInfoKHR*)pool->alloc(sizeof(const VkDisplayModeCreateInfoKHR));
-        deepcopy_VkDisplayModeCreateInfoKHR(pool, pCreateInfo, (VkDisplayModeCreateInfoKHR*)(local_pCreateInfo));
+        deepcopy_VkDisplayModeCreateInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkDisplayModeCreateInfoKHR*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -15472,12 +15475,12 @@
         *countPtr += 1 * 8;
         uint64_t cgen_var_1;
         *countPtr += 1 * 8;
-        count_VkDisplayModeCreateInfoKHR(sFeatureBits, (VkDisplayModeCreateInfoKHR*)(local_pCreateInfo), countPtr);
+        count_VkDisplayModeCreateInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayModeCreateInfoKHR*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_2;
         *countPtr += 8;
@@ -15498,7 +15501,7 @@
     *&cgen_var_1 = get_host_u64_VkDisplayKHR((*&local_display));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDisplayModeCreateInfoKHR(stream, (VkDisplayModeCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkDisplayModeCreateInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayModeCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_2, 8);
@@ -15506,7 +15509,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_3;
@@ -15557,7 +15560,7 @@
         uint64_t cgen_var_1;
         *countPtr += 1 * 8;
         *countPtr += sizeof(uint32_t);
-        count_VkDisplayPlaneCapabilitiesKHR(sFeatureBits, (VkDisplayPlaneCapabilitiesKHR*)(pCapabilities), countPtr);
+        count_VkDisplayPlaneCapabilitiesKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPlaneCapabilitiesKHR*)(pCapabilities), countPtr);
     }
     uint32_t packetSize_vkGetDisplayPlaneCapabilitiesKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetDisplayPlaneCapabilitiesKHR);
@@ -15577,8 +15580,8 @@
     *streamPtrPtr += 1 * 8;
     memcpy(*streamPtrPtr, (uint32_t*)&local_planeIndex, sizeof(uint32_t));
     *streamPtrPtr += sizeof(uint32_t);
-    reservedmarshal_VkDisplayPlaneCapabilitiesKHR(stream, (VkDisplayPlaneCapabilitiesKHR*)(pCapabilities), streamPtrPtr);
-    unmarshal_VkDisplayPlaneCapabilitiesKHR(stream, (VkDisplayPlaneCapabilitiesKHR*)(pCapabilities));
+    reservedmarshal_VkDisplayPlaneCapabilitiesKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPlaneCapabilitiesKHR*)(pCapabilities), streamPtrPtr);
+    unmarshal_VkDisplayPlaneCapabilitiesKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPlaneCapabilitiesKHR*)(pCapabilities));
     if (pCapabilities)
     {
         transform_fromhost_VkDisplayPlaneCapabilitiesKHR(sResourceTracker, (VkDisplayPlaneCapabilitiesKHR*)(pCapabilities));
@@ -15615,13 +15618,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkDisplaySurfaceCreateInfoKHR*)pool->alloc(sizeof(const VkDisplaySurfaceCreateInfoKHR));
-        deepcopy_VkDisplaySurfaceCreateInfoKHR(pool, pCreateInfo, (VkDisplaySurfaceCreateInfoKHR*)(local_pCreateInfo));
+        deepcopy_VkDisplaySurfaceCreateInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkDisplaySurfaceCreateInfoKHR*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -15637,12 +15640,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDisplaySurfaceCreateInfoKHR(sFeatureBits, (VkDisplaySurfaceCreateInfoKHR*)(local_pCreateInfo), countPtr);
+        count_VkDisplaySurfaceCreateInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplaySurfaceCreateInfoKHR*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -15659,7 +15662,7 @@
     *&cgen_var_0 = get_host_u64_VkInstance((*&local_instance));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDisplaySurfaceCreateInfoKHR(stream, (VkDisplaySurfaceCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkDisplaySurfaceCreateInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplaySurfaceCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -15667,7 +15670,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -15717,14 +15720,14 @@
         local_pCreateInfos = (VkSwapchainCreateInfoKHR*)pool->alloc(((swapchainCount)) * sizeof(const VkSwapchainCreateInfoKHR));
         for (uint32_t i = 0; i < (uint32_t)((swapchainCount)); ++i)
         {
-            deepcopy_VkSwapchainCreateInfoKHR(pool, pCreateInfos + i, (VkSwapchainCreateInfoKHR*)(local_pCreateInfos + i));
+            deepcopy_VkSwapchainCreateInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfos + i, (VkSwapchainCreateInfoKHR*)(local_pCreateInfos + i));
         }
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfos)
@@ -15746,13 +15749,13 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((swapchainCount)); ++i)
         {
-            count_VkSwapchainCreateInfoKHR(sFeatureBits, (VkSwapchainCreateInfoKHR*)(local_pCreateInfos + i), countPtr);
+            count_VkSwapchainCreateInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSwapchainCreateInfoKHR*)(local_pCreateInfos + i), countPtr);
         }
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         if (((swapchainCount)))
         {
@@ -15775,7 +15778,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((swapchainCount)); ++i)
     {
-        reservedmarshal_VkSwapchainCreateInfoKHR(stream, (VkSwapchainCreateInfoKHR*)(local_pCreateInfos + i), streamPtrPtr);
+        reservedmarshal_VkSwapchainCreateInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSwapchainCreateInfoKHR*)(local_pCreateInfos + i), streamPtrPtr);
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
@@ -15784,7 +15787,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     if (((swapchainCount)))
@@ -15839,13 +15842,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkXlibSurfaceCreateInfoKHR*)pool->alloc(sizeof(const VkXlibSurfaceCreateInfoKHR));
-        deepcopy_VkXlibSurfaceCreateInfoKHR(pool, pCreateInfo, (VkXlibSurfaceCreateInfoKHR*)(local_pCreateInfo));
+        deepcopy_VkXlibSurfaceCreateInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkXlibSurfaceCreateInfoKHR*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -15861,12 +15864,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkXlibSurfaceCreateInfoKHR(sFeatureBits, (VkXlibSurfaceCreateInfoKHR*)(local_pCreateInfo), countPtr);
+        count_VkXlibSurfaceCreateInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkXlibSurfaceCreateInfoKHR*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -15883,7 +15886,7 @@
     *&cgen_var_0 = get_host_u64_VkInstance((*&local_instance));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkXlibSurfaceCreateInfoKHR(stream, (VkXlibSurfaceCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkXlibSurfaceCreateInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkXlibSurfaceCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -15891,7 +15894,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -15994,13 +15997,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkXcbSurfaceCreateInfoKHR*)pool->alloc(sizeof(const VkXcbSurfaceCreateInfoKHR));
-        deepcopy_VkXcbSurfaceCreateInfoKHR(pool, pCreateInfo, (VkXcbSurfaceCreateInfoKHR*)(local_pCreateInfo));
+        deepcopy_VkXcbSurfaceCreateInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkXcbSurfaceCreateInfoKHR*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -16016,12 +16019,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkXcbSurfaceCreateInfoKHR(sFeatureBits, (VkXcbSurfaceCreateInfoKHR*)(local_pCreateInfo), countPtr);
+        count_VkXcbSurfaceCreateInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkXcbSurfaceCreateInfoKHR*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -16038,7 +16041,7 @@
     *&cgen_var_0 = get_host_u64_VkInstance((*&local_instance));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkXcbSurfaceCreateInfoKHR(stream, (VkXcbSurfaceCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkXcbSurfaceCreateInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkXcbSurfaceCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -16046,7 +16049,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -16149,13 +16152,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkWaylandSurfaceCreateInfoKHR*)pool->alloc(sizeof(const VkWaylandSurfaceCreateInfoKHR));
-        deepcopy_VkWaylandSurfaceCreateInfoKHR(pool, pCreateInfo, (VkWaylandSurfaceCreateInfoKHR*)(local_pCreateInfo));
+        deepcopy_VkWaylandSurfaceCreateInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkWaylandSurfaceCreateInfoKHR*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -16171,12 +16174,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkWaylandSurfaceCreateInfoKHR(sFeatureBits, (VkWaylandSurfaceCreateInfoKHR*)(local_pCreateInfo), countPtr);
+        count_VkWaylandSurfaceCreateInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkWaylandSurfaceCreateInfoKHR*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -16193,7 +16196,7 @@
     *&cgen_var_0 = get_host_u64_VkInstance((*&local_instance));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkWaylandSurfaceCreateInfoKHR(stream, (VkWaylandSurfaceCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkWaylandSurfaceCreateInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkWaylandSurfaceCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -16201,7 +16204,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -16298,13 +16301,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkAndroidSurfaceCreateInfoKHR*)pool->alloc(sizeof(const VkAndroidSurfaceCreateInfoKHR));
-        deepcopy_VkAndroidSurfaceCreateInfoKHR(pool, pCreateInfo, (VkAndroidSurfaceCreateInfoKHR*)(local_pCreateInfo));
+        deepcopy_VkAndroidSurfaceCreateInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkAndroidSurfaceCreateInfoKHR*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -16320,12 +16323,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkAndroidSurfaceCreateInfoKHR(sFeatureBits, (VkAndroidSurfaceCreateInfoKHR*)(local_pCreateInfo), countPtr);
+        count_VkAndroidSurfaceCreateInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAndroidSurfaceCreateInfoKHR*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -16342,7 +16345,7 @@
     *&cgen_var_0 = get_host_u64_VkInstance((*&local_instance));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkAndroidSurfaceCreateInfoKHR(stream, (VkAndroidSurfaceCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkAndroidSurfaceCreateInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAndroidSurfaceCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -16350,7 +16353,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -16395,13 +16398,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkWin32SurfaceCreateInfoKHR*)pool->alloc(sizeof(const VkWin32SurfaceCreateInfoKHR));
-        deepcopy_VkWin32SurfaceCreateInfoKHR(pool, pCreateInfo, (VkWin32SurfaceCreateInfoKHR*)(local_pCreateInfo));
+        deepcopy_VkWin32SurfaceCreateInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkWin32SurfaceCreateInfoKHR*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -16417,12 +16420,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkWin32SurfaceCreateInfoKHR(sFeatureBits, (VkWin32SurfaceCreateInfoKHR*)(local_pCreateInfo), countPtr);
+        count_VkWin32SurfaceCreateInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkWin32SurfaceCreateInfoKHR*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -16439,7 +16442,7 @@
     *&cgen_var_0 = get_host_u64_VkInstance((*&local_instance));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkWin32SurfaceCreateInfoKHR(stream, (VkWin32SurfaceCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkWin32SurfaceCreateInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkWin32SurfaceCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -16447,7 +16450,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -16540,7 +16543,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPhysicalDeviceFeatures2(sFeatureBits, (VkPhysicalDeviceFeatures2*)(pFeatures), countPtr);
+        count_VkPhysicalDeviceFeatures2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceFeatures2*)(pFeatures), countPtr);
     }
     uint32_t packetSize_vkGetPhysicalDeviceFeatures2KHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceFeatures2KHR);
@@ -16554,8 +16557,8 @@
     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPhysicalDeviceFeatures2(stream, (VkPhysicalDeviceFeatures2*)(pFeatures), streamPtrPtr);
-    unmarshal_VkPhysicalDeviceFeatures2(stream, (VkPhysicalDeviceFeatures2*)(pFeatures));
+    reservedmarshal_VkPhysicalDeviceFeatures2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceFeatures2*)(pFeatures), streamPtrPtr);
+    unmarshal_VkPhysicalDeviceFeatures2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceFeatures2*)(pFeatures));
     if (pFeatures)
     {
         transform_fromhost_VkPhysicalDeviceFeatures2(sResourceTracker, (VkPhysicalDeviceFeatures2*)(pFeatures));
@@ -16586,7 +16589,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPhysicalDeviceProperties2(sFeatureBits, (VkPhysicalDeviceProperties2*)(pProperties), countPtr);
+        count_VkPhysicalDeviceProperties2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceProperties2*)(pProperties), countPtr);
     }
     uint32_t packetSize_vkGetPhysicalDeviceProperties2KHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceProperties2KHR);
@@ -16600,8 +16603,8 @@
     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPhysicalDeviceProperties2(stream, (VkPhysicalDeviceProperties2*)(pProperties), streamPtrPtr);
-    unmarshal_VkPhysicalDeviceProperties2(stream, (VkPhysicalDeviceProperties2*)(pProperties));
+    reservedmarshal_VkPhysicalDeviceProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceProperties2*)(pProperties), streamPtrPtr);
+    unmarshal_VkPhysicalDeviceProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceProperties2*)(pProperties));
     if (pProperties)
     {
         transform_fromhost_VkPhysicalDeviceProperties2(sResourceTracker, (VkPhysicalDeviceProperties2*)(pProperties));
@@ -16637,7 +16640,7 @@
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
         *countPtr += sizeof(VkFormat);
-        count_VkFormatProperties2(sFeatureBits, (VkFormatProperties2*)(pFormatProperties), countPtr);
+        count_VkFormatProperties2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFormatProperties2*)(pFormatProperties), countPtr);
     }
     uint32_t packetSize_vkGetPhysicalDeviceFormatProperties2KHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceFormatProperties2KHR);
@@ -16653,8 +16656,8 @@
     *streamPtrPtr += 1 * 8;
     memcpy(*streamPtrPtr, (VkFormat*)&local_format, sizeof(VkFormat));
     *streamPtrPtr += sizeof(VkFormat);
-    reservedmarshal_VkFormatProperties2(stream, (VkFormatProperties2*)(pFormatProperties), streamPtrPtr);
-    unmarshal_VkFormatProperties2(stream, (VkFormatProperties2*)(pFormatProperties));
+    reservedmarshal_VkFormatProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFormatProperties2*)(pFormatProperties), streamPtrPtr);
+    unmarshal_VkFormatProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFormatProperties2*)(pFormatProperties));
     if (pFormatProperties)
     {
         transform_fromhost_VkFormatProperties2(sResourceTracker, (VkFormatProperties2*)(pFormatProperties));
@@ -16686,7 +16689,7 @@
     if (pImageFormatInfo)
     {
         local_pImageFormatInfo = (VkPhysicalDeviceImageFormatInfo2*)pool->alloc(sizeof(const VkPhysicalDeviceImageFormatInfo2));
-        deepcopy_VkPhysicalDeviceImageFormatInfo2(pool, pImageFormatInfo, (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo));
+        deepcopy_VkPhysicalDeviceImageFormatInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pImageFormatInfo, (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo));
     }
     if (local_pImageFormatInfo)
     {
@@ -16697,8 +16700,8 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPhysicalDeviceImageFormatInfo2(sFeatureBits, (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo), countPtr);
-        count_VkImageFormatProperties2(sFeatureBits, (VkImageFormatProperties2*)(pImageFormatProperties), countPtr);
+        count_VkPhysicalDeviceImageFormatInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo), countPtr);
+        count_VkImageFormatProperties2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageFormatProperties2*)(pImageFormatProperties), countPtr);
     }
     uint32_t packetSize_vkGetPhysicalDeviceImageFormatProperties2KHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceImageFormatProperties2KHR);
@@ -16712,9 +16715,9 @@
     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPhysicalDeviceImageFormatInfo2(stream, (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo), streamPtrPtr);
-    reservedmarshal_VkImageFormatProperties2(stream, (VkImageFormatProperties2*)(pImageFormatProperties), streamPtrPtr);
-    unmarshal_VkImageFormatProperties2(stream, (VkImageFormatProperties2*)(pImageFormatProperties));
+    reservedmarshal_VkPhysicalDeviceImageFormatInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo), streamPtrPtr);
+    reservedmarshal_VkImageFormatProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageFormatProperties2*)(pImageFormatProperties), streamPtrPtr);
+    unmarshal_VkImageFormatProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageFormatProperties2*)(pImageFormatProperties));
     if (pImageFormatProperties)
     {
         transform_fromhost_VkImageFormatProperties2(sResourceTracker, (VkImageFormatProperties2*)(pImageFormatProperties));
@@ -16763,7 +16766,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
                 {
-                    count_VkQueueFamilyProperties2(sFeatureBits, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i), countPtr);
+                    count_VkQueueFamilyProperties2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i), countPtr);
                 }
             }
         }
@@ -16799,7 +16802,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
         {
-            reservedmarshal_VkQueueFamilyProperties2(stream, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i), streamPtrPtr);
+            reservedmarshal_VkQueueFamilyProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -16826,7 +16829,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
             {
-                unmarshal_VkQueueFamilyProperties2(stream, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i));
+                unmarshal_VkQueueFamilyProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i));
             }
         }
     }
@@ -16866,7 +16869,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPhysicalDeviceMemoryProperties2(sFeatureBits, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties), countPtr);
+        count_VkPhysicalDeviceMemoryProperties2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties), countPtr);
     }
     uint32_t packetSize_vkGetPhysicalDeviceMemoryProperties2KHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceMemoryProperties2KHR);
@@ -16880,8 +16883,8 @@
     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPhysicalDeviceMemoryProperties2(stream, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties), streamPtrPtr);
-    unmarshal_VkPhysicalDeviceMemoryProperties2(stream, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
+    reservedmarshal_VkPhysicalDeviceMemoryProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties), streamPtrPtr);
+    unmarshal_VkPhysicalDeviceMemoryProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
     if (pMemoryProperties)
     {
         transform_fromhost_VkPhysicalDeviceMemoryProperties2(sResourceTracker, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
@@ -16915,7 +16918,7 @@
     if (pFormatInfo)
     {
         local_pFormatInfo = (VkPhysicalDeviceSparseImageFormatInfo2*)pool->alloc(sizeof(const VkPhysicalDeviceSparseImageFormatInfo2));
-        deepcopy_VkPhysicalDeviceSparseImageFormatInfo2(pool, pFormatInfo, (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo));
+        deepcopy_VkPhysicalDeviceSparseImageFormatInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pFormatInfo, (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo));
     }
     if (local_pFormatInfo)
     {
@@ -16926,7 +16929,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPhysicalDeviceSparseImageFormatInfo2(sFeatureBits, (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo), countPtr);
+        count_VkPhysicalDeviceSparseImageFormatInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (pPropertyCount)
@@ -16941,7 +16944,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
                 {
-                    count_VkSparseImageFormatProperties2(sFeatureBits, (VkSparseImageFormatProperties2*)(pProperties + i), countPtr);
+                    count_VkSparseImageFormatProperties2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageFormatProperties2*)(pProperties + i), countPtr);
                 }
             }
         }
@@ -16958,7 +16961,7 @@
     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPhysicalDeviceSparseImageFormatInfo2(stream, (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo), streamPtrPtr);
+    reservedmarshal_VkPhysicalDeviceSparseImageFormatInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pPropertyCount;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -16978,7 +16981,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            reservedmarshal_VkSparseImageFormatProperties2(stream, (VkSparseImageFormatProperties2*)(pProperties + i), streamPtrPtr);
+            reservedmarshal_VkSparseImageFormatProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageFormatProperties2*)(pProperties + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -17005,7 +17008,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                unmarshal_VkSparseImageFormatProperties2(stream, (VkSparseImageFormatProperties2*)(pProperties + i));
+                unmarshal_VkSparseImageFormatProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageFormatProperties2*)(pProperties + i));
             }
         }
     }
@@ -17305,7 +17308,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i)
                 {
-                    count_VkPhysicalDeviceGroupProperties(sFeatureBits, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i), countPtr);
+                    count_VkPhysicalDeviceGroupProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i), countPtr);
                 }
             }
         }
@@ -17341,7 +17344,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i)
         {
-            reservedmarshal_VkPhysicalDeviceGroupProperties(stream, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i), streamPtrPtr);
+            reservedmarshal_VkPhysicalDeviceGroupProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -17368,7 +17371,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i)
             {
-                unmarshal_VkPhysicalDeviceGroupProperties(stream, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i));
+                unmarshal_VkPhysicalDeviceGroupProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i));
             }
         }
     }
@@ -17414,7 +17417,7 @@
     if (pExternalBufferInfo)
     {
         local_pExternalBufferInfo = (VkPhysicalDeviceExternalBufferInfo*)pool->alloc(sizeof(const VkPhysicalDeviceExternalBufferInfo));
-        deepcopy_VkPhysicalDeviceExternalBufferInfo(pool, pExternalBufferInfo, (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo));
+        deepcopy_VkPhysicalDeviceExternalBufferInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pExternalBufferInfo, (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo));
     }
     if (local_pExternalBufferInfo)
     {
@@ -17426,8 +17429,8 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPhysicalDeviceExternalBufferInfo(sFeatureBits, (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo), countPtr);
-        count_VkExternalBufferProperties(sFeatureBits, (VkExternalBufferProperties*)(pExternalBufferProperties), countPtr);
+        count_VkPhysicalDeviceExternalBufferInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo), countPtr);
+        count_VkExternalBufferProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalBufferProperties*)(pExternalBufferProperties), countPtr);
     }
     uint32_t packetSize_vkGetPhysicalDeviceExternalBufferPropertiesKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceExternalBufferPropertiesKHR);
@@ -17441,9 +17444,9 @@
     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPhysicalDeviceExternalBufferInfo(stream, (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo), streamPtrPtr);
-    reservedmarshal_VkExternalBufferProperties(stream, (VkExternalBufferProperties*)(pExternalBufferProperties), streamPtrPtr);
-    unmarshal_VkExternalBufferProperties(stream, (VkExternalBufferProperties*)(pExternalBufferProperties));
+    reservedmarshal_VkPhysicalDeviceExternalBufferInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo), streamPtrPtr);
+    reservedmarshal_VkExternalBufferProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalBufferProperties*)(pExternalBufferProperties), streamPtrPtr);
+    unmarshal_VkExternalBufferProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalBufferProperties*)(pExternalBufferProperties));
     if (pExternalBufferProperties)
     {
         sResourceTracker->transformImpl_VkExternalBufferProperties_fromhost(pExternalBufferProperties, 1);
@@ -17480,7 +17483,7 @@
     if (pGetWin32HandleInfo)
     {
         local_pGetWin32HandleInfo = (VkMemoryGetWin32HandleInfoKHR*)pool->alloc(sizeof(const VkMemoryGetWin32HandleInfoKHR));
-        deepcopy_VkMemoryGetWin32HandleInfoKHR(pool, pGetWin32HandleInfo, (VkMemoryGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo));
+        deepcopy_VkMemoryGetWin32HandleInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pGetWin32HandleInfo, (VkMemoryGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo));
     }
     if (local_pGetWin32HandleInfo)
     {
@@ -17491,7 +17494,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkMemoryGetWin32HandleInfoKHR(sFeatureBits, (VkMemoryGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo), countPtr);
+        count_VkMemoryGetWin32HandleInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo), countPtr);
         *countPtr += sizeof(HANDLE);
     }
     uint32_t packetSize_vkGetMemoryWin32HandleKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -17506,7 +17509,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkMemoryGetWin32HandleInfoKHR(stream, (VkMemoryGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo), streamPtrPtr);
+    reservedmarshal_VkMemoryGetWin32HandleInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo), streamPtrPtr);
     memcpy(*streamPtrPtr, (HANDLE*)pHandle, sizeof(HANDLE));
     *streamPtrPtr += sizeof(HANDLE);
     stream->read((HANDLE*)pHandle, sizeof(HANDLE));
@@ -17547,7 +17550,7 @@
         *countPtr += 1 * 8;
         *countPtr += sizeof(VkExternalMemoryHandleTypeFlagBits);
         *countPtr += sizeof(HANDLE);
-        count_VkMemoryWin32HandlePropertiesKHR(sFeatureBits, (VkMemoryWin32HandlePropertiesKHR*)(pMemoryWin32HandleProperties), countPtr);
+        count_VkMemoryWin32HandlePropertiesKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryWin32HandlePropertiesKHR*)(pMemoryWin32HandleProperties), countPtr);
     }
     uint32_t packetSize_vkGetMemoryWin32HandlePropertiesKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetMemoryWin32HandlePropertiesKHR);
@@ -17565,8 +17568,8 @@
     *streamPtrPtr += sizeof(VkExternalMemoryHandleTypeFlagBits);
     memcpy(*streamPtrPtr, (HANDLE*)&local_handle, sizeof(HANDLE));
     *streamPtrPtr += sizeof(HANDLE);
-    reservedmarshal_VkMemoryWin32HandlePropertiesKHR(stream, (VkMemoryWin32HandlePropertiesKHR*)(pMemoryWin32HandleProperties), streamPtrPtr);
-    unmarshal_VkMemoryWin32HandlePropertiesKHR(stream, (VkMemoryWin32HandlePropertiesKHR*)(pMemoryWin32HandleProperties));
+    reservedmarshal_VkMemoryWin32HandlePropertiesKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryWin32HandlePropertiesKHR*)(pMemoryWin32HandleProperties), streamPtrPtr);
+    unmarshal_VkMemoryWin32HandlePropertiesKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryWin32HandlePropertiesKHR*)(pMemoryWin32HandleProperties));
     if (pMemoryWin32HandleProperties)
     {
         transform_fromhost_VkMemoryWin32HandlePropertiesKHR(sResourceTracker, (VkMemoryWin32HandlePropertiesKHR*)(pMemoryWin32HandleProperties));
@@ -17603,7 +17606,7 @@
     if (pGetFdInfo)
     {
         local_pGetFdInfo = (VkMemoryGetFdInfoKHR*)pool->alloc(sizeof(const VkMemoryGetFdInfoKHR));
-        deepcopy_VkMemoryGetFdInfoKHR(pool, pGetFdInfo, (VkMemoryGetFdInfoKHR*)(local_pGetFdInfo));
+        deepcopy_VkMemoryGetFdInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pGetFdInfo, (VkMemoryGetFdInfoKHR*)(local_pGetFdInfo));
     }
     if (local_pGetFdInfo)
     {
@@ -17614,7 +17617,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkMemoryGetFdInfoKHR(sFeatureBits, (VkMemoryGetFdInfoKHR*)(local_pGetFdInfo), countPtr);
+        count_VkMemoryGetFdInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryGetFdInfoKHR*)(local_pGetFdInfo), countPtr);
         *countPtr += sizeof(int);
     }
     uint32_t packetSize_vkGetMemoryFdKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -17629,7 +17632,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkMemoryGetFdInfoKHR(stream, (VkMemoryGetFdInfoKHR*)(local_pGetFdInfo), streamPtrPtr);
+    reservedmarshal_VkMemoryGetFdInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryGetFdInfoKHR*)(local_pGetFdInfo), streamPtrPtr);
     memcpy(*streamPtrPtr, (int*)pFd, sizeof(int));
     *streamPtrPtr += sizeof(int);
     stream->read((int*)pFd, sizeof(int));
@@ -17670,7 +17673,7 @@
         *countPtr += 1 * 8;
         *countPtr += sizeof(VkExternalMemoryHandleTypeFlagBits);
         *countPtr += sizeof(int);
-        count_VkMemoryFdPropertiesKHR(sFeatureBits, (VkMemoryFdPropertiesKHR*)(pMemoryFdProperties), countPtr);
+        count_VkMemoryFdPropertiesKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryFdPropertiesKHR*)(pMemoryFdProperties), countPtr);
     }
     uint32_t packetSize_vkGetMemoryFdPropertiesKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetMemoryFdPropertiesKHR);
@@ -17688,8 +17691,8 @@
     *streamPtrPtr += sizeof(VkExternalMemoryHandleTypeFlagBits);
     memcpy(*streamPtrPtr, (int*)&local_fd, sizeof(int));
     *streamPtrPtr += sizeof(int);
-    reservedmarshal_VkMemoryFdPropertiesKHR(stream, (VkMemoryFdPropertiesKHR*)(pMemoryFdProperties), streamPtrPtr);
-    unmarshal_VkMemoryFdPropertiesKHR(stream, (VkMemoryFdPropertiesKHR*)(pMemoryFdProperties));
+    reservedmarshal_VkMemoryFdPropertiesKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryFdPropertiesKHR*)(pMemoryFdProperties), streamPtrPtr);
+    unmarshal_VkMemoryFdPropertiesKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryFdPropertiesKHR*)(pMemoryFdProperties));
     if (pMemoryFdProperties)
     {
         transform_fromhost_VkMemoryFdPropertiesKHR(sResourceTracker, (VkMemoryFdPropertiesKHR*)(pMemoryFdProperties));
@@ -17728,7 +17731,7 @@
     if (pExternalSemaphoreInfo)
     {
         local_pExternalSemaphoreInfo = (VkPhysicalDeviceExternalSemaphoreInfo*)pool->alloc(sizeof(const VkPhysicalDeviceExternalSemaphoreInfo));
-        deepcopy_VkPhysicalDeviceExternalSemaphoreInfo(pool, pExternalSemaphoreInfo, (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo));
+        deepcopy_VkPhysicalDeviceExternalSemaphoreInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pExternalSemaphoreInfo, (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo));
     }
     if (local_pExternalSemaphoreInfo)
     {
@@ -17739,8 +17742,8 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPhysicalDeviceExternalSemaphoreInfo(sFeatureBits, (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo), countPtr);
-        count_VkExternalSemaphoreProperties(sFeatureBits, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties), countPtr);
+        count_VkPhysicalDeviceExternalSemaphoreInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo), countPtr);
+        count_VkExternalSemaphoreProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties), countPtr);
     }
     uint32_t packetSize_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR);
@@ -17754,9 +17757,9 @@
     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPhysicalDeviceExternalSemaphoreInfo(stream, (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo), streamPtrPtr);
-    reservedmarshal_VkExternalSemaphoreProperties(stream, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties), streamPtrPtr);
-    unmarshal_VkExternalSemaphoreProperties(stream, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
+    reservedmarshal_VkPhysicalDeviceExternalSemaphoreInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo), streamPtrPtr);
+    reservedmarshal_VkExternalSemaphoreProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties), streamPtrPtr);
+    unmarshal_VkExternalSemaphoreProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
     if (pExternalSemaphoreProperties)
     {
         transform_fromhost_VkExternalSemaphoreProperties(sResourceTracker, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
@@ -17792,7 +17795,7 @@
     if (pImportSemaphoreWin32HandleInfo)
     {
         local_pImportSemaphoreWin32HandleInfo = (VkImportSemaphoreWin32HandleInfoKHR*)pool->alloc(sizeof(const VkImportSemaphoreWin32HandleInfoKHR));
-        deepcopy_VkImportSemaphoreWin32HandleInfoKHR(pool, pImportSemaphoreWin32HandleInfo, (VkImportSemaphoreWin32HandleInfoKHR*)(local_pImportSemaphoreWin32HandleInfo));
+        deepcopy_VkImportSemaphoreWin32HandleInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pImportSemaphoreWin32HandleInfo, (VkImportSemaphoreWin32HandleInfoKHR*)(local_pImportSemaphoreWin32HandleInfo));
     }
     if (local_pImportSemaphoreWin32HandleInfo)
     {
@@ -17803,7 +17806,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkImportSemaphoreWin32HandleInfoKHR(sFeatureBits, (VkImportSemaphoreWin32HandleInfoKHR*)(local_pImportSemaphoreWin32HandleInfo), countPtr);
+        count_VkImportSemaphoreWin32HandleInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImportSemaphoreWin32HandleInfoKHR*)(local_pImportSemaphoreWin32HandleInfo), countPtr);
     }
     uint32_t packetSize_vkImportSemaphoreWin32HandleKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkImportSemaphoreWin32HandleKHR);
@@ -17817,7 +17820,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkImportSemaphoreWin32HandleInfoKHR(stream, (VkImportSemaphoreWin32HandleInfoKHR*)(local_pImportSemaphoreWin32HandleInfo), streamPtrPtr);
+    reservedmarshal_VkImportSemaphoreWin32HandleInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImportSemaphoreWin32HandleInfoKHR*)(local_pImportSemaphoreWin32HandleInfo), streamPtrPtr);
     VkResult vkImportSemaphoreWin32HandleKHR_VkResult_return = (VkResult)0;
     stream->read(&vkImportSemaphoreWin32HandleKHR_VkResult_return, sizeof(VkResult));
     ++encodeCount;;
@@ -17848,7 +17851,7 @@
     if (pGetWin32HandleInfo)
     {
         local_pGetWin32HandleInfo = (VkSemaphoreGetWin32HandleInfoKHR*)pool->alloc(sizeof(const VkSemaphoreGetWin32HandleInfoKHR));
-        deepcopy_VkSemaphoreGetWin32HandleInfoKHR(pool, pGetWin32HandleInfo, (VkSemaphoreGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo));
+        deepcopy_VkSemaphoreGetWin32HandleInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pGetWin32HandleInfo, (VkSemaphoreGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo));
     }
     if (local_pGetWin32HandleInfo)
     {
@@ -17859,7 +17862,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkSemaphoreGetWin32HandleInfoKHR(sFeatureBits, (VkSemaphoreGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo), countPtr);
+        count_VkSemaphoreGetWin32HandleInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSemaphoreGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo), countPtr);
         *countPtr += sizeof(HANDLE);
     }
     uint32_t packetSize_vkGetSemaphoreWin32HandleKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -17874,7 +17877,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkSemaphoreGetWin32HandleInfoKHR(stream, (VkSemaphoreGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo), streamPtrPtr);
+    reservedmarshal_VkSemaphoreGetWin32HandleInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSemaphoreGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo), streamPtrPtr);
     memcpy(*streamPtrPtr, (HANDLE*)pHandle, sizeof(HANDLE));
     *streamPtrPtr += sizeof(HANDLE);
     stream->read((HANDLE*)pHandle, sizeof(HANDLE));
@@ -17909,7 +17912,7 @@
     if (pImportSemaphoreFdInfo)
     {
         local_pImportSemaphoreFdInfo = (VkImportSemaphoreFdInfoKHR*)pool->alloc(sizeof(const VkImportSemaphoreFdInfoKHR));
-        deepcopy_VkImportSemaphoreFdInfoKHR(pool, pImportSemaphoreFdInfo, (VkImportSemaphoreFdInfoKHR*)(local_pImportSemaphoreFdInfo));
+        deepcopy_VkImportSemaphoreFdInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pImportSemaphoreFdInfo, (VkImportSemaphoreFdInfoKHR*)(local_pImportSemaphoreFdInfo));
     }
     if (local_pImportSemaphoreFdInfo)
     {
@@ -17920,7 +17923,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkImportSemaphoreFdInfoKHR(sFeatureBits, (VkImportSemaphoreFdInfoKHR*)(local_pImportSemaphoreFdInfo), countPtr);
+        count_VkImportSemaphoreFdInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImportSemaphoreFdInfoKHR*)(local_pImportSemaphoreFdInfo), countPtr);
     }
     uint32_t packetSize_vkImportSemaphoreFdKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkImportSemaphoreFdKHR);
@@ -17934,7 +17937,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkImportSemaphoreFdInfoKHR(stream, (VkImportSemaphoreFdInfoKHR*)(local_pImportSemaphoreFdInfo), streamPtrPtr);
+    reservedmarshal_VkImportSemaphoreFdInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImportSemaphoreFdInfoKHR*)(local_pImportSemaphoreFdInfo), streamPtrPtr);
     VkResult vkImportSemaphoreFdKHR_VkResult_return = (VkResult)0;
     stream->read(&vkImportSemaphoreFdKHR_VkResult_return, sizeof(VkResult));
     ++encodeCount;;
@@ -17965,7 +17968,7 @@
     if (pGetFdInfo)
     {
         local_pGetFdInfo = (VkSemaphoreGetFdInfoKHR*)pool->alloc(sizeof(const VkSemaphoreGetFdInfoKHR));
-        deepcopy_VkSemaphoreGetFdInfoKHR(pool, pGetFdInfo, (VkSemaphoreGetFdInfoKHR*)(local_pGetFdInfo));
+        deepcopy_VkSemaphoreGetFdInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pGetFdInfo, (VkSemaphoreGetFdInfoKHR*)(local_pGetFdInfo));
     }
     if (local_pGetFdInfo)
     {
@@ -17976,7 +17979,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkSemaphoreGetFdInfoKHR(sFeatureBits, (VkSemaphoreGetFdInfoKHR*)(local_pGetFdInfo), countPtr);
+        count_VkSemaphoreGetFdInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSemaphoreGetFdInfoKHR*)(local_pGetFdInfo), countPtr);
         *countPtr += sizeof(int);
     }
     uint32_t packetSize_vkGetSemaphoreFdKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -17991,7 +17994,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkSemaphoreGetFdInfoKHR(stream, (VkSemaphoreGetFdInfoKHR*)(local_pGetFdInfo), streamPtrPtr);
+    reservedmarshal_VkSemaphoreGetFdInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSemaphoreGetFdInfoKHR*)(local_pGetFdInfo), streamPtrPtr);
     memcpy(*streamPtrPtr, (int*)pFd, sizeof(int));
     *streamPtrPtr += sizeof(int);
     stream->read((int*)pFd, sizeof(int));
@@ -18040,7 +18043,7 @@
         local_pDescriptorWrites = (VkWriteDescriptorSet*)pool->alloc(((descriptorWriteCount)) * sizeof(const VkWriteDescriptorSet));
         for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i)
         {
-            deepcopy_VkWriteDescriptorSet(pool, pDescriptorWrites + i, (VkWriteDescriptorSet*)(local_pDescriptorWrites + i));
+            deepcopy_VkWriteDescriptorSet(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pDescriptorWrites + i, (VkWriteDescriptorSet*)(local_pDescriptorWrites + i));
         }
     }
     if (local_pDescriptorWrites)
@@ -18062,7 +18065,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i)
         {
-            count_VkWriteDescriptorSet(sFeatureBits, (VkWriteDescriptorSet*)(local_pDescriptorWrites + i), countPtr);
+            count_VkWriteDescriptorSet(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkWriteDescriptorSet*)(local_pDescriptorWrites + i), countPtr);
         }
     }
     uint32_t packetSize_vkCmdPushDescriptorSetKHR = 4 + 4 + count;
@@ -18091,7 +18094,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i)
     {
-        reservedmarshal_VkWriteDescriptorSet(stream, (VkWriteDescriptorSet*)(local_pDescriptorWrites + i), streamPtrPtr);
+        reservedmarshal_VkWriteDescriptorSet(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkWriteDescriptorSet*)(local_pDescriptorWrites + i), streamPtrPtr);
     }
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
@@ -18214,13 +18217,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkDescriptorUpdateTemplateCreateInfo*)pool->alloc(sizeof(const VkDescriptorUpdateTemplateCreateInfo));
-        deepcopy_VkDescriptorUpdateTemplateCreateInfo(pool, pCreateInfo, (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkDescriptorUpdateTemplateCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -18236,12 +18239,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDescriptorUpdateTemplateCreateInfo(sFeatureBits, (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkDescriptorUpdateTemplateCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -18258,7 +18261,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDescriptorUpdateTemplateCreateInfo(stream, (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkDescriptorUpdateTemplateCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -18266,7 +18269,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -18312,7 +18315,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -18330,7 +18333,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyDescriptorUpdateTemplateKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -18356,7 +18359,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkDescriptorUpdateTemplate((VkDescriptorUpdateTemplate*)&descriptorUpdateTemplate);
     stream->flush();
@@ -18470,13 +18473,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkRenderPassCreateInfo2*)pool->alloc(sizeof(const VkRenderPassCreateInfo2));
-        deepcopy_VkRenderPassCreateInfo2(pool, pCreateInfo, (VkRenderPassCreateInfo2*)(local_pCreateInfo));
+        deepcopy_VkRenderPassCreateInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkRenderPassCreateInfo2*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -18492,12 +18495,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkRenderPassCreateInfo2(sFeatureBits, (VkRenderPassCreateInfo2*)(local_pCreateInfo), countPtr);
+        count_VkRenderPassCreateInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRenderPassCreateInfo2*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -18514,7 +18517,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkRenderPassCreateInfo2(stream, (VkRenderPassCreateInfo2*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkRenderPassCreateInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRenderPassCreateInfo2*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -18522,7 +18525,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -18564,13 +18567,13 @@
     if (pRenderPassBegin)
     {
         local_pRenderPassBegin = (VkRenderPassBeginInfo*)pool->alloc(sizeof(const VkRenderPassBeginInfo));
-        deepcopy_VkRenderPassBeginInfo(pool, pRenderPassBegin, (VkRenderPassBeginInfo*)(local_pRenderPassBegin));
+        deepcopy_VkRenderPassBeginInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRenderPassBegin, (VkRenderPassBeginInfo*)(local_pRenderPassBegin));
     }
     local_pSubpassBeginInfo = nullptr;
     if (pSubpassBeginInfo)
     {
         local_pSubpassBeginInfo = (VkSubpassBeginInfo*)pool->alloc(sizeof(const VkSubpassBeginInfo));
-        deepcopy_VkSubpassBeginInfo(pool, pSubpassBeginInfo, (VkSubpassBeginInfo*)(local_pSubpassBeginInfo));
+        deepcopy_VkSubpassBeginInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubpassBeginInfo, (VkSubpassBeginInfo*)(local_pSubpassBeginInfo));
     }
     if (local_pRenderPassBegin)
     {
@@ -18585,8 +18588,8 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkRenderPassBeginInfo(sFeatureBits, (VkRenderPassBeginInfo*)(local_pRenderPassBegin), countPtr);
-        count_VkSubpassBeginInfo(sFeatureBits, (VkSubpassBeginInfo*)(local_pSubpassBeginInfo), countPtr);
+        count_VkRenderPassBeginInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRenderPassBeginInfo*)(local_pRenderPassBegin), countPtr);
+        count_VkSubpassBeginInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassBeginInfo*)(local_pSubpassBeginInfo), countPtr);
     }
     uint32_t packetSize_vkCmdBeginRenderPass2KHR = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdBeginRenderPass2KHR -= 8;
@@ -18602,8 +18605,8 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkRenderPassBeginInfo(stream, (VkRenderPassBeginInfo*)(local_pRenderPassBegin), streamPtrPtr);
-    reservedmarshal_VkSubpassBeginInfo(stream, (VkSubpassBeginInfo*)(local_pSubpassBeginInfo), streamPtrPtr);
+    reservedmarshal_VkRenderPassBeginInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRenderPassBeginInfo*)(local_pRenderPassBegin), streamPtrPtr);
+    reservedmarshal_VkSubpassBeginInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassBeginInfo*)(local_pSubpassBeginInfo), streamPtrPtr);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -18632,13 +18635,13 @@
     if (pSubpassBeginInfo)
     {
         local_pSubpassBeginInfo = (VkSubpassBeginInfo*)pool->alloc(sizeof(const VkSubpassBeginInfo));
-        deepcopy_VkSubpassBeginInfo(pool, pSubpassBeginInfo, (VkSubpassBeginInfo*)(local_pSubpassBeginInfo));
+        deepcopy_VkSubpassBeginInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubpassBeginInfo, (VkSubpassBeginInfo*)(local_pSubpassBeginInfo));
     }
     local_pSubpassEndInfo = nullptr;
     if (pSubpassEndInfo)
     {
         local_pSubpassEndInfo = (VkSubpassEndInfo*)pool->alloc(sizeof(const VkSubpassEndInfo));
-        deepcopy_VkSubpassEndInfo(pool, pSubpassEndInfo, (VkSubpassEndInfo*)(local_pSubpassEndInfo));
+        deepcopy_VkSubpassEndInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubpassEndInfo, (VkSubpassEndInfo*)(local_pSubpassEndInfo));
     }
     if (local_pSubpassBeginInfo)
     {
@@ -18653,8 +18656,8 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkSubpassBeginInfo(sFeatureBits, (VkSubpassBeginInfo*)(local_pSubpassBeginInfo), countPtr);
-        count_VkSubpassEndInfo(sFeatureBits, (VkSubpassEndInfo*)(local_pSubpassEndInfo), countPtr);
+        count_VkSubpassBeginInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassBeginInfo*)(local_pSubpassBeginInfo), countPtr);
+        count_VkSubpassEndInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassEndInfo*)(local_pSubpassEndInfo), countPtr);
     }
     uint32_t packetSize_vkCmdNextSubpass2KHR = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdNextSubpass2KHR -= 8;
@@ -18670,8 +18673,8 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkSubpassBeginInfo(stream, (VkSubpassBeginInfo*)(local_pSubpassBeginInfo), streamPtrPtr);
-    reservedmarshal_VkSubpassEndInfo(stream, (VkSubpassEndInfo*)(local_pSubpassEndInfo), streamPtrPtr);
+    reservedmarshal_VkSubpassBeginInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassBeginInfo*)(local_pSubpassBeginInfo), streamPtrPtr);
+    reservedmarshal_VkSubpassEndInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassEndInfo*)(local_pSubpassEndInfo), streamPtrPtr);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -18698,7 +18701,7 @@
     if (pSubpassEndInfo)
     {
         local_pSubpassEndInfo = (VkSubpassEndInfo*)pool->alloc(sizeof(const VkSubpassEndInfo));
-        deepcopy_VkSubpassEndInfo(pool, pSubpassEndInfo, (VkSubpassEndInfo*)(local_pSubpassEndInfo));
+        deepcopy_VkSubpassEndInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubpassEndInfo, (VkSubpassEndInfo*)(local_pSubpassEndInfo));
     }
     if (local_pSubpassEndInfo)
     {
@@ -18709,7 +18712,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkSubpassEndInfo(sFeatureBits, (VkSubpassEndInfo*)(local_pSubpassEndInfo), countPtr);
+        count_VkSubpassEndInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassEndInfo*)(local_pSubpassEndInfo), countPtr);
     }
     uint32_t packetSize_vkCmdEndRenderPass2KHR = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdEndRenderPass2KHR -= 8;
@@ -18725,7 +18728,7 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkSubpassEndInfo(stream, (VkSubpassEndInfo*)(local_pSubpassEndInfo), streamPtrPtr);
+    reservedmarshal_VkSubpassEndInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassEndInfo*)(local_pSubpassEndInfo), streamPtrPtr);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -18807,7 +18810,7 @@
     if (pExternalFenceInfo)
     {
         local_pExternalFenceInfo = (VkPhysicalDeviceExternalFenceInfo*)pool->alloc(sizeof(const VkPhysicalDeviceExternalFenceInfo));
-        deepcopy_VkPhysicalDeviceExternalFenceInfo(pool, pExternalFenceInfo, (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo));
+        deepcopy_VkPhysicalDeviceExternalFenceInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pExternalFenceInfo, (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo));
     }
     if (local_pExternalFenceInfo)
     {
@@ -18818,8 +18821,8 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPhysicalDeviceExternalFenceInfo(sFeatureBits, (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo), countPtr);
-        count_VkExternalFenceProperties(sFeatureBits, (VkExternalFenceProperties*)(pExternalFenceProperties), countPtr);
+        count_VkPhysicalDeviceExternalFenceInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo), countPtr);
+        count_VkExternalFenceProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalFenceProperties*)(pExternalFenceProperties), countPtr);
     }
     uint32_t packetSize_vkGetPhysicalDeviceExternalFencePropertiesKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceExternalFencePropertiesKHR);
@@ -18833,9 +18836,9 @@
     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPhysicalDeviceExternalFenceInfo(stream, (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo), streamPtrPtr);
-    reservedmarshal_VkExternalFenceProperties(stream, (VkExternalFenceProperties*)(pExternalFenceProperties), streamPtrPtr);
-    unmarshal_VkExternalFenceProperties(stream, (VkExternalFenceProperties*)(pExternalFenceProperties));
+    reservedmarshal_VkPhysicalDeviceExternalFenceInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo), streamPtrPtr);
+    reservedmarshal_VkExternalFenceProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalFenceProperties*)(pExternalFenceProperties), streamPtrPtr);
+    unmarshal_VkExternalFenceProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalFenceProperties*)(pExternalFenceProperties));
     if (pExternalFenceProperties)
     {
         transform_fromhost_VkExternalFenceProperties(sResourceTracker, (VkExternalFenceProperties*)(pExternalFenceProperties));
@@ -18870,7 +18873,7 @@
     if (pImportFenceWin32HandleInfo)
     {
         local_pImportFenceWin32HandleInfo = (VkImportFenceWin32HandleInfoKHR*)pool->alloc(sizeof(const VkImportFenceWin32HandleInfoKHR));
-        deepcopy_VkImportFenceWin32HandleInfoKHR(pool, pImportFenceWin32HandleInfo, (VkImportFenceWin32HandleInfoKHR*)(local_pImportFenceWin32HandleInfo));
+        deepcopy_VkImportFenceWin32HandleInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pImportFenceWin32HandleInfo, (VkImportFenceWin32HandleInfoKHR*)(local_pImportFenceWin32HandleInfo));
     }
     if (local_pImportFenceWin32HandleInfo)
     {
@@ -18881,7 +18884,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkImportFenceWin32HandleInfoKHR(sFeatureBits, (VkImportFenceWin32HandleInfoKHR*)(local_pImportFenceWin32HandleInfo), countPtr);
+        count_VkImportFenceWin32HandleInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImportFenceWin32HandleInfoKHR*)(local_pImportFenceWin32HandleInfo), countPtr);
     }
     uint32_t packetSize_vkImportFenceWin32HandleKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkImportFenceWin32HandleKHR);
@@ -18895,7 +18898,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkImportFenceWin32HandleInfoKHR(stream, (VkImportFenceWin32HandleInfoKHR*)(local_pImportFenceWin32HandleInfo), streamPtrPtr);
+    reservedmarshal_VkImportFenceWin32HandleInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImportFenceWin32HandleInfoKHR*)(local_pImportFenceWin32HandleInfo), streamPtrPtr);
     VkResult vkImportFenceWin32HandleKHR_VkResult_return = (VkResult)0;
     stream->read(&vkImportFenceWin32HandleKHR_VkResult_return, sizeof(VkResult));
     ++encodeCount;;
@@ -18926,7 +18929,7 @@
     if (pGetWin32HandleInfo)
     {
         local_pGetWin32HandleInfo = (VkFenceGetWin32HandleInfoKHR*)pool->alloc(sizeof(const VkFenceGetWin32HandleInfoKHR));
-        deepcopy_VkFenceGetWin32HandleInfoKHR(pool, pGetWin32HandleInfo, (VkFenceGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo));
+        deepcopy_VkFenceGetWin32HandleInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pGetWin32HandleInfo, (VkFenceGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo));
     }
     if (local_pGetWin32HandleInfo)
     {
@@ -18937,7 +18940,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkFenceGetWin32HandleInfoKHR(sFeatureBits, (VkFenceGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo), countPtr);
+        count_VkFenceGetWin32HandleInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFenceGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo), countPtr);
         *countPtr += sizeof(HANDLE);
     }
     uint32_t packetSize_vkGetFenceWin32HandleKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -18952,7 +18955,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkFenceGetWin32HandleInfoKHR(stream, (VkFenceGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo), streamPtrPtr);
+    reservedmarshal_VkFenceGetWin32HandleInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFenceGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo), streamPtrPtr);
     memcpy(*streamPtrPtr, (HANDLE*)pHandle, sizeof(HANDLE));
     *streamPtrPtr += sizeof(HANDLE);
     stream->read((HANDLE*)pHandle, sizeof(HANDLE));
@@ -18987,7 +18990,7 @@
     if (pImportFenceFdInfo)
     {
         local_pImportFenceFdInfo = (VkImportFenceFdInfoKHR*)pool->alloc(sizeof(const VkImportFenceFdInfoKHR));
-        deepcopy_VkImportFenceFdInfoKHR(pool, pImportFenceFdInfo, (VkImportFenceFdInfoKHR*)(local_pImportFenceFdInfo));
+        deepcopy_VkImportFenceFdInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pImportFenceFdInfo, (VkImportFenceFdInfoKHR*)(local_pImportFenceFdInfo));
     }
     if (local_pImportFenceFdInfo)
     {
@@ -18998,7 +19001,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkImportFenceFdInfoKHR(sFeatureBits, (VkImportFenceFdInfoKHR*)(local_pImportFenceFdInfo), countPtr);
+        count_VkImportFenceFdInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImportFenceFdInfoKHR*)(local_pImportFenceFdInfo), countPtr);
     }
     uint32_t packetSize_vkImportFenceFdKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkImportFenceFdKHR);
@@ -19012,7 +19015,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkImportFenceFdInfoKHR(stream, (VkImportFenceFdInfoKHR*)(local_pImportFenceFdInfo), streamPtrPtr);
+    reservedmarshal_VkImportFenceFdInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImportFenceFdInfoKHR*)(local_pImportFenceFdInfo), streamPtrPtr);
     VkResult vkImportFenceFdKHR_VkResult_return = (VkResult)0;
     stream->read(&vkImportFenceFdKHR_VkResult_return, sizeof(VkResult));
     ++encodeCount;;
@@ -19043,7 +19046,7 @@
     if (pGetFdInfo)
     {
         local_pGetFdInfo = (VkFenceGetFdInfoKHR*)pool->alloc(sizeof(const VkFenceGetFdInfoKHR));
-        deepcopy_VkFenceGetFdInfoKHR(pool, pGetFdInfo, (VkFenceGetFdInfoKHR*)(local_pGetFdInfo));
+        deepcopy_VkFenceGetFdInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pGetFdInfo, (VkFenceGetFdInfoKHR*)(local_pGetFdInfo));
     }
     if (local_pGetFdInfo)
     {
@@ -19054,7 +19057,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkFenceGetFdInfoKHR(sFeatureBits, (VkFenceGetFdInfoKHR*)(local_pGetFdInfo), countPtr);
+        count_VkFenceGetFdInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFenceGetFdInfoKHR*)(local_pGetFdInfo), countPtr);
         *countPtr += sizeof(int);
     }
     uint32_t packetSize_vkGetFenceFdKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -19069,7 +19072,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkFenceGetFdInfoKHR(stream, (VkFenceGetFdInfoKHR*)(local_pGetFdInfo), streamPtrPtr);
+    reservedmarshal_VkFenceGetFdInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFenceGetFdInfoKHR*)(local_pGetFdInfo), streamPtrPtr);
     memcpy(*streamPtrPtr, (int*)pFd, sizeof(int));
     *streamPtrPtr += sizeof(int);
     stream->read((int*)pFd, sizeof(int));
@@ -19124,7 +19127,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pCounterCount)); ++i)
                 {
-                    count_VkPerformanceCounterKHR(sFeatureBits, (VkPerformanceCounterKHR*)(pCounters + i), countPtr);
+                    count_VkPerformanceCounterKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceCounterKHR*)(pCounters + i), countPtr);
                 }
             }
         }
@@ -19136,7 +19139,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pCounterCount)); ++i)
                 {
-                    count_VkPerformanceCounterDescriptionKHR(sFeatureBits, (VkPerformanceCounterDescriptionKHR*)(pCounterDescriptions + i), countPtr);
+                    count_VkPerformanceCounterDescriptionKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceCounterDescriptionKHR*)(pCounterDescriptions + i), countPtr);
                 }
             }
         }
@@ -19174,7 +19177,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pCounterCount)); ++i)
         {
-            reservedmarshal_VkPerformanceCounterKHR(stream, (VkPerformanceCounterKHR*)(pCounters + i), streamPtrPtr);
+            reservedmarshal_VkPerformanceCounterKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceCounterKHR*)(pCounters + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -19186,7 +19189,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pCounterCount)); ++i)
         {
-            reservedmarshal_VkPerformanceCounterDescriptionKHR(stream, (VkPerformanceCounterDescriptionKHR*)(pCounterDescriptions + i), streamPtrPtr);
+            reservedmarshal_VkPerformanceCounterDescriptionKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceCounterDescriptionKHR*)(pCounterDescriptions + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -19213,7 +19216,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pCounterCount)); ++i)
             {
-                unmarshal_VkPerformanceCounterKHR(stream, (VkPerformanceCounterKHR*)(pCounters + i));
+                unmarshal_VkPerformanceCounterKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceCounterKHR*)(pCounters + i));
             }
         }
     }
@@ -19240,7 +19243,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pCounterCount)); ++i)
             {
-                unmarshal_VkPerformanceCounterDescriptionKHR(stream, (VkPerformanceCounterDescriptionKHR*)(pCounterDescriptions + i));
+                unmarshal_VkPerformanceCounterDescriptionKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceCounterDescriptionKHR*)(pCounterDescriptions + i));
             }
         }
     }
@@ -19284,7 +19287,7 @@
     if (pPerformanceQueryCreateInfo)
     {
         local_pPerformanceQueryCreateInfo = (VkQueryPoolPerformanceCreateInfoKHR*)pool->alloc(sizeof(const VkQueryPoolPerformanceCreateInfoKHR));
-        deepcopy_VkQueryPoolPerformanceCreateInfoKHR(pool, pPerformanceQueryCreateInfo, (VkQueryPoolPerformanceCreateInfoKHR*)(local_pPerformanceQueryCreateInfo));
+        deepcopy_VkQueryPoolPerformanceCreateInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pPerformanceQueryCreateInfo, (VkQueryPoolPerformanceCreateInfoKHR*)(local_pPerformanceQueryCreateInfo));
     }
     if (local_pPerformanceQueryCreateInfo)
     {
@@ -19295,7 +19298,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkQueryPoolPerformanceCreateInfoKHR(sFeatureBits, (VkQueryPoolPerformanceCreateInfoKHR*)(local_pPerformanceQueryCreateInfo), countPtr);
+        count_VkQueryPoolPerformanceCreateInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkQueryPoolPerformanceCreateInfoKHR*)(local_pPerformanceQueryCreateInfo), countPtr);
         *countPtr += sizeof(uint32_t);
     }
     uint32_t packetSize_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -19310,7 +19313,7 @@
     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkQueryPoolPerformanceCreateInfoKHR(stream, (VkQueryPoolPerformanceCreateInfoKHR*)(local_pPerformanceQueryCreateInfo), streamPtrPtr);
+    reservedmarshal_VkQueryPoolPerformanceCreateInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkQueryPoolPerformanceCreateInfoKHR*)(local_pPerformanceQueryCreateInfo), streamPtrPtr);
     memcpy(*streamPtrPtr, (uint32_t*)pNumPasses, sizeof(uint32_t));
     *streamPtrPtr += sizeof(uint32_t);
     stream->read((uint32_t*)pNumPasses, sizeof(uint32_t));
@@ -19340,7 +19343,7 @@
     if (pInfo)
     {
         local_pInfo = (VkAcquireProfilingLockInfoKHR*)pool->alloc(sizeof(const VkAcquireProfilingLockInfoKHR));
-        deepcopy_VkAcquireProfilingLockInfoKHR(pool, pInfo, (VkAcquireProfilingLockInfoKHR*)(local_pInfo));
+        deepcopy_VkAcquireProfilingLockInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo, (VkAcquireProfilingLockInfoKHR*)(local_pInfo));
     }
     if (local_pInfo)
     {
@@ -19351,7 +19354,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkAcquireProfilingLockInfoKHR(sFeatureBits, (VkAcquireProfilingLockInfoKHR*)(local_pInfo), countPtr);
+        count_VkAcquireProfilingLockInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAcquireProfilingLockInfoKHR*)(local_pInfo), countPtr);
     }
     uint32_t packetSize_vkAcquireProfilingLockKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkAcquireProfilingLockKHR);
@@ -19365,7 +19368,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkAcquireProfilingLockInfoKHR(stream, (VkAcquireProfilingLockInfoKHR*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkAcquireProfilingLockInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAcquireProfilingLockInfoKHR*)(local_pInfo), streamPtrPtr);
     VkResult vkAcquireProfilingLockKHR_VkResult_return = (VkResult)0;
     stream->read(&vkAcquireProfilingLockKHR_VkResult_return, sizeof(VkResult));
     ++encodeCount;;
@@ -19439,7 +19442,7 @@
     if (pSurfaceInfo)
     {
         local_pSurfaceInfo = (VkPhysicalDeviceSurfaceInfo2KHR*)pool->alloc(sizeof(const VkPhysicalDeviceSurfaceInfo2KHR));
-        deepcopy_VkPhysicalDeviceSurfaceInfo2KHR(pool, pSurfaceInfo, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo));
+        deepcopy_VkPhysicalDeviceSurfaceInfo2KHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSurfaceInfo, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo));
     }
     if (local_pSurfaceInfo)
     {
@@ -19450,8 +19453,8 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPhysicalDeviceSurfaceInfo2KHR(sFeatureBits, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo), countPtr);
-        count_VkSurfaceCapabilities2KHR(sFeatureBits, (VkSurfaceCapabilities2KHR*)(pSurfaceCapabilities), countPtr);
+        count_VkPhysicalDeviceSurfaceInfo2KHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo), countPtr);
+        count_VkSurfaceCapabilities2KHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSurfaceCapabilities2KHR*)(pSurfaceCapabilities), countPtr);
     }
     uint32_t packetSize_vkGetPhysicalDeviceSurfaceCapabilities2KHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceSurfaceCapabilities2KHR);
@@ -19465,9 +19468,9 @@
     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPhysicalDeviceSurfaceInfo2KHR(stream, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo), streamPtrPtr);
-    reservedmarshal_VkSurfaceCapabilities2KHR(stream, (VkSurfaceCapabilities2KHR*)(pSurfaceCapabilities), streamPtrPtr);
-    unmarshal_VkSurfaceCapabilities2KHR(stream, (VkSurfaceCapabilities2KHR*)(pSurfaceCapabilities));
+    reservedmarshal_VkPhysicalDeviceSurfaceInfo2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo), streamPtrPtr);
+    reservedmarshal_VkSurfaceCapabilities2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSurfaceCapabilities2KHR*)(pSurfaceCapabilities), streamPtrPtr);
+    unmarshal_VkSurfaceCapabilities2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSurfaceCapabilities2KHR*)(pSurfaceCapabilities));
     if (pSurfaceCapabilities)
     {
         transform_fromhost_VkSurfaceCapabilities2KHR(sResourceTracker, (VkSurfaceCapabilities2KHR*)(pSurfaceCapabilities));
@@ -19503,7 +19506,7 @@
     if (pSurfaceInfo)
     {
         local_pSurfaceInfo = (VkPhysicalDeviceSurfaceInfo2KHR*)pool->alloc(sizeof(const VkPhysicalDeviceSurfaceInfo2KHR));
-        deepcopy_VkPhysicalDeviceSurfaceInfo2KHR(pool, pSurfaceInfo, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo));
+        deepcopy_VkPhysicalDeviceSurfaceInfo2KHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSurfaceInfo, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo));
     }
     if (local_pSurfaceInfo)
     {
@@ -19514,7 +19517,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPhysicalDeviceSurfaceInfo2KHR(sFeatureBits, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo), countPtr);
+        count_VkPhysicalDeviceSurfaceInfo2KHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (pSurfaceFormatCount)
@@ -19529,7 +19532,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pSurfaceFormatCount)); ++i)
                 {
-                    count_VkSurfaceFormat2KHR(sFeatureBits, (VkSurfaceFormat2KHR*)(pSurfaceFormats + i), countPtr);
+                    count_VkSurfaceFormat2KHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSurfaceFormat2KHR*)(pSurfaceFormats + i), countPtr);
                 }
             }
         }
@@ -19546,7 +19549,7 @@
     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPhysicalDeviceSurfaceInfo2KHR(stream, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo), streamPtrPtr);
+    reservedmarshal_VkPhysicalDeviceSurfaceInfo2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pSurfaceFormatCount;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -19566,7 +19569,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pSurfaceFormatCount)); ++i)
         {
-            reservedmarshal_VkSurfaceFormat2KHR(stream, (VkSurfaceFormat2KHR*)(pSurfaceFormats + i), streamPtrPtr);
+            reservedmarshal_VkSurfaceFormat2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSurfaceFormat2KHR*)(pSurfaceFormats + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -19593,7 +19596,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pSurfaceFormatCount)); ++i)
             {
-                unmarshal_VkSurfaceFormat2KHR(stream, (VkSurfaceFormat2KHR*)(pSurfaceFormats + i));
+                unmarshal_VkSurfaceFormat2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSurfaceFormat2KHR*)(pSurfaceFormats + i));
             }
         }
     }
@@ -19655,7 +19658,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
                 {
-                    count_VkDisplayProperties2KHR(sFeatureBits, (VkDisplayProperties2KHR*)(pProperties + i), countPtr);
+                    count_VkDisplayProperties2KHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayProperties2KHR*)(pProperties + i), countPtr);
                 }
             }
         }
@@ -19691,7 +19694,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            reservedmarshal_VkDisplayProperties2KHR(stream, (VkDisplayProperties2KHR*)(pProperties + i), streamPtrPtr);
+            reservedmarshal_VkDisplayProperties2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayProperties2KHR*)(pProperties + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -19718,7 +19721,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                unmarshal_VkDisplayProperties2KHR(stream, (VkDisplayProperties2KHR*)(pProperties + i));
+                unmarshal_VkDisplayProperties2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayProperties2KHR*)(pProperties + i));
             }
         }
     }
@@ -19776,7 +19779,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
                 {
-                    count_VkDisplayPlaneProperties2KHR(sFeatureBits, (VkDisplayPlaneProperties2KHR*)(pProperties + i), countPtr);
+                    count_VkDisplayPlaneProperties2KHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPlaneProperties2KHR*)(pProperties + i), countPtr);
                 }
             }
         }
@@ -19812,7 +19815,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            reservedmarshal_VkDisplayPlaneProperties2KHR(stream, (VkDisplayPlaneProperties2KHR*)(pProperties + i), streamPtrPtr);
+            reservedmarshal_VkDisplayPlaneProperties2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPlaneProperties2KHR*)(pProperties + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -19839,7 +19842,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                unmarshal_VkDisplayPlaneProperties2KHR(stream, (VkDisplayPlaneProperties2KHR*)(pProperties + i));
+                unmarshal_VkDisplayPlaneProperties2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPlaneProperties2KHR*)(pProperties + i));
             }
         }
     }
@@ -19902,7 +19905,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
                 {
-                    count_VkDisplayModeProperties2KHR(sFeatureBits, (VkDisplayModeProperties2KHR*)(pProperties + i), countPtr);
+                    count_VkDisplayModeProperties2KHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayModeProperties2KHR*)(pProperties + i), countPtr);
                 }
             }
         }
@@ -19942,7 +19945,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            reservedmarshal_VkDisplayModeProperties2KHR(stream, (VkDisplayModeProperties2KHR*)(pProperties + i), streamPtrPtr);
+            reservedmarshal_VkDisplayModeProperties2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayModeProperties2KHR*)(pProperties + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -19969,7 +19972,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                unmarshal_VkDisplayModeProperties2KHR(stream, (VkDisplayModeProperties2KHR*)(pProperties + i));
+                unmarshal_VkDisplayModeProperties2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayModeProperties2KHR*)(pProperties + i));
             }
         }
     }
@@ -20013,7 +20016,7 @@
     if (pDisplayPlaneInfo)
     {
         local_pDisplayPlaneInfo = (VkDisplayPlaneInfo2KHR*)pool->alloc(sizeof(const VkDisplayPlaneInfo2KHR));
-        deepcopy_VkDisplayPlaneInfo2KHR(pool, pDisplayPlaneInfo, (VkDisplayPlaneInfo2KHR*)(local_pDisplayPlaneInfo));
+        deepcopy_VkDisplayPlaneInfo2KHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pDisplayPlaneInfo, (VkDisplayPlaneInfo2KHR*)(local_pDisplayPlaneInfo));
     }
     if (local_pDisplayPlaneInfo)
     {
@@ -20024,8 +20027,8 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDisplayPlaneInfo2KHR(sFeatureBits, (VkDisplayPlaneInfo2KHR*)(local_pDisplayPlaneInfo), countPtr);
-        count_VkDisplayPlaneCapabilities2KHR(sFeatureBits, (VkDisplayPlaneCapabilities2KHR*)(pCapabilities), countPtr);
+        count_VkDisplayPlaneInfo2KHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPlaneInfo2KHR*)(local_pDisplayPlaneInfo), countPtr);
+        count_VkDisplayPlaneCapabilities2KHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPlaneCapabilities2KHR*)(pCapabilities), countPtr);
     }
     uint32_t packetSize_vkGetDisplayPlaneCapabilities2KHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetDisplayPlaneCapabilities2KHR);
@@ -20039,9 +20042,9 @@
     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDisplayPlaneInfo2KHR(stream, (VkDisplayPlaneInfo2KHR*)(local_pDisplayPlaneInfo), streamPtrPtr);
-    reservedmarshal_VkDisplayPlaneCapabilities2KHR(stream, (VkDisplayPlaneCapabilities2KHR*)(pCapabilities), streamPtrPtr);
-    unmarshal_VkDisplayPlaneCapabilities2KHR(stream, (VkDisplayPlaneCapabilities2KHR*)(pCapabilities));
+    reservedmarshal_VkDisplayPlaneInfo2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPlaneInfo2KHR*)(local_pDisplayPlaneInfo), streamPtrPtr);
+    reservedmarshal_VkDisplayPlaneCapabilities2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPlaneCapabilities2KHR*)(pCapabilities), streamPtrPtr);
+    unmarshal_VkDisplayPlaneCapabilities2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPlaneCapabilities2KHR*)(pCapabilities));
     if (pCapabilities)
     {
         transform_fromhost_VkDisplayPlaneCapabilities2KHR(sResourceTracker, (VkDisplayPlaneCapabilities2KHR*)(pCapabilities));
@@ -20084,7 +20087,7 @@
     if (pInfo)
     {
         local_pInfo = (VkImageMemoryRequirementsInfo2*)pool->alloc(sizeof(const VkImageMemoryRequirementsInfo2));
-        deepcopy_VkImageMemoryRequirementsInfo2(pool, pInfo, (VkImageMemoryRequirementsInfo2*)(local_pInfo));
+        deepcopy_VkImageMemoryRequirementsInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo, (VkImageMemoryRequirementsInfo2*)(local_pInfo));
     }
     if (local_pInfo)
     {
@@ -20095,8 +20098,8 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkImageMemoryRequirementsInfo2(sFeatureBits, (VkImageMemoryRequirementsInfo2*)(local_pInfo), countPtr);
-        count_VkMemoryRequirements2(sFeatureBits, (VkMemoryRequirements2*)(pMemoryRequirements), countPtr);
+        count_VkImageMemoryRequirementsInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageMemoryRequirementsInfo2*)(local_pInfo), countPtr);
+        count_VkMemoryRequirements2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements), countPtr);
     }
     uint32_t packetSize_vkGetImageMemoryRequirements2KHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetImageMemoryRequirements2KHR);
@@ -20110,9 +20113,9 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkImageMemoryRequirementsInfo2(stream, (VkImageMemoryRequirementsInfo2*)(local_pInfo), streamPtrPtr);
-    reservedmarshal_VkMemoryRequirements2(stream, (VkMemoryRequirements2*)(pMemoryRequirements), streamPtrPtr);
-    unmarshal_VkMemoryRequirements2(stream, (VkMemoryRequirements2*)(pMemoryRequirements));
+    reservedmarshal_VkImageMemoryRequirementsInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageMemoryRequirementsInfo2*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements), streamPtrPtr);
+    unmarshal_VkMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements));
     if (pMemoryRequirements)
     {
         transform_fromhost_VkMemoryRequirements2(sResourceTracker, (VkMemoryRequirements2*)(pMemoryRequirements));
@@ -20144,7 +20147,7 @@
     if (pInfo)
     {
         local_pInfo = (VkBufferMemoryRequirementsInfo2*)pool->alloc(sizeof(const VkBufferMemoryRequirementsInfo2));
-        deepcopy_VkBufferMemoryRequirementsInfo2(pool, pInfo, (VkBufferMemoryRequirementsInfo2*)(local_pInfo));
+        deepcopy_VkBufferMemoryRequirementsInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo, (VkBufferMemoryRequirementsInfo2*)(local_pInfo));
     }
     if (local_pInfo)
     {
@@ -20155,8 +20158,8 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkBufferMemoryRequirementsInfo2(sFeatureBits, (VkBufferMemoryRequirementsInfo2*)(local_pInfo), countPtr);
-        count_VkMemoryRequirements2(sFeatureBits, (VkMemoryRequirements2*)(pMemoryRequirements), countPtr);
+        count_VkBufferMemoryRequirementsInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferMemoryRequirementsInfo2*)(local_pInfo), countPtr);
+        count_VkMemoryRequirements2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements), countPtr);
     }
     uint32_t packetSize_vkGetBufferMemoryRequirements2KHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetBufferMemoryRequirements2KHR);
@@ -20170,9 +20173,9 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkBufferMemoryRequirementsInfo2(stream, (VkBufferMemoryRequirementsInfo2*)(local_pInfo), streamPtrPtr);
-    reservedmarshal_VkMemoryRequirements2(stream, (VkMemoryRequirements2*)(pMemoryRequirements), streamPtrPtr);
-    unmarshal_VkMemoryRequirements2(stream, (VkMemoryRequirements2*)(pMemoryRequirements));
+    reservedmarshal_VkBufferMemoryRequirementsInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferMemoryRequirementsInfo2*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements), streamPtrPtr);
+    unmarshal_VkMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements));
     if (pMemoryRequirements)
     {
         transform_fromhost_VkMemoryRequirements2(sResourceTracker, (VkMemoryRequirements2*)(pMemoryRequirements));
@@ -20205,7 +20208,7 @@
     if (pInfo)
     {
         local_pInfo = (VkImageSparseMemoryRequirementsInfo2*)pool->alloc(sizeof(const VkImageSparseMemoryRequirementsInfo2));
-        deepcopy_VkImageSparseMemoryRequirementsInfo2(pool, pInfo, (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo));
+        deepcopy_VkImageSparseMemoryRequirementsInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo, (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo));
     }
     if (local_pInfo)
     {
@@ -20216,7 +20219,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkImageSparseMemoryRequirementsInfo2(sFeatureBits, (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo), countPtr);
+        count_VkImageSparseMemoryRequirementsInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (pSparseMemoryRequirementCount)
@@ -20231,7 +20234,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
                 {
-                    count_VkSparseImageMemoryRequirements2(sFeatureBits, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i), countPtr);
+                    count_VkSparseImageMemoryRequirements2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i), countPtr);
                 }
             }
         }
@@ -20248,7 +20251,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkImageSparseMemoryRequirementsInfo2(stream, (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkImageSparseMemoryRequirementsInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pSparseMemoryRequirementCount;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -20268,7 +20271,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
         {
-            reservedmarshal_VkSparseImageMemoryRequirements2(stream, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i), streamPtrPtr);
+            reservedmarshal_VkSparseImageMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -20295,7 +20298,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
             {
-                unmarshal_VkSparseImageMemoryRequirements2(stream, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
+                unmarshal_VkSparseImageMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
             }
         }
     }
@@ -20342,13 +20345,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkSamplerYcbcrConversionCreateInfo*)pool->alloc(sizeof(const VkSamplerYcbcrConversionCreateInfo));
-        deepcopy_VkSamplerYcbcrConversionCreateInfo(pool, pCreateInfo, (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkSamplerYcbcrConversionCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -20364,12 +20367,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkSamplerYcbcrConversionCreateInfo(sFeatureBits, (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkSamplerYcbcrConversionCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -20386,7 +20389,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkSamplerYcbcrConversionCreateInfo(stream, (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkSamplerYcbcrConversionCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -20394,7 +20397,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -20439,7 +20442,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -20457,7 +20460,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroySamplerYcbcrConversionKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -20483,7 +20486,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkSamplerYcbcrConversion((VkSamplerYcbcrConversion*)&ycbcrConversion);
     stream->flush();
@@ -20520,7 +20523,7 @@
         local_pBindInfos = (VkBindBufferMemoryInfo*)pool->alloc(((bindInfoCount)) * sizeof(const VkBindBufferMemoryInfo));
         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
         {
-            deepcopy_VkBindBufferMemoryInfo(pool, pBindInfos + i, (VkBindBufferMemoryInfo*)(local_pBindInfos + i));
+            deepcopy_VkBindBufferMemoryInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBindInfos + i, (VkBindBufferMemoryInfo*)(local_pBindInfos + i));
         }
     }
     if (local_pBindInfos)
@@ -20538,7 +20541,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
         {
-            count_VkBindBufferMemoryInfo(sFeatureBits, (VkBindBufferMemoryInfo*)(local_pBindInfos + i), countPtr);
+            count_VkBindBufferMemoryInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBindBufferMemoryInfo*)(local_pBindInfos + i), countPtr);
         }
     }
     uint32_t packetSize_vkBindBufferMemory2KHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -20557,7 +20560,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
     {
-        reservedmarshal_VkBindBufferMemoryInfo(stream, (VkBindBufferMemoryInfo*)(local_pBindInfos + i), streamPtrPtr);
+        reservedmarshal_VkBindBufferMemoryInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBindBufferMemoryInfo*)(local_pBindInfos + i), streamPtrPtr);
     }
     VkResult vkBindBufferMemory2KHR_VkResult_return = (VkResult)0;
     stream->read(&vkBindBufferMemory2KHR_VkResult_return, sizeof(VkResult));
@@ -20593,7 +20596,7 @@
         local_pBindInfos = (VkBindImageMemoryInfo*)pool->alloc(((bindInfoCount)) * sizeof(const VkBindImageMemoryInfo));
         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
         {
-            deepcopy_VkBindImageMemoryInfo(pool, pBindInfos + i, (VkBindImageMemoryInfo*)(local_pBindInfos + i));
+            deepcopy_VkBindImageMemoryInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBindInfos + i, (VkBindImageMemoryInfo*)(local_pBindInfos + i));
         }
     }
     if (local_pBindInfos)
@@ -20611,7 +20614,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
         {
-            count_VkBindImageMemoryInfo(sFeatureBits, (VkBindImageMemoryInfo*)(local_pBindInfos + i), countPtr);
+            count_VkBindImageMemoryInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBindImageMemoryInfo*)(local_pBindInfos + i), countPtr);
         }
     }
     uint32_t packetSize_vkBindImageMemory2KHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -20630,7 +20633,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
     {
-        reservedmarshal_VkBindImageMemoryInfo(stream, (VkBindImageMemoryInfo*)(local_pBindInfos + i), streamPtrPtr);
+        reservedmarshal_VkBindImageMemoryInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBindImageMemoryInfo*)(local_pBindInfos + i), streamPtrPtr);
     }
     VkResult vkBindImageMemory2KHR_VkResult_return = (VkResult)0;
     stream->read(&vkBindImageMemory2KHR_VkResult_return, sizeof(VkResult));
@@ -20666,7 +20669,7 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkDescriptorSetLayoutCreateInfo*)pool->alloc(sizeof(const VkDescriptorSetLayoutCreateInfo));
-        deepcopy_VkDescriptorSetLayoutCreateInfo(pool, pCreateInfo, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkDescriptorSetLayoutCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo));
     }
     if (local_pCreateInfo)
     {
@@ -20677,8 +20680,8 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDescriptorSetLayoutCreateInfo(sFeatureBits, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo), countPtr);
-        count_VkDescriptorSetLayoutSupport(sFeatureBits, (VkDescriptorSetLayoutSupport*)(pSupport), countPtr);
+        count_VkDescriptorSetLayoutCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkDescriptorSetLayoutSupport(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorSetLayoutSupport*)(pSupport), countPtr);
     }
     uint32_t packetSize_vkGetDescriptorSetLayoutSupportKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetDescriptorSetLayoutSupportKHR);
@@ -20692,9 +20695,9 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDescriptorSetLayoutCreateInfo(stream, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo), streamPtrPtr);
-    reservedmarshal_VkDescriptorSetLayoutSupport(stream, (VkDescriptorSetLayoutSupport*)(pSupport), streamPtrPtr);
-    unmarshal_VkDescriptorSetLayoutSupport(stream, (VkDescriptorSetLayoutSupport*)(pSupport));
+    reservedmarshal_VkDescriptorSetLayoutCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkDescriptorSetLayoutSupport(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorSetLayoutSupport*)(pSupport), streamPtrPtr);
+    unmarshal_VkDescriptorSetLayoutSupport(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorSetLayoutSupport*)(pSupport));
     if (pSupport)
     {
         transform_fromhost_VkDescriptorSetLayoutSupport(sResourceTracker, (VkDescriptorSetLayoutSupport*)(pSupport));
@@ -20966,7 +20969,7 @@
     if (pWaitInfo)
     {
         local_pWaitInfo = (VkSemaphoreWaitInfo*)pool->alloc(sizeof(const VkSemaphoreWaitInfo));
-        deepcopy_VkSemaphoreWaitInfo(pool, pWaitInfo, (VkSemaphoreWaitInfo*)(local_pWaitInfo));
+        deepcopy_VkSemaphoreWaitInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pWaitInfo, (VkSemaphoreWaitInfo*)(local_pWaitInfo));
     }
     local_timeout = timeout;
     if (local_pWaitInfo)
@@ -20978,7 +20981,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkSemaphoreWaitInfo(sFeatureBits, (VkSemaphoreWaitInfo*)(local_pWaitInfo), countPtr);
+        count_VkSemaphoreWaitInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSemaphoreWaitInfo*)(local_pWaitInfo), countPtr);
         *countPtr += sizeof(uint64_t);
     }
     uint32_t packetSize_vkWaitSemaphoresKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -20993,7 +20996,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkSemaphoreWaitInfo(stream, (VkSemaphoreWaitInfo*)(local_pWaitInfo), streamPtrPtr);
+    reservedmarshal_VkSemaphoreWaitInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSemaphoreWaitInfo*)(local_pWaitInfo), streamPtrPtr);
     memcpy(*streamPtrPtr, (uint64_t*)&local_timeout, sizeof(uint64_t));
     *streamPtrPtr += sizeof(uint64_t);
     VkResult vkWaitSemaphoresKHR_VkResult_return = (VkResult)0;
@@ -21025,7 +21028,7 @@
     if (pSignalInfo)
     {
         local_pSignalInfo = (VkSemaphoreSignalInfo*)pool->alloc(sizeof(const VkSemaphoreSignalInfo));
-        deepcopy_VkSemaphoreSignalInfo(pool, pSignalInfo, (VkSemaphoreSignalInfo*)(local_pSignalInfo));
+        deepcopy_VkSemaphoreSignalInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSignalInfo, (VkSemaphoreSignalInfo*)(local_pSignalInfo));
     }
     if (local_pSignalInfo)
     {
@@ -21036,7 +21039,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkSemaphoreSignalInfo(sFeatureBits, (VkSemaphoreSignalInfo*)(local_pSignalInfo), countPtr);
+        count_VkSemaphoreSignalInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSemaphoreSignalInfo*)(local_pSignalInfo), countPtr);
     }
     uint32_t packetSize_vkSignalSemaphoreKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkSignalSemaphoreKHR);
@@ -21050,7 +21053,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkSemaphoreSignalInfo(stream, (VkSemaphoreSignalInfo*)(local_pSignalInfo), streamPtrPtr);
+    reservedmarshal_VkSemaphoreSignalInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSemaphoreSignalInfo*)(local_pSignalInfo), streamPtrPtr);
     VkResult vkSignalSemaphoreKHR_VkResult_return = (VkResult)0;
     stream->read(&vkSignalSemaphoreKHR_VkResult_return, sizeof(VkResult));
     ++encodeCount;;
@@ -21101,7 +21104,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pFragmentShadingRateCount)); ++i)
                 {
-                    count_VkPhysicalDeviceFragmentShadingRateKHR(sFeatureBits, (VkPhysicalDeviceFragmentShadingRateKHR*)(pFragmentShadingRates + i), countPtr);
+                    count_VkPhysicalDeviceFragmentShadingRateKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceFragmentShadingRateKHR*)(pFragmentShadingRates + i), countPtr);
                 }
             }
         }
@@ -21137,7 +21140,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pFragmentShadingRateCount)); ++i)
         {
-            reservedmarshal_VkPhysicalDeviceFragmentShadingRateKHR(stream, (VkPhysicalDeviceFragmentShadingRateKHR*)(pFragmentShadingRates + i), streamPtrPtr);
+            reservedmarshal_VkPhysicalDeviceFragmentShadingRateKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceFragmentShadingRateKHR*)(pFragmentShadingRates + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -21164,7 +21167,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pFragmentShadingRateCount)); ++i)
             {
-                unmarshal_VkPhysicalDeviceFragmentShadingRateKHR(stream, (VkPhysicalDeviceFragmentShadingRateKHR*)(pFragmentShadingRates + i));
+                unmarshal_VkPhysicalDeviceFragmentShadingRateKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceFragmentShadingRateKHR*)(pFragmentShadingRates + i));
             }
         }
     }
@@ -21209,7 +21212,7 @@
     if (pFragmentSize)
     {
         local_pFragmentSize = (VkExtent2D*)pool->alloc(sizeof(const VkExtent2D));
-        deepcopy_VkExtent2D(pool, pFragmentSize, (VkExtent2D*)(local_pFragmentSize));
+        deepcopy_VkExtent2D(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pFragmentSize, (VkExtent2D*)(local_pFragmentSize));
     }
     memcpy(local_combinerOps, combinerOps, 2 * sizeof(const VkFragmentShadingRateCombinerOpKHR));
     if (local_pFragmentSize)
@@ -21221,7 +21224,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkExtent2D(sFeatureBits, (VkExtent2D*)(local_pFragmentSize), countPtr);
+        count_VkExtent2D(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtent2D*)(local_pFragmentSize), countPtr);
         *countPtr += 2 * sizeof(VkFragmentShadingRateCombinerOpKHR);
     }
     uint32_t packetSize_vkCmdSetFragmentShadingRateKHR = 4 + 4 + count;
@@ -21238,7 +21241,7 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkExtent2D(stream, (VkExtent2D*)(local_pFragmentSize), streamPtrPtr);
+    reservedmarshal_VkExtent2D(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtent2D*)(local_pFragmentSize), streamPtrPtr);
     memcpy(*streamPtrPtr, (VkFragmentShadingRateCombinerOpKHR*)local_combinerOps, 2 * sizeof(VkFragmentShadingRateCombinerOpKHR));
     *streamPtrPtr += 2 * sizeof(VkFragmentShadingRateCombinerOpKHR);
     ++encodeCount;;
@@ -21277,7 +21280,7 @@
     if (pInfo)
     {
         local_pInfo = (VkBufferDeviceAddressInfo*)pool->alloc(sizeof(const VkBufferDeviceAddressInfo));
-        deepcopy_VkBufferDeviceAddressInfo(pool, pInfo, (VkBufferDeviceAddressInfo*)(local_pInfo));
+        deepcopy_VkBufferDeviceAddressInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo, (VkBufferDeviceAddressInfo*)(local_pInfo));
     }
     if (local_pInfo)
     {
@@ -21288,7 +21291,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkBufferDeviceAddressInfo(sFeatureBits, (VkBufferDeviceAddressInfo*)(local_pInfo), countPtr);
+        count_VkBufferDeviceAddressInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferDeviceAddressInfo*)(local_pInfo), countPtr);
     }
     uint32_t packetSize_vkGetBufferDeviceAddressKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetBufferDeviceAddressKHR);
@@ -21302,7 +21305,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkBufferDeviceAddressInfo(stream, (VkBufferDeviceAddressInfo*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkBufferDeviceAddressInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferDeviceAddressInfo*)(local_pInfo), streamPtrPtr);
     VkDeviceAddress vkGetBufferDeviceAddressKHR_VkDeviceAddress_return = (VkDeviceAddress)0;
     stream->read(&vkGetBufferDeviceAddressKHR_VkDeviceAddress_return, sizeof(VkDeviceAddress));
     ++encodeCount;;
@@ -21332,7 +21335,7 @@
     if (pInfo)
     {
         local_pInfo = (VkBufferDeviceAddressInfo*)pool->alloc(sizeof(const VkBufferDeviceAddressInfo));
-        deepcopy_VkBufferDeviceAddressInfo(pool, pInfo, (VkBufferDeviceAddressInfo*)(local_pInfo));
+        deepcopy_VkBufferDeviceAddressInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo, (VkBufferDeviceAddressInfo*)(local_pInfo));
     }
     if (local_pInfo)
     {
@@ -21343,7 +21346,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkBufferDeviceAddressInfo(sFeatureBits, (VkBufferDeviceAddressInfo*)(local_pInfo), countPtr);
+        count_VkBufferDeviceAddressInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferDeviceAddressInfo*)(local_pInfo), countPtr);
     }
     uint32_t packetSize_vkGetBufferOpaqueCaptureAddressKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetBufferOpaqueCaptureAddressKHR);
@@ -21357,7 +21360,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkBufferDeviceAddressInfo(stream, (VkBufferDeviceAddressInfo*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkBufferDeviceAddressInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferDeviceAddressInfo*)(local_pInfo), streamPtrPtr);
     uint64_t vkGetBufferOpaqueCaptureAddressKHR_uint64_t_return = (uint64_t)0;
     stream->read(&vkGetBufferOpaqueCaptureAddressKHR_uint64_t_return, sizeof(uint64_t));
     ++encodeCount;;
@@ -21387,7 +21390,7 @@
     if (pInfo)
     {
         local_pInfo = (VkDeviceMemoryOpaqueCaptureAddressInfo*)pool->alloc(sizeof(const VkDeviceMemoryOpaqueCaptureAddressInfo));
-        deepcopy_VkDeviceMemoryOpaqueCaptureAddressInfo(pool, pInfo, (VkDeviceMemoryOpaqueCaptureAddressInfo*)(local_pInfo));
+        deepcopy_VkDeviceMemoryOpaqueCaptureAddressInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo, (VkDeviceMemoryOpaqueCaptureAddressInfo*)(local_pInfo));
     }
     if (local_pInfo)
     {
@@ -21398,7 +21401,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDeviceMemoryOpaqueCaptureAddressInfo(sFeatureBits, (VkDeviceMemoryOpaqueCaptureAddressInfo*)(local_pInfo), countPtr);
+        count_VkDeviceMemoryOpaqueCaptureAddressInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceMemoryOpaqueCaptureAddressInfo*)(local_pInfo), countPtr);
     }
     uint32_t packetSize_vkGetDeviceMemoryOpaqueCaptureAddressKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceMemoryOpaqueCaptureAddressKHR);
@@ -21412,7 +21415,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDeviceMemoryOpaqueCaptureAddressInfo(stream, (VkDeviceMemoryOpaqueCaptureAddressInfo*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkDeviceMemoryOpaqueCaptureAddressInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceMemoryOpaqueCaptureAddressInfo*)(local_pInfo), streamPtrPtr);
     uint64_t vkGetDeviceMemoryOpaqueCaptureAddressKHR_uint64_t_return = (uint64_t)0;
     stream->read(&vkGetDeviceMemoryOpaqueCaptureAddressKHR_uint64_t_return, sizeof(uint64_t));
     ++encodeCount;;
@@ -21445,7 +21448,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -21461,7 +21464,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         *countPtr += 8;
     }
@@ -21484,7 +21487,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     uint64_t cgen_var_2 = (uint64_t)(*pDeferredOperation);
     memcpy((*streamPtrPtr), &cgen_var_2, 8);
@@ -21523,7 +21526,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -21540,7 +21543,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyDeferredOperationKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -21566,7 +21569,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     stream->flush();
     ++encodeCount;;
@@ -21746,7 +21749,7 @@
     if (pPipelineInfo)
     {
         local_pPipelineInfo = (VkPipelineInfoKHR*)pool->alloc(sizeof(const VkPipelineInfoKHR));
-        deepcopy_VkPipelineInfoKHR(pool, pPipelineInfo, (VkPipelineInfoKHR*)(local_pPipelineInfo));
+        deepcopy_VkPipelineInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pPipelineInfo, (VkPipelineInfoKHR*)(local_pPipelineInfo));
     }
     if (local_pPipelineInfo)
     {
@@ -21757,7 +21760,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPipelineInfoKHR(sFeatureBits, (VkPipelineInfoKHR*)(local_pPipelineInfo), countPtr);
+        count_VkPipelineInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineInfoKHR*)(local_pPipelineInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (pExecutableCount)
@@ -21772,7 +21775,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pExecutableCount)); ++i)
                 {
-                    count_VkPipelineExecutablePropertiesKHR(sFeatureBits, (VkPipelineExecutablePropertiesKHR*)(pProperties + i), countPtr);
+                    count_VkPipelineExecutablePropertiesKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineExecutablePropertiesKHR*)(pProperties + i), countPtr);
                 }
             }
         }
@@ -21789,7 +21792,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPipelineInfoKHR(stream, (VkPipelineInfoKHR*)(local_pPipelineInfo), streamPtrPtr);
+    reservedmarshal_VkPipelineInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineInfoKHR*)(local_pPipelineInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pExecutableCount;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -21809,7 +21812,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pExecutableCount)); ++i)
         {
-            reservedmarshal_VkPipelineExecutablePropertiesKHR(stream, (VkPipelineExecutablePropertiesKHR*)(pProperties + i), streamPtrPtr);
+            reservedmarshal_VkPipelineExecutablePropertiesKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineExecutablePropertiesKHR*)(pProperties + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -21836,7 +21839,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pExecutableCount)); ++i)
             {
-                unmarshal_VkPipelineExecutablePropertiesKHR(stream, (VkPipelineExecutablePropertiesKHR*)(pProperties + i));
+                unmarshal_VkPipelineExecutablePropertiesKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineExecutablePropertiesKHR*)(pProperties + i));
             }
         }
     }
@@ -21881,7 +21884,7 @@
     if (pExecutableInfo)
     {
         local_pExecutableInfo = (VkPipelineExecutableInfoKHR*)pool->alloc(sizeof(const VkPipelineExecutableInfoKHR));
-        deepcopy_VkPipelineExecutableInfoKHR(pool, pExecutableInfo, (VkPipelineExecutableInfoKHR*)(local_pExecutableInfo));
+        deepcopy_VkPipelineExecutableInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pExecutableInfo, (VkPipelineExecutableInfoKHR*)(local_pExecutableInfo));
     }
     if (local_pExecutableInfo)
     {
@@ -21892,7 +21895,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPipelineExecutableInfoKHR(sFeatureBits, (VkPipelineExecutableInfoKHR*)(local_pExecutableInfo), countPtr);
+        count_VkPipelineExecutableInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineExecutableInfoKHR*)(local_pExecutableInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (pStatisticCount)
@@ -21907,7 +21910,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pStatisticCount)); ++i)
                 {
-                    count_VkPipelineExecutableStatisticKHR(sFeatureBits, (VkPipelineExecutableStatisticKHR*)(pStatistics + i), countPtr);
+                    count_VkPipelineExecutableStatisticKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineExecutableStatisticKHR*)(pStatistics + i), countPtr);
                 }
             }
         }
@@ -21924,7 +21927,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPipelineExecutableInfoKHR(stream, (VkPipelineExecutableInfoKHR*)(local_pExecutableInfo), streamPtrPtr);
+    reservedmarshal_VkPipelineExecutableInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineExecutableInfoKHR*)(local_pExecutableInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pStatisticCount;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -21944,7 +21947,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pStatisticCount)); ++i)
         {
-            reservedmarshal_VkPipelineExecutableStatisticKHR(stream, (VkPipelineExecutableStatisticKHR*)(pStatistics + i), streamPtrPtr);
+            reservedmarshal_VkPipelineExecutableStatisticKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineExecutableStatisticKHR*)(pStatistics + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -21971,7 +21974,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pStatisticCount)); ++i)
             {
-                unmarshal_VkPipelineExecutableStatisticKHR(stream, (VkPipelineExecutableStatisticKHR*)(pStatistics + i));
+                unmarshal_VkPipelineExecutableStatisticKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineExecutableStatisticKHR*)(pStatistics + i));
             }
         }
     }
@@ -22016,7 +22019,7 @@
     if (pExecutableInfo)
     {
         local_pExecutableInfo = (VkPipelineExecutableInfoKHR*)pool->alloc(sizeof(const VkPipelineExecutableInfoKHR));
-        deepcopy_VkPipelineExecutableInfoKHR(pool, pExecutableInfo, (VkPipelineExecutableInfoKHR*)(local_pExecutableInfo));
+        deepcopy_VkPipelineExecutableInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pExecutableInfo, (VkPipelineExecutableInfoKHR*)(local_pExecutableInfo));
     }
     if (local_pExecutableInfo)
     {
@@ -22027,7 +22030,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPipelineExecutableInfoKHR(sFeatureBits, (VkPipelineExecutableInfoKHR*)(local_pExecutableInfo), countPtr);
+        count_VkPipelineExecutableInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineExecutableInfoKHR*)(local_pExecutableInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (pInternalRepresentationCount)
@@ -22042,7 +22045,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pInternalRepresentationCount)); ++i)
                 {
-                    count_VkPipelineExecutableInternalRepresentationKHR(sFeatureBits, (VkPipelineExecutableInternalRepresentationKHR*)(pInternalRepresentations + i), countPtr);
+                    count_VkPipelineExecutableInternalRepresentationKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineExecutableInternalRepresentationKHR*)(pInternalRepresentations + i), countPtr);
                 }
             }
         }
@@ -22059,7 +22062,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPipelineExecutableInfoKHR(stream, (VkPipelineExecutableInfoKHR*)(local_pExecutableInfo), streamPtrPtr);
+    reservedmarshal_VkPipelineExecutableInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineExecutableInfoKHR*)(local_pExecutableInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pInternalRepresentationCount;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -22079,7 +22082,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pInternalRepresentationCount)); ++i)
         {
-            reservedmarshal_VkPipelineExecutableInternalRepresentationKHR(stream, (VkPipelineExecutableInternalRepresentationKHR*)(pInternalRepresentations + i), streamPtrPtr);
+            reservedmarshal_VkPipelineExecutableInternalRepresentationKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineExecutableInternalRepresentationKHR*)(pInternalRepresentations + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -22106,7 +22109,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pInternalRepresentationCount)); ++i)
             {
-                unmarshal_VkPipelineExecutableInternalRepresentationKHR(stream, (VkPipelineExecutableInternalRepresentationKHR*)(pInternalRepresentations + i));
+                unmarshal_VkPipelineExecutableInternalRepresentationKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineExecutableInternalRepresentationKHR*)(pInternalRepresentations + i));
             }
         }
     }
@@ -22155,7 +22158,7 @@
     if (pCopyBufferInfo)
     {
         local_pCopyBufferInfo = (VkCopyBufferInfo2KHR*)pool->alloc(sizeof(const VkCopyBufferInfo2KHR));
-        deepcopy_VkCopyBufferInfo2KHR(pool, pCopyBufferInfo, (VkCopyBufferInfo2KHR*)(local_pCopyBufferInfo));
+        deepcopy_VkCopyBufferInfo2KHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCopyBufferInfo, (VkCopyBufferInfo2KHR*)(local_pCopyBufferInfo));
     }
     if (local_pCopyBufferInfo)
     {
@@ -22166,7 +22169,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkCopyBufferInfo2KHR(sFeatureBits, (VkCopyBufferInfo2KHR*)(local_pCopyBufferInfo), countPtr);
+        count_VkCopyBufferInfo2KHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyBufferInfo2KHR*)(local_pCopyBufferInfo), countPtr);
     }
     uint32_t packetSize_vkCmdCopyBuffer2KHR = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdCopyBuffer2KHR -= 8;
@@ -22182,7 +22185,7 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkCopyBufferInfo2KHR(stream, (VkCopyBufferInfo2KHR*)(local_pCopyBufferInfo), streamPtrPtr);
+    reservedmarshal_VkCopyBufferInfo2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyBufferInfo2KHR*)(local_pCopyBufferInfo), streamPtrPtr);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -22209,7 +22212,7 @@
     if (pCopyImageInfo)
     {
         local_pCopyImageInfo = (VkCopyImageInfo2KHR*)pool->alloc(sizeof(const VkCopyImageInfo2KHR));
-        deepcopy_VkCopyImageInfo2KHR(pool, pCopyImageInfo, (VkCopyImageInfo2KHR*)(local_pCopyImageInfo));
+        deepcopy_VkCopyImageInfo2KHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCopyImageInfo, (VkCopyImageInfo2KHR*)(local_pCopyImageInfo));
     }
     if (local_pCopyImageInfo)
     {
@@ -22220,7 +22223,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkCopyImageInfo2KHR(sFeatureBits, (VkCopyImageInfo2KHR*)(local_pCopyImageInfo), countPtr);
+        count_VkCopyImageInfo2KHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyImageInfo2KHR*)(local_pCopyImageInfo), countPtr);
     }
     uint32_t packetSize_vkCmdCopyImage2KHR = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdCopyImage2KHR -= 8;
@@ -22236,7 +22239,7 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkCopyImageInfo2KHR(stream, (VkCopyImageInfo2KHR*)(local_pCopyImageInfo), streamPtrPtr);
+    reservedmarshal_VkCopyImageInfo2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyImageInfo2KHR*)(local_pCopyImageInfo), streamPtrPtr);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -22263,7 +22266,7 @@
     if (pCopyBufferToImageInfo)
     {
         local_pCopyBufferToImageInfo = (VkCopyBufferToImageInfo2KHR*)pool->alloc(sizeof(const VkCopyBufferToImageInfo2KHR));
-        deepcopy_VkCopyBufferToImageInfo2KHR(pool, pCopyBufferToImageInfo, (VkCopyBufferToImageInfo2KHR*)(local_pCopyBufferToImageInfo));
+        deepcopy_VkCopyBufferToImageInfo2KHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCopyBufferToImageInfo, (VkCopyBufferToImageInfo2KHR*)(local_pCopyBufferToImageInfo));
     }
     if (local_pCopyBufferToImageInfo)
     {
@@ -22274,7 +22277,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkCopyBufferToImageInfo2KHR(sFeatureBits, (VkCopyBufferToImageInfo2KHR*)(local_pCopyBufferToImageInfo), countPtr);
+        count_VkCopyBufferToImageInfo2KHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyBufferToImageInfo2KHR*)(local_pCopyBufferToImageInfo), countPtr);
     }
     uint32_t packetSize_vkCmdCopyBufferToImage2KHR = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdCopyBufferToImage2KHR -= 8;
@@ -22290,7 +22293,7 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkCopyBufferToImageInfo2KHR(stream, (VkCopyBufferToImageInfo2KHR*)(local_pCopyBufferToImageInfo), streamPtrPtr);
+    reservedmarshal_VkCopyBufferToImageInfo2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyBufferToImageInfo2KHR*)(local_pCopyBufferToImageInfo), streamPtrPtr);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -22317,7 +22320,7 @@
     if (pCopyImageToBufferInfo)
     {
         local_pCopyImageToBufferInfo = (VkCopyImageToBufferInfo2KHR*)pool->alloc(sizeof(const VkCopyImageToBufferInfo2KHR));
-        deepcopy_VkCopyImageToBufferInfo2KHR(pool, pCopyImageToBufferInfo, (VkCopyImageToBufferInfo2KHR*)(local_pCopyImageToBufferInfo));
+        deepcopy_VkCopyImageToBufferInfo2KHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCopyImageToBufferInfo, (VkCopyImageToBufferInfo2KHR*)(local_pCopyImageToBufferInfo));
     }
     if (local_pCopyImageToBufferInfo)
     {
@@ -22328,7 +22331,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkCopyImageToBufferInfo2KHR(sFeatureBits, (VkCopyImageToBufferInfo2KHR*)(local_pCopyImageToBufferInfo), countPtr);
+        count_VkCopyImageToBufferInfo2KHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyImageToBufferInfo2KHR*)(local_pCopyImageToBufferInfo), countPtr);
     }
     uint32_t packetSize_vkCmdCopyImageToBuffer2KHR = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdCopyImageToBuffer2KHR -= 8;
@@ -22344,7 +22347,7 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkCopyImageToBufferInfo2KHR(stream, (VkCopyImageToBufferInfo2KHR*)(local_pCopyImageToBufferInfo), streamPtrPtr);
+    reservedmarshal_VkCopyImageToBufferInfo2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyImageToBufferInfo2KHR*)(local_pCopyImageToBufferInfo), streamPtrPtr);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -22371,7 +22374,7 @@
     if (pBlitImageInfo)
     {
         local_pBlitImageInfo = (VkBlitImageInfo2KHR*)pool->alloc(sizeof(const VkBlitImageInfo2KHR));
-        deepcopy_VkBlitImageInfo2KHR(pool, pBlitImageInfo, (VkBlitImageInfo2KHR*)(local_pBlitImageInfo));
+        deepcopy_VkBlitImageInfo2KHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBlitImageInfo, (VkBlitImageInfo2KHR*)(local_pBlitImageInfo));
     }
     if (local_pBlitImageInfo)
     {
@@ -22382,7 +22385,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkBlitImageInfo2KHR(sFeatureBits, (VkBlitImageInfo2KHR*)(local_pBlitImageInfo), countPtr);
+        count_VkBlitImageInfo2KHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBlitImageInfo2KHR*)(local_pBlitImageInfo), countPtr);
     }
     uint32_t packetSize_vkCmdBlitImage2KHR = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdBlitImage2KHR -= 8;
@@ -22398,7 +22401,7 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkBlitImageInfo2KHR(stream, (VkBlitImageInfo2KHR*)(local_pBlitImageInfo), streamPtrPtr);
+    reservedmarshal_VkBlitImageInfo2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBlitImageInfo2KHR*)(local_pBlitImageInfo), streamPtrPtr);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -22425,7 +22428,7 @@
     if (pResolveImageInfo)
     {
         local_pResolveImageInfo = (VkResolveImageInfo2KHR*)pool->alloc(sizeof(const VkResolveImageInfo2KHR));
-        deepcopy_VkResolveImageInfo2KHR(pool, pResolveImageInfo, (VkResolveImageInfo2KHR*)(local_pResolveImageInfo));
+        deepcopy_VkResolveImageInfo2KHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pResolveImageInfo, (VkResolveImageInfo2KHR*)(local_pResolveImageInfo));
     }
     if (local_pResolveImageInfo)
     {
@@ -22436,7 +22439,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkResolveImageInfo2KHR(sFeatureBits, (VkResolveImageInfo2KHR*)(local_pResolveImageInfo), countPtr);
+        count_VkResolveImageInfo2KHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkResolveImageInfo2KHR*)(local_pResolveImageInfo), countPtr);
     }
     uint32_t packetSize_vkCmdResolveImage2KHR = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdResolveImage2KHR -= 8;
@@ -22452,7 +22455,7 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkResolveImageInfo2KHR(stream, (VkResolveImageInfo2KHR*)(local_pResolveImageInfo), streamPtrPtr);
+    reservedmarshal_VkResolveImageInfo2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkResolveImageInfo2KHR*)(local_pResolveImageInfo), streamPtrPtr);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -22712,13 +22715,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkDebugReportCallbackCreateInfoEXT*)pool->alloc(sizeof(const VkDebugReportCallbackCreateInfoEXT));
-        deepcopy_VkDebugReportCallbackCreateInfoEXT(pool, pCreateInfo, (VkDebugReportCallbackCreateInfoEXT*)(local_pCreateInfo));
+        deepcopy_VkDebugReportCallbackCreateInfoEXT(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkDebugReportCallbackCreateInfoEXT*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -22734,12 +22737,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDebugReportCallbackCreateInfoEXT(sFeatureBits, (VkDebugReportCallbackCreateInfoEXT*)(local_pCreateInfo), countPtr);
+        count_VkDebugReportCallbackCreateInfoEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugReportCallbackCreateInfoEXT*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -22756,7 +22759,7 @@
     *&cgen_var_0 = get_host_u64_VkInstance((*&local_instance));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDebugReportCallbackCreateInfoEXT(stream, (VkDebugReportCallbackCreateInfoEXT*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkDebugReportCallbackCreateInfoEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugReportCallbackCreateInfoEXT*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -22764,7 +22767,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -22809,7 +22812,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -22827,7 +22830,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyDebugReportCallbackEXT = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -22853,7 +22856,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkDebugReportCallbackEXT((VkDebugReportCallbackEXT*)&callback);
     stream->flush();
@@ -22994,7 +22997,7 @@
     if (pTagInfo)
     {
         local_pTagInfo = (VkDebugMarkerObjectTagInfoEXT*)pool->alloc(sizeof(const VkDebugMarkerObjectTagInfoEXT));
-        deepcopy_VkDebugMarkerObjectTagInfoEXT(pool, pTagInfo, (VkDebugMarkerObjectTagInfoEXT*)(local_pTagInfo));
+        deepcopy_VkDebugMarkerObjectTagInfoEXT(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pTagInfo, (VkDebugMarkerObjectTagInfoEXT*)(local_pTagInfo));
     }
     if (local_pTagInfo)
     {
@@ -23005,7 +23008,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDebugMarkerObjectTagInfoEXT(sFeatureBits, (VkDebugMarkerObjectTagInfoEXT*)(local_pTagInfo), countPtr);
+        count_VkDebugMarkerObjectTagInfoEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugMarkerObjectTagInfoEXT*)(local_pTagInfo), countPtr);
     }
     uint32_t packetSize_vkDebugMarkerSetObjectTagEXT = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkDebugMarkerSetObjectTagEXT);
@@ -23019,7 +23022,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDebugMarkerObjectTagInfoEXT(stream, (VkDebugMarkerObjectTagInfoEXT*)(local_pTagInfo), streamPtrPtr);
+    reservedmarshal_VkDebugMarkerObjectTagInfoEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugMarkerObjectTagInfoEXT*)(local_pTagInfo), streamPtrPtr);
     VkResult vkDebugMarkerSetObjectTagEXT_VkResult_return = (VkResult)0;
     stream->read(&vkDebugMarkerSetObjectTagEXT_VkResult_return, sizeof(VkResult));
     ++encodeCount;;
@@ -23049,7 +23052,7 @@
     if (pNameInfo)
     {
         local_pNameInfo = (VkDebugMarkerObjectNameInfoEXT*)pool->alloc(sizeof(const VkDebugMarkerObjectNameInfoEXT));
-        deepcopy_VkDebugMarkerObjectNameInfoEXT(pool, pNameInfo, (VkDebugMarkerObjectNameInfoEXT*)(local_pNameInfo));
+        deepcopy_VkDebugMarkerObjectNameInfoEXT(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pNameInfo, (VkDebugMarkerObjectNameInfoEXT*)(local_pNameInfo));
     }
     if (local_pNameInfo)
     {
@@ -23060,7 +23063,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDebugMarkerObjectNameInfoEXT(sFeatureBits, (VkDebugMarkerObjectNameInfoEXT*)(local_pNameInfo), countPtr);
+        count_VkDebugMarkerObjectNameInfoEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugMarkerObjectNameInfoEXT*)(local_pNameInfo), countPtr);
     }
     uint32_t packetSize_vkDebugMarkerSetObjectNameEXT = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkDebugMarkerSetObjectNameEXT);
@@ -23074,7 +23077,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDebugMarkerObjectNameInfoEXT(stream, (VkDebugMarkerObjectNameInfoEXT*)(local_pNameInfo), streamPtrPtr);
+    reservedmarshal_VkDebugMarkerObjectNameInfoEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugMarkerObjectNameInfoEXT*)(local_pNameInfo), streamPtrPtr);
     VkResult vkDebugMarkerSetObjectNameEXT_VkResult_return = (VkResult)0;
     stream->read(&vkDebugMarkerSetObjectNameEXT_VkResult_return, sizeof(VkResult));
     ++encodeCount;;
@@ -23104,7 +23107,7 @@
     if (pMarkerInfo)
     {
         local_pMarkerInfo = (VkDebugMarkerMarkerInfoEXT*)pool->alloc(sizeof(const VkDebugMarkerMarkerInfoEXT));
-        deepcopy_VkDebugMarkerMarkerInfoEXT(pool, pMarkerInfo, (VkDebugMarkerMarkerInfoEXT*)(local_pMarkerInfo));
+        deepcopy_VkDebugMarkerMarkerInfoEXT(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pMarkerInfo, (VkDebugMarkerMarkerInfoEXT*)(local_pMarkerInfo));
     }
     if (local_pMarkerInfo)
     {
@@ -23115,7 +23118,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDebugMarkerMarkerInfoEXT(sFeatureBits, (VkDebugMarkerMarkerInfoEXT*)(local_pMarkerInfo), countPtr);
+        count_VkDebugMarkerMarkerInfoEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugMarkerMarkerInfoEXT*)(local_pMarkerInfo), countPtr);
     }
     uint32_t packetSize_vkCmdDebugMarkerBeginEXT = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdDebugMarkerBeginEXT -= 8;
@@ -23131,7 +23134,7 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkDebugMarkerMarkerInfoEXT(stream, (VkDebugMarkerMarkerInfoEXT*)(local_pMarkerInfo), streamPtrPtr);
+    reservedmarshal_VkDebugMarkerMarkerInfoEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugMarkerMarkerInfoEXT*)(local_pMarkerInfo), streamPtrPtr);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -23198,7 +23201,7 @@
     if (pMarkerInfo)
     {
         local_pMarkerInfo = (VkDebugMarkerMarkerInfoEXT*)pool->alloc(sizeof(const VkDebugMarkerMarkerInfoEXT));
-        deepcopy_VkDebugMarkerMarkerInfoEXT(pool, pMarkerInfo, (VkDebugMarkerMarkerInfoEXT*)(local_pMarkerInfo));
+        deepcopy_VkDebugMarkerMarkerInfoEXT(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pMarkerInfo, (VkDebugMarkerMarkerInfoEXT*)(local_pMarkerInfo));
     }
     if (local_pMarkerInfo)
     {
@@ -23209,7 +23212,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDebugMarkerMarkerInfoEXT(sFeatureBits, (VkDebugMarkerMarkerInfoEXT*)(local_pMarkerInfo), countPtr);
+        count_VkDebugMarkerMarkerInfoEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugMarkerMarkerInfoEXT*)(local_pMarkerInfo), countPtr);
     }
     uint32_t packetSize_vkCmdDebugMarkerInsertEXT = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdDebugMarkerInsertEXT -= 8;
@@ -23225,7 +23228,7 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkDebugMarkerMarkerInfoEXT(stream, (VkDebugMarkerMarkerInfoEXT*)(local_pMarkerInfo), streamPtrPtr);
+    reservedmarshal_VkDebugMarkerMarkerInfoEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugMarkerMarkerInfoEXT*)(local_pMarkerInfo), streamPtrPtr);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -23770,7 +23773,7 @@
     if (pInfo)
     {
         local_pInfo = (VkImageViewHandleInfoNVX*)pool->alloc(sizeof(const VkImageViewHandleInfoNVX));
-        deepcopy_VkImageViewHandleInfoNVX(pool, pInfo, (VkImageViewHandleInfoNVX*)(local_pInfo));
+        deepcopy_VkImageViewHandleInfoNVX(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo, (VkImageViewHandleInfoNVX*)(local_pInfo));
     }
     if (local_pInfo)
     {
@@ -23781,7 +23784,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkImageViewHandleInfoNVX(sFeatureBits, (VkImageViewHandleInfoNVX*)(local_pInfo), countPtr);
+        count_VkImageViewHandleInfoNVX(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageViewHandleInfoNVX*)(local_pInfo), countPtr);
     }
     uint32_t packetSize_vkGetImageViewHandleNVX = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetImageViewHandleNVX);
@@ -23795,7 +23798,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkImageViewHandleInfoNVX(stream, (VkImageViewHandleInfoNVX*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkImageViewHandleInfoNVX(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageViewHandleInfoNVX*)(local_pInfo), streamPtrPtr);
     uint32_t vkGetImageViewHandleNVX_uint32_t_return = (uint32_t)0;
     stream->read(&vkGetImageViewHandleNVX_uint32_t_return, sizeof(uint32_t));
     ++encodeCount;;
@@ -23830,7 +23833,7 @@
         *countPtr += 1 * 8;
         uint64_t cgen_var_1;
         *countPtr += 1 * 8;
-        count_VkImageViewAddressPropertiesNVX(sFeatureBits, (VkImageViewAddressPropertiesNVX*)(pProperties), countPtr);
+        count_VkImageViewAddressPropertiesNVX(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageViewAddressPropertiesNVX*)(pProperties), countPtr);
     }
     uint32_t packetSize_vkGetImageViewAddressNVX = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetImageViewAddressNVX);
@@ -23848,8 +23851,8 @@
     *&cgen_var_1 = get_host_u64_VkImageView((*&local_imageView));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkImageViewAddressPropertiesNVX(stream, (VkImageViewAddressPropertiesNVX*)(pProperties), streamPtrPtr);
-    unmarshal_VkImageViewAddressPropertiesNVX(stream, (VkImageViewAddressPropertiesNVX*)(pProperties));
+    reservedmarshal_VkImageViewAddressPropertiesNVX(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageViewAddressPropertiesNVX*)(pProperties), streamPtrPtr);
+    unmarshal_VkImageViewAddressPropertiesNVX(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageViewAddressPropertiesNVX*)(pProperties));
     if (pProperties)
     {
         transform_fromhost_VkImageViewAddressPropertiesNVX(sResourceTracker, (VkImageViewAddressPropertiesNVX*)(pProperties));
@@ -24189,13 +24192,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkStreamDescriptorSurfaceCreateInfoGGP*)pool->alloc(sizeof(const VkStreamDescriptorSurfaceCreateInfoGGP));
-        deepcopy_VkStreamDescriptorSurfaceCreateInfoGGP(pool, pCreateInfo, (VkStreamDescriptorSurfaceCreateInfoGGP*)(local_pCreateInfo));
+        deepcopy_VkStreamDescriptorSurfaceCreateInfoGGP(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkStreamDescriptorSurfaceCreateInfoGGP*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -24211,12 +24214,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkStreamDescriptorSurfaceCreateInfoGGP(sFeatureBits, (VkStreamDescriptorSurfaceCreateInfoGGP*)(local_pCreateInfo), countPtr);
+        count_VkStreamDescriptorSurfaceCreateInfoGGP(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStreamDescriptorSurfaceCreateInfoGGP*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -24233,7 +24236,7 @@
     *&cgen_var_0 = get_host_u64_VkInstance((*&local_instance));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkStreamDescriptorSurfaceCreateInfoGGP(stream, (VkStreamDescriptorSurfaceCreateInfoGGP*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkStreamDescriptorSurfaceCreateInfoGGP(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStreamDescriptorSurfaceCreateInfoGGP*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -24241,7 +24244,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -24311,7 +24314,7 @@
         *countPtr += sizeof(VkImageUsageFlags);
         *countPtr += sizeof(VkImageCreateFlags);
         *countPtr += sizeof(VkExternalMemoryHandleTypeFlagsNV);
-        count_VkExternalImageFormatPropertiesNV(sFeatureBits, (VkExternalImageFormatPropertiesNV*)(pExternalImageFormatProperties), countPtr);
+        count_VkExternalImageFormatPropertiesNV(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalImageFormatPropertiesNV*)(pExternalImageFormatProperties), countPtr);
     }
     uint32_t packetSize_vkGetPhysicalDeviceExternalImageFormatPropertiesNV = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceExternalImageFormatPropertiesNV);
@@ -24337,8 +24340,8 @@
     *streamPtrPtr += sizeof(VkImageCreateFlags);
     memcpy(*streamPtrPtr, (VkExternalMemoryHandleTypeFlagsNV*)&local_externalHandleType, sizeof(VkExternalMemoryHandleTypeFlagsNV));
     *streamPtrPtr += sizeof(VkExternalMemoryHandleTypeFlagsNV);
-    reservedmarshal_VkExternalImageFormatPropertiesNV(stream, (VkExternalImageFormatPropertiesNV*)(pExternalImageFormatProperties), streamPtrPtr);
-    unmarshal_VkExternalImageFormatPropertiesNV(stream, (VkExternalImageFormatPropertiesNV*)(pExternalImageFormatProperties));
+    reservedmarshal_VkExternalImageFormatPropertiesNV(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalImageFormatPropertiesNV*)(pExternalImageFormatProperties), streamPtrPtr);
+    unmarshal_VkExternalImageFormatPropertiesNV(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalImageFormatPropertiesNV*)(pExternalImageFormatProperties));
     if (pExternalImageFormatProperties)
     {
         transform_fromhost_VkExternalImageFormatPropertiesNV(sResourceTracker, (VkExternalImageFormatPropertiesNV*)(pExternalImageFormatProperties));
@@ -24447,13 +24450,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkViSurfaceCreateInfoNN*)pool->alloc(sizeof(const VkViSurfaceCreateInfoNN));
-        deepcopy_VkViSurfaceCreateInfoNN(pool, pCreateInfo, (VkViSurfaceCreateInfoNN*)(local_pCreateInfo));
+        deepcopy_VkViSurfaceCreateInfoNN(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkViSurfaceCreateInfoNN*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -24469,12 +24472,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkViSurfaceCreateInfoNN(sFeatureBits, (VkViSurfaceCreateInfoNN*)(local_pCreateInfo), countPtr);
+        count_VkViSurfaceCreateInfoNN(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkViSurfaceCreateInfoNN*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -24491,7 +24494,7 @@
     *&cgen_var_0 = get_host_u64_VkInstance((*&local_instance));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkViSurfaceCreateInfoNN(stream, (VkViSurfaceCreateInfoNN*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkViSurfaceCreateInfoNN(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkViSurfaceCreateInfoNN*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -24499,7 +24502,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -24549,7 +24552,7 @@
     if (pConditionalRenderingBegin)
     {
         local_pConditionalRenderingBegin = (VkConditionalRenderingBeginInfoEXT*)pool->alloc(sizeof(const VkConditionalRenderingBeginInfoEXT));
-        deepcopy_VkConditionalRenderingBeginInfoEXT(pool, pConditionalRenderingBegin, (VkConditionalRenderingBeginInfoEXT*)(local_pConditionalRenderingBegin));
+        deepcopy_VkConditionalRenderingBeginInfoEXT(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pConditionalRenderingBegin, (VkConditionalRenderingBeginInfoEXT*)(local_pConditionalRenderingBegin));
     }
     if (local_pConditionalRenderingBegin)
     {
@@ -24560,7 +24563,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkConditionalRenderingBeginInfoEXT(sFeatureBits, (VkConditionalRenderingBeginInfoEXT*)(local_pConditionalRenderingBegin), countPtr);
+        count_VkConditionalRenderingBeginInfoEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkConditionalRenderingBeginInfoEXT*)(local_pConditionalRenderingBegin), countPtr);
     }
     uint32_t packetSize_vkCmdBeginConditionalRenderingEXT = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdBeginConditionalRenderingEXT -= 8;
@@ -24576,7 +24579,7 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkConditionalRenderingBeginInfoEXT(stream, (VkConditionalRenderingBeginInfoEXT*)(local_pConditionalRenderingBegin), streamPtrPtr);
+    reservedmarshal_VkConditionalRenderingBeginInfoEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkConditionalRenderingBeginInfoEXT*)(local_pConditionalRenderingBegin), streamPtrPtr);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -24653,7 +24656,7 @@
         local_pViewportWScalings = (VkViewportWScalingNV*)pool->alloc(((viewportCount)) * sizeof(const VkViewportWScalingNV));
         for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
         {
-            deepcopy_VkViewportWScalingNV(pool, pViewportWScalings + i, (VkViewportWScalingNV*)(local_pViewportWScalings + i));
+            deepcopy_VkViewportWScalingNV(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pViewportWScalings + i, (VkViewportWScalingNV*)(local_pViewportWScalings + i));
         }
     }
     if (local_pViewportWScalings)
@@ -24672,7 +24675,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
         {
-            count_VkViewportWScalingNV(sFeatureBits, (VkViewportWScalingNV*)(local_pViewportWScalings + i), countPtr);
+            count_VkViewportWScalingNV(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkViewportWScalingNV*)(local_pViewportWScalings + i), countPtr);
         }
     }
     uint32_t packetSize_vkCmdSetViewportWScalingNV = 4 + 4 + count;
@@ -24695,7 +24698,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
     {
-        reservedmarshal_VkViewportWScalingNV(stream, (VkViewportWScalingNV*)(local_pViewportWScalings + i), streamPtrPtr);
+        reservedmarshal_VkViewportWScalingNV(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkViewportWScalingNV*)(local_pViewportWScalings + i), streamPtrPtr);
     }
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
@@ -24903,7 +24906,7 @@
         *countPtr += 1 * 8;
         uint64_t cgen_var_1;
         *countPtr += 1 * 8;
-        count_VkSurfaceCapabilities2EXT(sFeatureBits, (VkSurfaceCapabilities2EXT*)(pSurfaceCapabilities), countPtr);
+        count_VkSurfaceCapabilities2EXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSurfaceCapabilities2EXT*)(pSurfaceCapabilities), countPtr);
     }
     uint32_t packetSize_vkGetPhysicalDeviceSurfaceCapabilities2EXT = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceSurfaceCapabilities2EXT);
@@ -24921,8 +24924,8 @@
     *&cgen_var_1 = get_host_u64_VkSurfaceKHR((*&local_surface));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkSurfaceCapabilities2EXT(stream, (VkSurfaceCapabilities2EXT*)(pSurfaceCapabilities), streamPtrPtr);
-    unmarshal_VkSurfaceCapabilities2EXT(stream, (VkSurfaceCapabilities2EXT*)(pSurfaceCapabilities));
+    reservedmarshal_VkSurfaceCapabilities2EXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSurfaceCapabilities2EXT*)(pSurfaceCapabilities), streamPtrPtr);
+    unmarshal_VkSurfaceCapabilities2EXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSurfaceCapabilities2EXT*)(pSurfaceCapabilities));
     if (pSurfaceCapabilities)
     {
         transform_fromhost_VkSurfaceCapabilities2EXT(sResourceTracker, (VkSurfaceCapabilities2EXT*)(pSurfaceCapabilities));
@@ -24961,7 +24964,7 @@
     if (pDisplayPowerInfo)
     {
         local_pDisplayPowerInfo = (VkDisplayPowerInfoEXT*)pool->alloc(sizeof(const VkDisplayPowerInfoEXT));
-        deepcopy_VkDisplayPowerInfoEXT(pool, pDisplayPowerInfo, (VkDisplayPowerInfoEXT*)(local_pDisplayPowerInfo));
+        deepcopy_VkDisplayPowerInfoEXT(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pDisplayPowerInfo, (VkDisplayPowerInfoEXT*)(local_pDisplayPowerInfo));
     }
     if (local_pDisplayPowerInfo)
     {
@@ -24974,7 +24977,7 @@
         *countPtr += 1 * 8;
         uint64_t cgen_var_1;
         *countPtr += 1 * 8;
-        count_VkDisplayPowerInfoEXT(sFeatureBits, (VkDisplayPowerInfoEXT*)(local_pDisplayPowerInfo), countPtr);
+        count_VkDisplayPowerInfoEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPowerInfoEXT*)(local_pDisplayPowerInfo), countPtr);
     }
     uint32_t packetSize_vkDisplayPowerControlEXT = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkDisplayPowerControlEXT);
@@ -24992,7 +24995,7 @@
     *&cgen_var_1 = get_host_u64_VkDisplayKHR((*&local_display));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDisplayPowerInfoEXT(stream, (VkDisplayPowerInfoEXT*)(local_pDisplayPowerInfo), streamPtrPtr);
+    reservedmarshal_VkDisplayPowerInfoEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPowerInfoEXT*)(local_pDisplayPowerInfo), streamPtrPtr);
     VkResult vkDisplayPowerControlEXT_VkResult_return = (VkResult)0;
     stream->read(&vkDisplayPowerControlEXT_VkResult_return, sizeof(VkResult));
     ++encodeCount;;
@@ -25025,13 +25028,13 @@
     if (pDeviceEventInfo)
     {
         local_pDeviceEventInfo = (VkDeviceEventInfoEXT*)pool->alloc(sizeof(const VkDeviceEventInfoEXT));
-        deepcopy_VkDeviceEventInfoEXT(pool, pDeviceEventInfo, (VkDeviceEventInfoEXT*)(local_pDeviceEventInfo));
+        deepcopy_VkDeviceEventInfoEXT(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pDeviceEventInfo, (VkDeviceEventInfoEXT*)(local_pDeviceEventInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pDeviceEventInfo)
@@ -25047,12 +25050,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDeviceEventInfoEXT(sFeatureBits, (VkDeviceEventInfoEXT*)(local_pDeviceEventInfo), countPtr);
+        count_VkDeviceEventInfoEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceEventInfoEXT*)(local_pDeviceEventInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -25069,7 +25072,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDeviceEventInfoEXT(stream, (VkDeviceEventInfoEXT*)(local_pDeviceEventInfo), streamPtrPtr);
+    reservedmarshal_VkDeviceEventInfoEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceEventInfoEXT*)(local_pDeviceEventInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -25077,7 +25080,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -25123,13 +25126,13 @@
     if (pDisplayEventInfo)
     {
         local_pDisplayEventInfo = (VkDisplayEventInfoEXT*)pool->alloc(sizeof(const VkDisplayEventInfoEXT));
-        deepcopy_VkDisplayEventInfoEXT(pool, pDisplayEventInfo, (VkDisplayEventInfoEXT*)(local_pDisplayEventInfo));
+        deepcopy_VkDisplayEventInfoEXT(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pDisplayEventInfo, (VkDisplayEventInfoEXT*)(local_pDisplayEventInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pDisplayEventInfo)
@@ -25147,12 +25150,12 @@
         *countPtr += 1 * 8;
         uint64_t cgen_var_1;
         *countPtr += 1 * 8;
-        count_VkDisplayEventInfoEXT(sFeatureBits, (VkDisplayEventInfoEXT*)(local_pDisplayEventInfo), countPtr);
+        count_VkDisplayEventInfoEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayEventInfoEXT*)(local_pDisplayEventInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_2;
         *countPtr += 8;
@@ -25173,7 +25176,7 @@
     *&cgen_var_1 = get_host_u64_VkDisplayKHR((*&local_display));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDisplayEventInfoEXT(stream, (VkDisplayEventInfoEXT*)(local_pDisplayEventInfo), streamPtrPtr);
+    reservedmarshal_VkDisplayEventInfoEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayEventInfoEXT*)(local_pDisplayEventInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_2, 8);
@@ -25181,7 +25184,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_3;
@@ -25289,7 +25292,7 @@
         *countPtr += 1 * 8;
         uint64_t cgen_var_1;
         *countPtr += 1 * 8;
-        count_VkRefreshCycleDurationGOOGLE(sFeatureBits, (VkRefreshCycleDurationGOOGLE*)(pDisplayTimingProperties), countPtr);
+        count_VkRefreshCycleDurationGOOGLE(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRefreshCycleDurationGOOGLE*)(pDisplayTimingProperties), countPtr);
     }
     uint32_t packetSize_vkGetRefreshCycleDurationGOOGLE = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetRefreshCycleDurationGOOGLE);
@@ -25307,8 +25310,8 @@
     *&cgen_var_1 = get_host_u64_VkSwapchainKHR((*&local_swapchain));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkRefreshCycleDurationGOOGLE(stream, (VkRefreshCycleDurationGOOGLE*)(pDisplayTimingProperties), streamPtrPtr);
-    unmarshal_VkRefreshCycleDurationGOOGLE(stream, (VkRefreshCycleDurationGOOGLE*)(pDisplayTimingProperties));
+    reservedmarshal_VkRefreshCycleDurationGOOGLE(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRefreshCycleDurationGOOGLE*)(pDisplayTimingProperties), streamPtrPtr);
+    unmarshal_VkRefreshCycleDurationGOOGLE(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRefreshCycleDurationGOOGLE*)(pDisplayTimingProperties));
     if (pDisplayTimingProperties)
     {
         transform_fromhost_VkRefreshCycleDurationGOOGLE(sResourceTracker, (VkRefreshCycleDurationGOOGLE*)(pDisplayTimingProperties));
@@ -25362,7 +25365,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pPresentationTimingCount)); ++i)
                 {
-                    count_VkPastPresentationTimingGOOGLE(sFeatureBits, (VkPastPresentationTimingGOOGLE*)(pPresentationTimings + i), countPtr);
+                    count_VkPastPresentationTimingGOOGLE(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPastPresentationTimingGOOGLE*)(pPresentationTimings + i), countPtr);
                 }
             }
         }
@@ -25402,7 +25405,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPresentationTimingCount)); ++i)
         {
-            reservedmarshal_VkPastPresentationTimingGOOGLE(stream, (VkPastPresentationTimingGOOGLE*)(pPresentationTimings + i), streamPtrPtr);
+            reservedmarshal_VkPastPresentationTimingGOOGLE(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPastPresentationTimingGOOGLE*)(pPresentationTimings + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -25429,7 +25432,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPresentationTimingCount)); ++i)
             {
-                unmarshal_VkPastPresentationTimingGOOGLE(stream, (VkPastPresentationTimingGOOGLE*)(pPresentationTimings + i));
+                unmarshal_VkPastPresentationTimingGOOGLE(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPastPresentationTimingGOOGLE*)(pPresentationTimings + i));
             }
         }
     }
@@ -25492,7 +25495,7 @@
         local_pDiscardRectangles = (VkRect2D*)pool->alloc(((discardRectangleCount)) * sizeof(const VkRect2D));
         for (uint32_t i = 0; i < (uint32_t)((discardRectangleCount)); ++i)
         {
-            deepcopy_VkRect2D(pool, pDiscardRectangles + i, (VkRect2D*)(local_pDiscardRectangles + i));
+            deepcopy_VkRect2D(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pDiscardRectangles + i, (VkRect2D*)(local_pDiscardRectangles + i));
         }
     }
     if (local_pDiscardRectangles)
@@ -25511,7 +25514,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((discardRectangleCount)); ++i)
         {
-            count_VkRect2D(sFeatureBits, (VkRect2D*)(local_pDiscardRectangles + i), countPtr);
+            count_VkRect2D(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRect2D*)(local_pDiscardRectangles + i), countPtr);
         }
     }
     uint32_t packetSize_vkCmdSetDiscardRectangleEXT = 4 + 4 + count;
@@ -25534,7 +25537,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((discardRectangleCount)); ++i)
     {
-        reservedmarshal_VkRect2D(stream, (VkRect2D*)(local_pDiscardRectangles + i), streamPtrPtr);
+        reservedmarshal_VkRect2D(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRect2D*)(local_pDiscardRectangles + i), streamPtrPtr);
     }
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
@@ -25579,7 +25582,7 @@
         local_pMetadata = (VkHdrMetadataEXT*)pool->alloc(((swapchainCount)) * sizeof(const VkHdrMetadataEXT));
         for (uint32_t i = 0; i < (uint32_t)((swapchainCount)); ++i)
         {
-            deepcopy_VkHdrMetadataEXT(pool, pMetadata + i, (VkHdrMetadataEXT*)(local_pMetadata + i));
+            deepcopy_VkHdrMetadataEXT(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pMetadata + i, (VkHdrMetadataEXT*)(local_pMetadata + i));
         }
     }
     if (local_pMetadata)
@@ -25601,7 +25604,7 @@
         }
         for (uint32_t i = 0; i < (uint32_t)((swapchainCount)); ++i)
         {
-            count_VkHdrMetadataEXT(sFeatureBits, (VkHdrMetadataEXT*)(local_pMetadata + i), countPtr);
+            count_VkHdrMetadataEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkHdrMetadataEXT*)(local_pMetadata + i), countPtr);
         }
     }
     uint32_t packetSize_vkSetHdrMetadataEXT = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -25630,7 +25633,7 @@
     }
     for (uint32_t i = 0; i < (uint32_t)((swapchainCount)); ++i)
     {
-        reservedmarshal_VkHdrMetadataEXT(stream, (VkHdrMetadataEXT*)(local_pMetadata + i), streamPtrPtr);
+        reservedmarshal_VkHdrMetadataEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkHdrMetadataEXT*)(local_pMetadata + i), streamPtrPtr);
     }
     stream->flush();
     ++encodeCount;;
@@ -25664,13 +25667,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkIOSSurfaceCreateInfoMVK*)pool->alloc(sizeof(const VkIOSSurfaceCreateInfoMVK));
-        deepcopy_VkIOSSurfaceCreateInfoMVK(pool, pCreateInfo, (VkIOSSurfaceCreateInfoMVK*)(local_pCreateInfo));
+        deepcopy_VkIOSSurfaceCreateInfoMVK(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkIOSSurfaceCreateInfoMVK*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -25686,12 +25689,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkIOSSurfaceCreateInfoMVK(sFeatureBits, (VkIOSSurfaceCreateInfoMVK*)(local_pCreateInfo), countPtr);
+        count_VkIOSSurfaceCreateInfoMVK(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkIOSSurfaceCreateInfoMVK*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -25708,7 +25711,7 @@
     *&cgen_var_0 = get_host_u64_VkInstance((*&local_instance));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkIOSSurfaceCreateInfoMVK(stream, (VkIOSSurfaceCreateInfoMVK*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkIOSSurfaceCreateInfoMVK(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkIOSSurfaceCreateInfoMVK*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -25716,7 +25719,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -25761,13 +25764,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkMacOSSurfaceCreateInfoMVK*)pool->alloc(sizeof(const VkMacOSSurfaceCreateInfoMVK));
-        deepcopy_VkMacOSSurfaceCreateInfoMVK(pool, pCreateInfo, (VkMacOSSurfaceCreateInfoMVK*)(local_pCreateInfo));
+        deepcopy_VkMacOSSurfaceCreateInfoMVK(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkMacOSSurfaceCreateInfoMVK*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -25783,12 +25786,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkMacOSSurfaceCreateInfoMVK(sFeatureBits, (VkMacOSSurfaceCreateInfoMVK*)(local_pCreateInfo), countPtr);
+        count_VkMacOSSurfaceCreateInfoMVK(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMacOSSurfaceCreateInfoMVK*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -25805,7 +25808,7 @@
     *&cgen_var_0 = get_host_u64_VkInstance((*&local_instance));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkMacOSSurfaceCreateInfoMVK(stream, (VkMacOSSurfaceCreateInfoMVK*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkMacOSSurfaceCreateInfoMVK(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMacOSSurfaceCreateInfoMVK*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -25813,7 +25816,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -26125,7 +26128,7 @@
     if (pNameInfo)
     {
         local_pNameInfo = (VkDebugUtilsObjectNameInfoEXT*)pool->alloc(sizeof(const VkDebugUtilsObjectNameInfoEXT));
-        deepcopy_VkDebugUtilsObjectNameInfoEXT(pool, pNameInfo, (VkDebugUtilsObjectNameInfoEXT*)(local_pNameInfo));
+        deepcopy_VkDebugUtilsObjectNameInfoEXT(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pNameInfo, (VkDebugUtilsObjectNameInfoEXT*)(local_pNameInfo));
     }
     if (local_pNameInfo)
     {
@@ -26136,7 +26139,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDebugUtilsObjectNameInfoEXT(sFeatureBits, (VkDebugUtilsObjectNameInfoEXT*)(local_pNameInfo), countPtr);
+        count_VkDebugUtilsObjectNameInfoEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugUtilsObjectNameInfoEXT*)(local_pNameInfo), countPtr);
     }
     uint32_t packetSize_vkSetDebugUtilsObjectNameEXT = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkSetDebugUtilsObjectNameEXT);
@@ -26150,7 +26153,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDebugUtilsObjectNameInfoEXT(stream, (VkDebugUtilsObjectNameInfoEXT*)(local_pNameInfo), streamPtrPtr);
+    reservedmarshal_VkDebugUtilsObjectNameInfoEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugUtilsObjectNameInfoEXT*)(local_pNameInfo), streamPtrPtr);
     VkResult vkSetDebugUtilsObjectNameEXT_VkResult_return = (VkResult)0;
     stream->read(&vkSetDebugUtilsObjectNameEXT_VkResult_return, sizeof(VkResult));
     ++encodeCount;;
@@ -26180,7 +26183,7 @@
     if (pTagInfo)
     {
         local_pTagInfo = (VkDebugUtilsObjectTagInfoEXT*)pool->alloc(sizeof(const VkDebugUtilsObjectTagInfoEXT));
-        deepcopy_VkDebugUtilsObjectTagInfoEXT(pool, pTagInfo, (VkDebugUtilsObjectTagInfoEXT*)(local_pTagInfo));
+        deepcopy_VkDebugUtilsObjectTagInfoEXT(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pTagInfo, (VkDebugUtilsObjectTagInfoEXT*)(local_pTagInfo));
     }
     if (local_pTagInfo)
     {
@@ -26191,7 +26194,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDebugUtilsObjectTagInfoEXT(sFeatureBits, (VkDebugUtilsObjectTagInfoEXT*)(local_pTagInfo), countPtr);
+        count_VkDebugUtilsObjectTagInfoEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugUtilsObjectTagInfoEXT*)(local_pTagInfo), countPtr);
     }
     uint32_t packetSize_vkSetDebugUtilsObjectTagEXT = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkSetDebugUtilsObjectTagEXT);
@@ -26205,7 +26208,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDebugUtilsObjectTagInfoEXT(stream, (VkDebugUtilsObjectTagInfoEXT*)(local_pTagInfo), streamPtrPtr);
+    reservedmarshal_VkDebugUtilsObjectTagInfoEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugUtilsObjectTagInfoEXT*)(local_pTagInfo), streamPtrPtr);
     VkResult vkSetDebugUtilsObjectTagEXT_VkResult_return = (VkResult)0;
     stream->read(&vkSetDebugUtilsObjectTagEXT_VkResult_return, sizeof(VkResult));
     ++encodeCount;;
@@ -26235,7 +26238,7 @@
     if (pLabelInfo)
     {
         local_pLabelInfo = (VkDebugUtilsLabelEXT*)pool->alloc(sizeof(const VkDebugUtilsLabelEXT));
-        deepcopy_VkDebugUtilsLabelEXT(pool, pLabelInfo, (VkDebugUtilsLabelEXT*)(local_pLabelInfo));
+        deepcopy_VkDebugUtilsLabelEXT(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pLabelInfo, (VkDebugUtilsLabelEXT*)(local_pLabelInfo));
     }
     if (local_pLabelInfo)
     {
@@ -26246,7 +26249,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDebugUtilsLabelEXT(sFeatureBits, (VkDebugUtilsLabelEXT*)(local_pLabelInfo), countPtr);
+        count_VkDebugUtilsLabelEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugUtilsLabelEXT*)(local_pLabelInfo), countPtr);
     }
     uint32_t packetSize_vkQueueBeginDebugUtilsLabelEXT = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkQueueBeginDebugUtilsLabelEXT);
@@ -26260,7 +26263,7 @@
     *&cgen_var_0 = get_host_u64_VkQueue((*&local_queue));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDebugUtilsLabelEXT(stream, (VkDebugUtilsLabelEXT*)(local_pLabelInfo), streamPtrPtr);
+    reservedmarshal_VkDebugUtilsLabelEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugUtilsLabelEXT*)(local_pLabelInfo), streamPtrPtr);
     stream->flush();
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
@@ -26327,7 +26330,7 @@
     if (pLabelInfo)
     {
         local_pLabelInfo = (VkDebugUtilsLabelEXT*)pool->alloc(sizeof(const VkDebugUtilsLabelEXT));
-        deepcopy_VkDebugUtilsLabelEXT(pool, pLabelInfo, (VkDebugUtilsLabelEXT*)(local_pLabelInfo));
+        deepcopy_VkDebugUtilsLabelEXT(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pLabelInfo, (VkDebugUtilsLabelEXT*)(local_pLabelInfo));
     }
     if (local_pLabelInfo)
     {
@@ -26338,7 +26341,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDebugUtilsLabelEXT(sFeatureBits, (VkDebugUtilsLabelEXT*)(local_pLabelInfo), countPtr);
+        count_VkDebugUtilsLabelEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugUtilsLabelEXT*)(local_pLabelInfo), countPtr);
     }
     uint32_t packetSize_vkQueueInsertDebugUtilsLabelEXT = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkQueueInsertDebugUtilsLabelEXT);
@@ -26352,7 +26355,7 @@
     *&cgen_var_0 = get_host_u64_VkQueue((*&local_queue));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDebugUtilsLabelEXT(stream, (VkDebugUtilsLabelEXT*)(local_pLabelInfo), streamPtrPtr);
+    reservedmarshal_VkDebugUtilsLabelEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugUtilsLabelEXT*)(local_pLabelInfo), streamPtrPtr);
     stream->flush();
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
@@ -26380,7 +26383,7 @@
     if (pLabelInfo)
     {
         local_pLabelInfo = (VkDebugUtilsLabelEXT*)pool->alloc(sizeof(const VkDebugUtilsLabelEXT));
-        deepcopy_VkDebugUtilsLabelEXT(pool, pLabelInfo, (VkDebugUtilsLabelEXT*)(local_pLabelInfo));
+        deepcopy_VkDebugUtilsLabelEXT(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pLabelInfo, (VkDebugUtilsLabelEXT*)(local_pLabelInfo));
     }
     if (local_pLabelInfo)
     {
@@ -26391,7 +26394,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDebugUtilsLabelEXT(sFeatureBits, (VkDebugUtilsLabelEXT*)(local_pLabelInfo), countPtr);
+        count_VkDebugUtilsLabelEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugUtilsLabelEXT*)(local_pLabelInfo), countPtr);
     }
     uint32_t packetSize_vkCmdBeginDebugUtilsLabelEXT = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdBeginDebugUtilsLabelEXT -= 8;
@@ -26407,7 +26410,7 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkDebugUtilsLabelEXT(stream, (VkDebugUtilsLabelEXT*)(local_pLabelInfo), streamPtrPtr);
+    reservedmarshal_VkDebugUtilsLabelEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugUtilsLabelEXT*)(local_pLabelInfo), streamPtrPtr);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -26474,7 +26477,7 @@
     if (pLabelInfo)
     {
         local_pLabelInfo = (VkDebugUtilsLabelEXT*)pool->alloc(sizeof(const VkDebugUtilsLabelEXT));
-        deepcopy_VkDebugUtilsLabelEXT(pool, pLabelInfo, (VkDebugUtilsLabelEXT*)(local_pLabelInfo));
+        deepcopy_VkDebugUtilsLabelEXT(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pLabelInfo, (VkDebugUtilsLabelEXT*)(local_pLabelInfo));
     }
     if (local_pLabelInfo)
     {
@@ -26485,7 +26488,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDebugUtilsLabelEXT(sFeatureBits, (VkDebugUtilsLabelEXT*)(local_pLabelInfo), countPtr);
+        count_VkDebugUtilsLabelEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugUtilsLabelEXT*)(local_pLabelInfo), countPtr);
     }
     uint32_t packetSize_vkCmdInsertDebugUtilsLabelEXT = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdInsertDebugUtilsLabelEXT -= 8;
@@ -26501,7 +26504,7 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkDebugUtilsLabelEXT(stream, (VkDebugUtilsLabelEXT*)(local_pLabelInfo), streamPtrPtr);
+    reservedmarshal_VkDebugUtilsLabelEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugUtilsLabelEXT*)(local_pLabelInfo), streamPtrPtr);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -26531,13 +26534,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkDebugUtilsMessengerCreateInfoEXT*)pool->alloc(sizeof(const VkDebugUtilsMessengerCreateInfoEXT));
-        deepcopy_VkDebugUtilsMessengerCreateInfoEXT(pool, pCreateInfo, (VkDebugUtilsMessengerCreateInfoEXT*)(local_pCreateInfo));
+        deepcopy_VkDebugUtilsMessengerCreateInfoEXT(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkDebugUtilsMessengerCreateInfoEXT*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -26553,12 +26556,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDebugUtilsMessengerCreateInfoEXT(sFeatureBits, (VkDebugUtilsMessengerCreateInfoEXT*)(local_pCreateInfo), countPtr);
+        count_VkDebugUtilsMessengerCreateInfoEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugUtilsMessengerCreateInfoEXT*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -26575,7 +26578,7 @@
     *&cgen_var_0 = get_host_u64_VkInstance((*&local_instance));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDebugUtilsMessengerCreateInfoEXT(stream, (VkDebugUtilsMessengerCreateInfoEXT*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkDebugUtilsMessengerCreateInfoEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugUtilsMessengerCreateInfoEXT*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -26583,7 +26586,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -26628,7 +26631,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -26646,7 +26649,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyDebugUtilsMessengerEXT = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -26672,7 +26675,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkDebugUtilsMessengerEXT((VkDebugUtilsMessengerEXT*)&messenger);
     stream->flush();
@@ -26708,7 +26711,7 @@
     if (pCallbackData)
     {
         local_pCallbackData = (VkDebugUtilsMessengerCallbackDataEXT*)pool->alloc(sizeof(const VkDebugUtilsMessengerCallbackDataEXT));
-        deepcopy_VkDebugUtilsMessengerCallbackDataEXT(pool, pCallbackData, (VkDebugUtilsMessengerCallbackDataEXT*)(local_pCallbackData));
+        deepcopy_VkDebugUtilsMessengerCallbackDataEXT(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCallbackData, (VkDebugUtilsMessengerCallbackDataEXT*)(local_pCallbackData));
     }
     if (local_pCallbackData)
     {
@@ -26721,7 +26724,7 @@
         *countPtr += 1 * 8;
         *countPtr += sizeof(VkDebugUtilsMessageSeverityFlagBitsEXT);
         *countPtr += sizeof(VkDebugUtilsMessageTypeFlagsEXT);
-        count_VkDebugUtilsMessengerCallbackDataEXT(sFeatureBits, (VkDebugUtilsMessengerCallbackDataEXT*)(local_pCallbackData), countPtr);
+        count_VkDebugUtilsMessengerCallbackDataEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugUtilsMessengerCallbackDataEXT*)(local_pCallbackData), countPtr);
     }
     uint32_t packetSize_vkSubmitDebugUtilsMessageEXT = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkSubmitDebugUtilsMessageEXT);
@@ -26739,7 +26742,7 @@
     *streamPtrPtr += sizeof(VkDebugUtilsMessageSeverityFlagBitsEXT);
     memcpy(*streamPtrPtr, (VkDebugUtilsMessageTypeFlagsEXT*)&local_messageTypes, sizeof(VkDebugUtilsMessageTypeFlagsEXT));
     *streamPtrPtr += sizeof(VkDebugUtilsMessageTypeFlagsEXT);
-    reservedmarshal_VkDebugUtilsMessengerCallbackDataEXT(stream, (VkDebugUtilsMessengerCallbackDataEXT*)(local_pCallbackData), streamPtrPtr);
+    reservedmarshal_VkDebugUtilsMessengerCallbackDataEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugUtilsMessengerCallbackDataEXT*)(local_pCallbackData), streamPtrPtr);
     stream->flush();
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
@@ -26774,7 +26777,7 @@
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
         *countPtr += sizeof(AHardwareBuffer);
-        count_VkAndroidHardwareBufferPropertiesANDROID(sFeatureBits, (VkAndroidHardwareBufferPropertiesANDROID*)(pProperties), countPtr);
+        count_VkAndroidHardwareBufferPropertiesANDROID(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAndroidHardwareBufferPropertiesANDROID*)(pProperties), countPtr);
     }
     uint32_t packetSize_vkGetAndroidHardwareBufferPropertiesANDROID = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetAndroidHardwareBufferPropertiesANDROID);
@@ -26790,8 +26793,8 @@
     *streamPtrPtr += 1 * 8;
     memcpy(*streamPtrPtr, (AHardwareBuffer*)local_buffer, sizeof(AHardwareBuffer));
     *streamPtrPtr += sizeof(AHardwareBuffer);
-    reservedmarshal_VkAndroidHardwareBufferPropertiesANDROID(stream, (VkAndroidHardwareBufferPropertiesANDROID*)(pProperties), streamPtrPtr);
-    unmarshal_VkAndroidHardwareBufferPropertiesANDROID(stream, (VkAndroidHardwareBufferPropertiesANDROID*)(pProperties));
+    reservedmarshal_VkAndroidHardwareBufferPropertiesANDROID(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAndroidHardwareBufferPropertiesANDROID*)(pProperties), streamPtrPtr);
+    unmarshal_VkAndroidHardwareBufferPropertiesANDROID(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAndroidHardwareBufferPropertiesANDROID*)(pProperties));
     if (pProperties)
     {
         transform_fromhost_VkAndroidHardwareBufferPropertiesANDROID(sResourceTracker, (VkAndroidHardwareBufferPropertiesANDROID*)(pProperties));
@@ -26826,7 +26829,7 @@
     if (pInfo)
     {
         local_pInfo = (VkMemoryGetAndroidHardwareBufferInfoANDROID*)pool->alloc(sizeof(const VkMemoryGetAndroidHardwareBufferInfoANDROID));
-        deepcopy_VkMemoryGetAndroidHardwareBufferInfoANDROID(pool, pInfo, (VkMemoryGetAndroidHardwareBufferInfoANDROID*)(local_pInfo));
+        deepcopy_VkMemoryGetAndroidHardwareBufferInfoANDROID(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo, (VkMemoryGetAndroidHardwareBufferInfoANDROID*)(local_pInfo));
     }
     if (local_pInfo)
     {
@@ -26837,7 +26840,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkMemoryGetAndroidHardwareBufferInfoANDROID(sFeatureBits, (VkMemoryGetAndroidHardwareBufferInfoANDROID*)(local_pInfo), countPtr);
+        count_VkMemoryGetAndroidHardwareBufferInfoANDROID(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryGetAndroidHardwareBufferInfoANDROID*)(local_pInfo), countPtr);
         *countPtr += sizeof(AHardwareBuffer*);
     }
     uint32_t packetSize_vkGetMemoryAndroidHardwareBufferANDROID = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -26852,7 +26855,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkMemoryGetAndroidHardwareBufferInfoANDROID(stream, (VkMemoryGetAndroidHardwareBufferInfoANDROID*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkMemoryGetAndroidHardwareBufferInfoANDROID(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryGetAndroidHardwareBufferInfoANDROID*)(local_pInfo), streamPtrPtr);
     memcpy(*streamPtrPtr, (AHardwareBuffer**)pBuffer, sizeof(AHardwareBuffer*));
     *streamPtrPtr += sizeof(AHardwareBuffer*);
     stream->read((AHardwareBuffer**)pBuffer, sizeof(AHardwareBuffer*));
@@ -26899,7 +26902,7 @@
     if (pSampleLocationsInfo)
     {
         local_pSampleLocationsInfo = (VkSampleLocationsInfoEXT*)pool->alloc(sizeof(const VkSampleLocationsInfoEXT));
-        deepcopy_VkSampleLocationsInfoEXT(pool, pSampleLocationsInfo, (VkSampleLocationsInfoEXT*)(local_pSampleLocationsInfo));
+        deepcopy_VkSampleLocationsInfoEXT(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSampleLocationsInfo, (VkSampleLocationsInfoEXT*)(local_pSampleLocationsInfo));
     }
     if (local_pSampleLocationsInfo)
     {
@@ -26910,7 +26913,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkSampleLocationsInfoEXT(sFeatureBits, (VkSampleLocationsInfoEXT*)(local_pSampleLocationsInfo), countPtr);
+        count_VkSampleLocationsInfoEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSampleLocationsInfoEXT*)(local_pSampleLocationsInfo), countPtr);
     }
     uint32_t packetSize_vkCmdSetSampleLocationsEXT = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetSampleLocationsEXT -= 8;
@@ -26926,7 +26929,7 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkSampleLocationsInfoEXT(stream, (VkSampleLocationsInfoEXT*)(local_pSampleLocationsInfo), streamPtrPtr);
+    reservedmarshal_VkSampleLocationsInfoEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSampleLocationsInfoEXT*)(local_pSampleLocationsInfo), streamPtrPtr);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -26957,7 +26960,7 @@
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
         *countPtr += sizeof(VkSampleCountFlagBits);
-        count_VkMultisamplePropertiesEXT(sFeatureBits, (VkMultisamplePropertiesEXT*)(pMultisampleProperties), countPtr);
+        count_VkMultisamplePropertiesEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMultisamplePropertiesEXT*)(pMultisampleProperties), countPtr);
     }
     uint32_t packetSize_vkGetPhysicalDeviceMultisamplePropertiesEXT = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceMultisamplePropertiesEXT);
@@ -26973,8 +26976,8 @@
     *streamPtrPtr += 1 * 8;
     memcpy(*streamPtrPtr, (VkSampleCountFlagBits*)&local_samples, sizeof(VkSampleCountFlagBits));
     *streamPtrPtr += sizeof(VkSampleCountFlagBits);
-    reservedmarshal_VkMultisamplePropertiesEXT(stream, (VkMultisamplePropertiesEXT*)(pMultisampleProperties), streamPtrPtr);
-    unmarshal_VkMultisamplePropertiesEXT(stream, (VkMultisamplePropertiesEXT*)(pMultisampleProperties));
+    reservedmarshal_VkMultisamplePropertiesEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMultisamplePropertiesEXT*)(pMultisampleProperties), streamPtrPtr);
+    unmarshal_VkMultisamplePropertiesEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMultisamplePropertiesEXT*)(pMultisampleProperties));
     if (pMultisampleProperties)
     {
         transform_fromhost_VkMultisamplePropertiesEXT(sResourceTracker, (VkMultisamplePropertiesEXT*)(pMultisampleProperties));
@@ -27024,7 +27027,7 @@
         *countPtr += 1 * 8;
         uint64_t cgen_var_1;
         *countPtr += 1 * 8;
-        count_VkImageDrmFormatModifierPropertiesEXT(sFeatureBits, (VkImageDrmFormatModifierPropertiesEXT*)(pProperties), countPtr);
+        count_VkImageDrmFormatModifierPropertiesEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageDrmFormatModifierPropertiesEXT*)(pProperties), countPtr);
     }
     uint32_t packetSize_vkGetImageDrmFormatModifierPropertiesEXT = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetImageDrmFormatModifierPropertiesEXT);
@@ -27042,8 +27045,8 @@
     *&cgen_var_1 = get_host_u64_VkImage((*&local_image));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkImageDrmFormatModifierPropertiesEXT(stream, (VkImageDrmFormatModifierPropertiesEXT*)(pProperties), streamPtrPtr);
-    unmarshal_VkImageDrmFormatModifierPropertiesEXT(stream, (VkImageDrmFormatModifierPropertiesEXT*)(pProperties));
+    reservedmarshal_VkImageDrmFormatModifierPropertiesEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageDrmFormatModifierPropertiesEXT*)(pProperties), streamPtrPtr);
+    unmarshal_VkImageDrmFormatModifierPropertiesEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageDrmFormatModifierPropertiesEXT*)(pProperties));
     if (pProperties)
     {
         transform_fromhost_VkImageDrmFormatModifierPropertiesEXT(sResourceTracker, (VkImageDrmFormatModifierPropertiesEXT*)(pProperties));
@@ -27082,13 +27085,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkValidationCacheCreateInfoEXT*)pool->alloc(sizeof(const VkValidationCacheCreateInfoEXT));
-        deepcopy_VkValidationCacheCreateInfoEXT(pool, pCreateInfo, (VkValidationCacheCreateInfoEXT*)(local_pCreateInfo));
+        deepcopy_VkValidationCacheCreateInfoEXT(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkValidationCacheCreateInfoEXT*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -27104,12 +27107,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkValidationCacheCreateInfoEXT(sFeatureBits, (VkValidationCacheCreateInfoEXT*)(local_pCreateInfo), countPtr);
+        count_VkValidationCacheCreateInfoEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkValidationCacheCreateInfoEXT*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -27126,7 +27129,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkValidationCacheCreateInfoEXT(stream, (VkValidationCacheCreateInfoEXT*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkValidationCacheCreateInfoEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkValidationCacheCreateInfoEXT*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -27134,7 +27137,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -27179,7 +27182,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -27197,7 +27200,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyValidationCacheEXT = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -27223,7 +27226,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkValidationCacheEXT((VkValidationCacheEXT*)&validationCache);
     stream->flush();
@@ -27507,7 +27510,7 @@
         local_pShadingRatePalettes = (VkShadingRatePaletteNV*)pool->alloc(((viewportCount)) * sizeof(const VkShadingRatePaletteNV));
         for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
         {
-            deepcopy_VkShadingRatePaletteNV(pool, pShadingRatePalettes + i, (VkShadingRatePaletteNV*)(local_pShadingRatePalettes + i));
+            deepcopy_VkShadingRatePaletteNV(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pShadingRatePalettes + i, (VkShadingRatePaletteNV*)(local_pShadingRatePalettes + i));
         }
     }
     if (local_pShadingRatePalettes)
@@ -27526,7 +27529,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
         {
-            count_VkShadingRatePaletteNV(sFeatureBits, (VkShadingRatePaletteNV*)(local_pShadingRatePalettes + i), countPtr);
+            count_VkShadingRatePaletteNV(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkShadingRatePaletteNV*)(local_pShadingRatePalettes + i), countPtr);
         }
     }
     uint32_t packetSize_vkCmdSetViewportShadingRatePaletteNV = 4 + 4 + count;
@@ -27549,7 +27552,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
     {
-        reservedmarshal_VkShadingRatePaletteNV(stream, (VkShadingRatePaletteNV*)(local_pShadingRatePalettes + i), streamPtrPtr);
+        reservedmarshal_VkShadingRatePaletteNV(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkShadingRatePaletteNV*)(local_pShadingRatePalettes + i), streamPtrPtr);
     }
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
@@ -27585,7 +27588,7 @@
         local_pCustomSampleOrders = (VkCoarseSampleOrderCustomNV*)pool->alloc(((customSampleOrderCount)) * sizeof(const VkCoarseSampleOrderCustomNV));
         for (uint32_t i = 0; i < (uint32_t)((customSampleOrderCount)); ++i)
         {
-            deepcopy_VkCoarseSampleOrderCustomNV(pool, pCustomSampleOrders + i, (VkCoarseSampleOrderCustomNV*)(local_pCustomSampleOrders + i));
+            deepcopy_VkCoarseSampleOrderCustomNV(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCustomSampleOrders + i, (VkCoarseSampleOrderCustomNV*)(local_pCustomSampleOrders + i));
         }
     }
     if (local_pCustomSampleOrders)
@@ -27604,7 +27607,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((customSampleOrderCount)); ++i)
         {
-            count_VkCoarseSampleOrderCustomNV(sFeatureBits, (VkCoarseSampleOrderCustomNV*)(local_pCustomSampleOrders + i), countPtr);
+            count_VkCoarseSampleOrderCustomNV(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCoarseSampleOrderCustomNV*)(local_pCustomSampleOrders + i), countPtr);
         }
     }
     uint32_t packetSize_vkCmdSetCoarseSampleOrderNV = 4 + 4 + count;
@@ -27627,7 +27630,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((customSampleOrderCount)); ++i)
     {
-        reservedmarshal_VkCoarseSampleOrderCustomNV(stream, (VkCoarseSampleOrderCustomNV*)(local_pCustomSampleOrders + i), streamPtrPtr);
+        reservedmarshal_VkCoarseSampleOrderCustomNV(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCoarseSampleOrderCustomNV*)(local_pCustomSampleOrders + i), streamPtrPtr);
     }
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
@@ -27660,13 +27663,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkAccelerationStructureCreateInfoNV*)pool->alloc(sizeof(const VkAccelerationStructureCreateInfoNV));
-        deepcopy_VkAccelerationStructureCreateInfoNV(pool, pCreateInfo, (VkAccelerationStructureCreateInfoNV*)(local_pCreateInfo));
+        deepcopy_VkAccelerationStructureCreateInfoNV(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkAccelerationStructureCreateInfoNV*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -27682,12 +27685,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkAccelerationStructureCreateInfoNV(sFeatureBits, (VkAccelerationStructureCreateInfoNV*)(local_pCreateInfo), countPtr);
+        count_VkAccelerationStructureCreateInfoNV(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureCreateInfoNV*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -27704,7 +27707,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkAccelerationStructureCreateInfoNV(stream, (VkAccelerationStructureCreateInfoNV*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkAccelerationStructureCreateInfoNV(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureCreateInfoNV*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -27712,7 +27715,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -27757,7 +27760,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -27775,7 +27778,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyAccelerationStructureNV = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -27801,7 +27804,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkAccelerationStructureNV((VkAccelerationStructureNV*)&accelerationStructure);
     stream->flush();
@@ -27832,7 +27835,7 @@
     if (pInfo)
     {
         local_pInfo = (VkAccelerationStructureMemoryRequirementsInfoNV*)pool->alloc(sizeof(const VkAccelerationStructureMemoryRequirementsInfoNV));
-        deepcopy_VkAccelerationStructureMemoryRequirementsInfoNV(pool, pInfo, (VkAccelerationStructureMemoryRequirementsInfoNV*)(local_pInfo));
+        deepcopy_VkAccelerationStructureMemoryRequirementsInfoNV(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo, (VkAccelerationStructureMemoryRequirementsInfoNV*)(local_pInfo));
     }
     if (local_pInfo)
     {
@@ -27843,8 +27846,8 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkAccelerationStructureMemoryRequirementsInfoNV(sFeatureBits, (VkAccelerationStructureMemoryRequirementsInfoNV*)(local_pInfo), countPtr);
-        count_VkMemoryRequirements2KHR(sFeatureBits, (VkMemoryRequirements2KHR*)(pMemoryRequirements), countPtr);
+        count_VkAccelerationStructureMemoryRequirementsInfoNV(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureMemoryRequirementsInfoNV*)(local_pInfo), countPtr);
+        count_VkMemoryRequirements2KHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2KHR*)(pMemoryRequirements), countPtr);
     }
     uint32_t packetSize_vkGetAccelerationStructureMemoryRequirementsNV = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetAccelerationStructureMemoryRequirementsNV);
@@ -27858,9 +27861,9 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkAccelerationStructureMemoryRequirementsInfoNV(stream, (VkAccelerationStructureMemoryRequirementsInfoNV*)(local_pInfo), streamPtrPtr);
-    reservedmarshal_VkMemoryRequirements2KHR(stream, (VkMemoryRequirements2KHR*)(pMemoryRequirements), streamPtrPtr);
-    unmarshal_VkMemoryRequirements2KHR(stream, (VkMemoryRequirements2KHR*)(pMemoryRequirements));
+    reservedmarshal_VkAccelerationStructureMemoryRequirementsInfoNV(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureMemoryRequirementsInfoNV*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkMemoryRequirements2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2KHR*)(pMemoryRequirements), streamPtrPtr);
+    unmarshal_VkMemoryRequirements2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2KHR*)(pMemoryRequirements));
     if (pMemoryRequirements)
     {
         transform_fromhost_VkMemoryRequirements2KHR(sResourceTracker, (VkMemoryRequirements2KHR*)(pMemoryRequirements));
@@ -27896,7 +27899,7 @@
         local_pBindInfos = (VkBindAccelerationStructureMemoryInfoNV*)pool->alloc(((bindInfoCount)) * sizeof(const VkBindAccelerationStructureMemoryInfoNV));
         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
         {
-            deepcopy_VkBindAccelerationStructureMemoryInfoNV(pool, pBindInfos + i, (VkBindAccelerationStructureMemoryInfoNV*)(local_pBindInfos + i));
+            deepcopy_VkBindAccelerationStructureMemoryInfoNV(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBindInfos + i, (VkBindAccelerationStructureMemoryInfoNV*)(local_pBindInfos + i));
         }
     }
     if (local_pBindInfos)
@@ -27914,7 +27917,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
         {
-            count_VkBindAccelerationStructureMemoryInfoNV(sFeatureBits, (VkBindAccelerationStructureMemoryInfoNV*)(local_pBindInfos + i), countPtr);
+            count_VkBindAccelerationStructureMemoryInfoNV(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBindAccelerationStructureMemoryInfoNV*)(local_pBindInfos + i), countPtr);
         }
     }
     uint32_t packetSize_vkBindAccelerationStructureMemoryNV = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -27933,7 +27936,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
     {
-        reservedmarshal_VkBindAccelerationStructureMemoryInfoNV(stream, (VkBindAccelerationStructureMemoryInfoNV*)(local_pBindInfos + i), streamPtrPtr);
+        reservedmarshal_VkBindAccelerationStructureMemoryInfoNV(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBindAccelerationStructureMemoryInfoNV*)(local_pBindInfos + i), streamPtrPtr);
     }
     VkResult vkBindAccelerationStructureMemoryNV_VkResult_return = (VkResult)0;
     stream->read(&vkBindAccelerationStructureMemoryNV_VkResult_return, sizeof(VkResult));
@@ -27978,7 +27981,7 @@
     if (pInfo)
     {
         local_pInfo = (VkAccelerationStructureInfoNV*)pool->alloc(sizeof(const VkAccelerationStructureInfoNV));
-        deepcopy_VkAccelerationStructureInfoNV(pool, pInfo, (VkAccelerationStructureInfoNV*)(local_pInfo));
+        deepcopy_VkAccelerationStructureInfoNV(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo, (VkAccelerationStructureInfoNV*)(local_pInfo));
     }
     local_instanceData = instanceData;
     local_instanceOffset = instanceOffset;
@@ -27996,7 +27999,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkAccelerationStructureInfoNV(sFeatureBits, (VkAccelerationStructureInfoNV*)(local_pInfo), countPtr);
+        count_VkAccelerationStructureInfoNV(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureInfoNV*)(local_pInfo), countPtr);
         uint64_t cgen_var_1;
         *countPtr += 1 * 8;
         *countPtr += sizeof(VkDeviceSize);
@@ -28023,7 +28026,7 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkAccelerationStructureInfoNV(stream, (VkAccelerationStructureInfoNV*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkAccelerationStructureInfoNV(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureInfoNV*)(local_pInfo), streamPtrPtr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkBuffer((*&local_instanceData));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -28283,14 +28286,14 @@
         local_pCreateInfos = (VkRayTracingPipelineCreateInfoNV*)pool->alloc(((createInfoCount)) * sizeof(const VkRayTracingPipelineCreateInfoNV));
         for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i)
         {
-            deepcopy_VkRayTracingPipelineCreateInfoNV(pool, pCreateInfos + i, (VkRayTracingPipelineCreateInfoNV*)(local_pCreateInfos + i));
+            deepcopy_VkRayTracingPipelineCreateInfoNV(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfos + i, (VkRayTracingPipelineCreateInfoNV*)(local_pCreateInfos + i));
         }
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfos)
@@ -28314,13 +28317,13 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i)
         {
-            count_VkRayTracingPipelineCreateInfoNV(sFeatureBits, (VkRayTracingPipelineCreateInfoNV*)(local_pCreateInfos + i), countPtr);
+            count_VkRayTracingPipelineCreateInfoNV(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRayTracingPipelineCreateInfoNV*)(local_pCreateInfos + i), countPtr);
         }
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         if (((createInfoCount)))
         {
@@ -28347,7 +28350,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i)
     {
-        reservedmarshal_VkRayTracingPipelineCreateInfoNV(stream, (VkRayTracingPipelineCreateInfoNV*)(local_pCreateInfos + i), streamPtrPtr);
+        reservedmarshal_VkRayTracingPipelineCreateInfoNV(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRayTracingPipelineCreateInfoNV*)(local_pCreateInfos + i), streamPtrPtr);
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
@@ -28356,7 +28359,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     if (((createInfoCount)))
@@ -28784,7 +28787,7 @@
         {
             *countPtr += sizeof(uint8_t);
         }
-        count_VkMemoryHostPointerPropertiesEXT(sFeatureBits, (VkMemoryHostPointerPropertiesEXT*)(pMemoryHostPointerProperties), countPtr);
+        count_VkMemoryHostPointerPropertiesEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryHostPointerPropertiesEXT*)(pMemoryHostPointerProperties), countPtr);
     }
     uint32_t packetSize_vkGetMemoryHostPointerPropertiesEXT = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetMemoryHostPointerPropertiesEXT);
@@ -28810,8 +28813,8 @@
         memcpy(*streamPtrPtr, (void*)local_pHostPointer, sizeof(uint8_t));
         *streamPtrPtr += sizeof(uint8_t);
     }
-    reservedmarshal_VkMemoryHostPointerPropertiesEXT(stream, (VkMemoryHostPointerPropertiesEXT*)(pMemoryHostPointerProperties), streamPtrPtr);
-    unmarshal_VkMemoryHostPointerPropertiesEXT(stream, (VkMemoryHostPointerPropertiesEXT*)(pMemoryHostPointerProperties));
+    reservedmarshal_VkMemoryHostPointerPropertiesEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryHostPointerPropertiesEXT*)(pMemoryHostPointerProperties), streamPtrPtr);
+    unmarshal_VkMemoryHostPointerPropertiesEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryHostPointerPropertiesEXT*)(pMemoryHostPointerProperties));
     if (pMemoryHostPointerProperties)
     {
         transform_fromhost_VkMemoryHostPointerPropertiesEXT(sResourceTracker, (VkMemoryHostPointerPropertiesEXT*)(pMemoryHostPointerProperties));
@@ -29025,7 +29028,7 @@
         local_pTimestampInfos = (VkCalibratedTimestampInfoEXT*)pool->alloc(((timestampCount)) * sizeof(const VkCalibratedTimestampInfoEXT));
         for (uint32_t i = 0; i < (uint32_t)((timestampCount)); ++i)
         {
-            deepcopy_VkCalibratedTimestampInfoEXT(pool, pTimestampInfos + i, (VkCalibratedTimestampInfoEXT*)(local_pTimestampInfos + i));
+            deepcopy_VkCalibratedTimestampInfoEXT(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pTimestampInfos + i, (VkCalibratedTimestampInfoEXT*)(local_pTimestampInfos + i));
         }
     }
     if (local_pTimestampInfos)
@@ -29043,7 +29046,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((timestampCount)); ++i)
         {
-            count_VkCalibratedTimestampInfoEXT(sFeatureBits, (VkCalibratedTimestampInfoEXT*)(local_pTimestampInfos + i), countPtr);
+            count_VkCalibratedTimestampInfoEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCalibratedTimestampInfoEXT*)(local_pTimestampInfos + i), countPtr);
         }
         *countPtr += ((timestampCount)) * sizeof(uint64_t);
         *countPtr += sizeof(uint64_t);
@@ -29064,7 +29067,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((timestampCount)); ++i)
     {
-        reservedmarshal_VkCalibratedTimestampInfoEXT(stream, (VkCalibratedTimestampInfoEXT*)(local_pTimestampInfos + i), streamPtrPtr);
+        reservedmarshal_VkCalibratedTimestampInfoEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCalibratedTimestampInfoEXT*)(local_pTimestampInfos + i), streamPtrPtr);
     }
     memcpy(*streamPtrPtr, (uint64_t*)pTimestamps, ((timestampCount)) * sizeof(uint64_t));
     *streamPtrPtr += ((timestampCount)) * sizeof(uint64_t);
@@ -29332,7 +29335,7 @@
         local_pExclusiveScissors = (VkRect2D*)pool->alloc(((exclusiveScissorCount)) * sizeof(const VkRect2D));
         for (uint32_t i = 0; i < (uint32_t)((exclusiveScissorCount)); ++i)
         {
-            deepcopy_VkRect2D(pool, pExclusiveScissors + i, (VkRect2D*)(local_pExclusiveScissors + i));
+            deepcopy_VkRect2D(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pExclusiveScissors + i, (VkRect2D*)(local_pExclusiveScissors + i));
         }
     }
     if (local_pExclusiveScissors)
@@ -29351,7 +29354,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((exclusiveScissorCount)); ++i)
         {
-            count_VkRect2D(sFeatureBits, (VkRect2D*)(local_pExclusiveScissors + i), countPtr);
+            count_VkRect2D(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRect2D*)(local_pExclusiveScissors + i), countPtr);
         }
     }
     uint32_t packetSize_vkCmdSetExclusiveScissorNV = 4 + 4 + count;
@@ -29374,7 +29377,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((exclusiveScissorCount)); ++i)
     {
-        reservedmarshal_VkRect2D(stream, (VkRect2D*)(local_pExclusiveScissors + i), streamPtrPtr);
+        reservedmarshal_VkRect2D(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRect2D*)(local_pExclusiveScissors + i), streamPtrPtr);
     }
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
@@ -29479,7 +29482,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pCheckpointDataCount)); ++i)
                 {
-                    count_VkCheckpointDataNV(sFeatureBits, (VkCheckpointDataNV*)(pCheckpointData + i), countPtr);
+                    count_VkCheckpointDataNV(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCheckpointDataNV*)(pCheckpointData + i), countPtr);
                 }
             }
         }
@@ -29515,7 +29518,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pCheckpointDataCount)); ++i)
         {
-            reservedmarshal_VkCheckpointDataNV(stream, (VkCheckpointDataNV*)(pCheckpointData + i), streamPtrPtr);
+            reservedmarshal_VkCheckpointDataNV(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCheckpointDataNV*)(pCheckpointData + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -29542,7 +29545,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pCheckpointDataCount)); ++i)
             {
-                unmarshal_VkCheckpointDataNV(stream, (VkCheckpointDataNV*)(pCheckpointData + i));
+                unmarshal_VkCheckpointDataNV(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCheckpointDataNV*)(pCheckpointData + i));
             }
         }
     }
@@ -29586,7 +29589,7 @@
     if (pInitializeInfo)
     {
         local_pInitializeInfo = (VkInitializePerformanceApiInfoINTEL*)pool->alloc(sizeof(const VkInitializePerformanceApiInfoINTEL));
-        deepcopy_VkInitializePerformanceApiInfoINTEL(pool, pInitializeInfo, (VkInitializePerformanceApiInfoINTEL*)(local_pInitializeInfo));
+        deepcopy_VkInitializePerformanceApiInfoINTEL(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInitializeInfo, (VkInitializePerformanceApiInfoINTEL*)(local_pInitializeInfo));
     }
     if (local_pInitializeInfo)
     {
@@ -29597,7 +29600,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkInitializePerformanceApiInfoINTEL(sFeatureBits, (VkInitializePerformanceApiInfoINTEL*)(local_pInitializeInfo), countPtr);
+        count_VkInitializePerformanceApiInfoINTEL(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkInitializePerformanceApiInfoINTEL*)(local_pInitializeInfo), countPtr);
     }
     uint32_t packetSize_vkInitializePerformanceApiINTEL = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkInitializePerformanceApiINTEL);
@@ -29611,7 +29614,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkInitializePerformanceApiInfoINTEL(stream, (VkInitializePerformanceApiInfoINTEL*)(local_pInitializeInfo), streamPtrPtr);
+    reservedmarshal_VkInitializePerformanceApiInfoINTEL(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkInitializePerformanceApiInfoINTEL*)(local_pInitializeInfo), streamPtrPtr);
     VkResult vkInitializePerformanceApiINTEL_VkResult_return = (VkResult)0;
     stream->read(&vkInitializePerformanceApiINTEL_VkResult_return, sizeof(VkResult));
     ++encodeCount;;
@@ -29680,7 +29683,7 @@
     if (pMarkerInfo)
     {
         local_pMarkerInfo = (VkPerformanceMarkerInfoINTEL*)pool->alloc(sizeof(const VkPerformanceMarkerInfoINTEL));
-        deepcopy_VkPerformanceMarkerInfoINTEL(pool, pMarkerInfo, (VkPerformanceMarkerInfoINTEL*)(local_pMarkerInfo));
+        deepcopy_VkPerformanceMarkerInfoINTEL(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pMarkerInfo, (VkPerformanceMarkerInfoINTEL*)(local_pMarkerInfo));
     }
     if (local_pMarkerInfo)
     {
@@ -29691,7 +29694,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPerformanceMarkerInfoINTEL(sFeatureBits, (VkPerformanceMarkerInfoINTEL*)(local_pMarkerInfo), countPtr);
+        count_VkPerformanceMarkerInfoINTEL(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceMarkerInfoINTEL*)(local_pMarkerInfo), countPtr);
     }
     uint32_t packetSize_vkCmdSetPerformanceMarkerINTEL = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetPerformanceMarkerINTEL -= 8;
@@ -29707,7 +29710,7 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkPerformanceMarkerInfoINTEL(stream, (VkPerformanceMarkerInfoINTEL*)(local_pMarkerInfo), streamPtrPtr);
+    reservedmarshal_VkPerformanceMarkerInfoINTEL(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceMarkerInfoINTEL*)(local_pMarkerInfo), streamPtrPtr);
     VkResult vkCmdSetPerformanceMarkerINTEL_VkResult_return = (VkResult)0;
     stream->read(&vkCmdSetPerformanceMarkerINTEL_VkResult_return, sizeof(VkResult));
     ++encodeCount;;
@@ -29737,7 +29740,7 @@
     if (pMarkerInfo)
     {
         local_pMarkerInfo = (VkPerformanceStreamMarkerInfoINTEL*)pool->alloc(sizeof(const VkPerformanceStreamMarkerInfoINTEL));
-        deepcopy_VkPerformanceStreamMarkerInfoINTEL(pool, pMarkerInfo, (VkPerformanceStreamMarkerInfoINTEL*)(local_pMarkerInfo));
+        deepcopy_VkPerformanceStreamMarkerInfoINTEL(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pMarkerInfo, (VkPerformanceStreamMarkerInfoINTEL*)(local_pMarkerInfo));
     }
     if (local_pMarkerInfo)
     {
@@ -29748,7 +29751,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPerformanceStreamMarkerInfoINTEL(sFeatureBits, (VkPerformanceStreamMarkerInfoINTEL*)(local_pMarkerInfo), countPtr);
+        count_VkPerformanceStreamMarkerInfoINTEL(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceStreamMarkerInfoINTEL*)(local_pMarkerInfo), countPtr);
     }
     uint32_t packetSize_vkCmdSetPerformanceStreamMarkerINTEL = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetPerformanceStreamMarkerINTEL -= 8;
@@ -29764,7 +29767,7 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkPerformanceStreamMarkerInfoINTEL(stream, (VkPerformanceStreamMarkerInfoINTEL*)(local_pMarkerInfo), streamPtrPtr);
+    reservedmarshal_VkPerformanceStreamMarkerInfoINTEL(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceStreamMarkerInfoINTEL*)(local_pMarkerInfo), streamPtrPtr);
     VkResult vkCmdSetPerformanceStreamMarkerINTEL_VkResult_return = (VkResult)0;
     stream->read(&vkCmdSetPerformanceStreamMarkerINTEL_VkResult_return, sizeof(VkResult));
     ++encodeCount;;
@@ -29794,7 +29797,7 @@
     if (pOverrideInfo)
     {
         local_pOverrideInfo = (VkPerformanceOverrideInfoINTEL*)pool->alloc(sizeof(const VkPerformanceOverrideInfoINTEL));
-        deepcopy_VkPerformanceOverrideInfoINTEL(pool, pOverrideInfo, (VkPerformanceOverrideInfoINTEL*)(local_pOverrideInfo));
+        deepcopy_VkPerformanceOverrideInfoINTEL(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pOverrideInfo, (VkPerformanceOverrideInfoINTEL*)(local_pOverrideInfo));
     }
     if (local_pOverrideInfo)
     {
@@ -29805,7 +29808,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPerformanceOverrideInfoINTEL(sFeatureBits, (VkPerformanceOverrideInfoINTEL*)(local_pOverrideInfo), countPtr);
+        count_VkPerformanceOverrideInfoINTEL(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceOverrideInfoINTEL*)(local_pOverrideInfo), countPtr);
     }
     uint32_t packetSize_vkCmdSetPerformanceOverrideINTEL = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetPerformanceOverrideINTEL -= 8;
@@ -29821,7 +29824,7 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkPerformanceOverrideInfoINTEL(stream, (VkPerformanceOverrideInfoINTEL*)(local_pOverrideInfo), streamPtrPtr);
+    reservedmarshal_VkPerformanceOverrideInfoINTEL(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceOverrideInfoINTEL*)(local_pOverrideInfo), streamPtrPtr);
     VkResult vkCmdSetPerformanceOverrideINTEL_VkResult_return = (VkResult)0;
     stream->read(&vkCmdSetPerformanceOverrideINTEL_VkResult_return, sizeof(VkResult));
     ++encodeCount;;
@@ -29852,7 +29855,7 @@
     if (pAcquireInfo)
     {
         local_pAcquireInfo = (VkPerformanceConfigurationAcquireInfoINTEL*)pool->alloc(sizeof(const VkPerformanceConfigurationAcquireInfoINTEL));
-        deepcopy_VkPerformanceConfigurationAcquireInfoINTEL(pool, pAcquireInfo, (VkPerformanceConfigurationAcquireInfoINTEL*)(local_pAcquireInfo));
+        deepcopy_VkPerformanceConfigurationAcquireInfoINTEL(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAcquireInfo, (VkPerformanceConfigurationAcquireInfoINTEL*)(local_pAcquireInfo));
     }
     if (local_pAcquireInfo)
     {
@@ -29863,7 +29866,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPerformanceConfigurationAcquireInfoINTEL(sFeatureBits, (VkPerformanceConfigurationAcquireInfoINTEL*)(local_pAcquireInfo), countPtr);
+        count_VkPerformanceConfigurationAcquireInfoINTEL(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceConfigurationAcquireInfoINTEL*)(local_pAcquireInfo), countPtr);
         *countPtr += 8;
     }
     uint32_t packetSize_vkAcquirePerformanceConfigurationINTEL = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -29878,7 +29881,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPerformanceConfigurationAcquireInfoINTEL(stream, (VkPerformanceConfigurationAcquireInfoINTEL*)(local_pAcquireInfo), streamPtrPtr);
+    reservedmarshal_VkPerformanceConfigurationAcquireInfoINTEL(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceConfigurationAcquireInfoINTEL*)(local_pAcquireInfo), streamPtrPtr);
     uint64_t cgen_var_1 = (uint64_t)(*pConfiguration);
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
     android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
@@ -30015,7 +30018,7 @@
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
         *countPtr += sizeof(VkPerformanceParameterTypeINTEL);
-        count_VkPerformanceValueINTEL(sFeatureBits, (VkPerformanceValueINTEL*)(pValue), countPtr);
+        count_VkPerformanceValueINTEL(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceValueINTEL*)(pValue), countPtr);
     }
     uint32_t packetSize_vkGetPerformanceParameterINTEL = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPerformanceParameterINTEL);
@@ -30031,8 +30034,8 @@
     *streamPtrPtr += 1 * 8;
     memcpy(*streamPtrPtr, (VkPerformanceParameterTypeINTEL*)&local_parameter, sizeof(VkPerformanceParameterTypeINTEL));
     *streamPtrPtr += sizeof(VkPerformanceParameterTypeINTEL);
-    reservedmarshal_VkPerformanceValueINTEL(stream, (VkPerformanceValueINTEL*)(pValue), streamPtrPtr);
-    unmarshal_VkPerformanceValueINTEL(stream, (VkPerformanceValueINTEL*)(pValue));
+    reservedmarshal_VkPerformanceValueINTEL(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceValueINTEL*)(pValue), streamPtrPtr);
+    unmarshal_VkPerformanceValueINTEL(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceValueINTEL*)(pValue));
     if (pValue)
     {
         transform_fromhost_VkPerformanceValueINTEL(sResourceTracker, (VkPerformanceValueINTEL*)(pValue));
@@ -30129,13 +30132,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkImagePipeSurfaceCreateInfoFUCHSIA*)pool->alloc(sizeof(const VkImagePipeSurfaceCreateInfoFUCHSIA));
-        deepcopy_VkImagePipeSurfaceCreateInfoFUCHSIA(pool, pCreateInfo, (VkImagePipeSurfaceCreateInfoFUCHSIA*)(local_pCreateInfo));
+        deepcopy_VkImagePipeSurfaceCreateInfoFUCHSIA(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkImagePipeSurfaceCreateInfoFUCHSIA*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -30151,12 +30154,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkImagePipeSurfaceCreateInfoFUCHSIA(sFeatureBits, (VkImagePipeSurfaceCreateInfoFUCHSIA*)(local_pCreateInfo), countPtr);
+        count_VkImagePipeSurfaceCreateInfoFUCHSIA(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImagePipeSurfaceCreateInfoFUCHSIA*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -30173,7 +30176,7 @@
     *&cgen_var_0 = get_host_u64_VkInstance((*&local_instance));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkImagePipeSurfaceCreateInfoFUCHSIA(stream, (VkImagePipeSurfaceCreateInfoFUCHSIA*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkImagePipeSurfaceCreateInfoFUCHSIA(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImagePipeSurfaceCreateInfoFUCHSIA*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -30181,7 +30184,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -30226,13 +30229,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkMetalSurfaceCreateInfoEXT*)pool->alloc(sizeof(const VkMetalSurfaceCreateInfoEXT));
-        deepcopy_VkMetalSurfaceCreateInfoEXT(pool, pCreateInfo, (VkMetalSurfaceCreateInfoEXT*)(local_pCreateInfo));
+        deepcopy_VkMetalSurfaceCreateInfoEXT(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkMetalSurfaceCreateInfoEXT*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -30248,12 +30251,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkMetalSurfaceCreateInfoEXT(sFeatureBits, (VkMetalSurfaceCreateInfoEXT*)(local_pCreateInfo), countPtr);
+        count_VkMetalSurfaceCreateInfoEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMetalSurfaceCreateInfoEXT*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -30270,7 +30273,7 @@
     *&cgen_var_0 = get_host_u64_VkInstance((*&local_instance));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkMetalSurfaceCreateInfoEXT(stream, (VkMetalSurfaceCreateInfoEXT*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkMetalSurfaceCreateInfoEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMetalSurfaceCreateInfoEXT*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -30278,7 +30281,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -30302,119 +30305,7 @@
 }
 
 #endif
-#ifdef VK_GOOGLE_color_buffer
-VkResult VkEncoder::vkRegisterImageColorBufferGOOGLE(
-    VkDevice device,
-    VkImage image,
-    uint32_t colorBuffer,
-    uint32_t doLock)
-{
-    (void)doLock;
-    bool queueSubmitWithCommandsEnabled = sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
-    if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
-    auto stream = mImpl->stream();
-    auto pool = mImpl->pool();
-    VkDevice local_device;
-    VkImage local_image;
-    uint32_t local_colorBuffer;
-    local_device = device;
-    local_image = image;
-    local_colorBuffer = colorBuffer;
-    size_t count = 0;
-    size_t* countPtr = &count;
-    {
-        uint64_t cgen_var_0;
-        *countPtr += 1 * 8;
-        uint64_t cgen_var_1;
-        *countPtr += 1 * 8;
-        *countPtr += sizeof(uint32_t);
-    }
-    uint32_t packetSize_vkRegisterImageColorBufferGOOGLE = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
-    uint8_t* streamPtr = stream->reserve(packetSize_vkRegisterImageColorBufferGOOGLE);
-    uint8_t** streamPtrPtr = &streamPtr;
-    uint32_t opcode_vkRegisterImageColorBufferGOOGLE = OP_vkRegisterImageColorBufferGOOGLE;
-    uint32_t seqno; if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
-    memcpy(streamPtr, &opcode_vkRegisterImageColorBufferGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
-    memcpy(streamPtr, &packetSize_vkRegisterImageColorBufferGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
-    if (queueSubmitWithCommandsEnabled) { memcpy(streamPtr, &seqno, sizeof(uint32_t)); streamPtr += sizeof(uint32_t); }
-    uint64_t cgen_var_0;
-    *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
-    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
-    *streamPtrPtr += 1 * 8;
-    uint64_t cgen_var_1;
-    *&cgen_var_1 = get_host_u64_VkImage((*&local_image));
-    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
-    *streamPtrPtr += 1 * 8;
-    memcpy(*streamPtrPtr, (uint32_t*)&local_colorBuffer, sizeof(uint32_t));
-    *streamPtrPtr += sizeof(uint32_t);
-    VkResult vkRegisterImageColorBufferGOOGLE_VkResult_return = (VkResult)0;
-    stream->read(&vkRegisterImageColorBufferGOOGLE_VkResult_return, sizeof(VkResult));
-    ++encodeCount;;
-    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
-    {
-        pool->freeAll();
-        stream->clearPool();
-    }
-    if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
-    return vkRegisterImageColorBufferGOOGLE_VkResult_return;
-}
-
-VkResult VkEncoder::vkRegisterBufferColorBufferGOOGLE(
-    VkDevice device,
-    VkBuffer buffer,
-    uint32_t colorBuffer,
-    uint32_t doLock)
-{
-    (void)doLock;
-    bool queueSubmitWithCommandsEnabled = sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
-    if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
-    auto stream = mImpl->stream();
-    auto pool = mImpl->pool();
-    VkDevice local_device;
-    VkBuffer local_buffer;
-    uint32_t local_colorBuffer;
-    local_device = device;
-    local_buffer = buffer;
-    local_colorBuffer = colorBuffer;
-    size_t count = 0;
-    size_t* countPtr = &count;
-    {
-        uint64_t cgen_var_0;
-        *countPtr += 1 * 8;
-        uint64_t cgen_var_1;
-        *countPtr += 1 * 8;
-        *countPtr += sizeof(uint32_t);
-    }
-    uint32_t packetSize_vkRegisterBufferColorBufferGOOGLE = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
-    uint8_t* streamPtr = stream->reserve(packetSize_vkRegisterBufferColorBufferGOOGLE);
-    uint8_t** streamPtrPtr = &streamPtr;
-    uint32_t opcode_vkRegisterBufferColorBufferGOOGLE = OP_vkRegisterBufferColorBufferGOOGLE;
-    uint32_t seqno; if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
-    memcpy(streamPtr, &opcode_vkRegisterBufferColorBufferGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
-    memcpy(streamPtr, &packetSize_vkRegisterBufferColorBufferGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
-    if (queueSubmitWithCommandsEnabled) { memcpy(streamPtr, &seqno, sizeof(uint32_t)); streamPtr += sizeof(uint32_t); }
-    uint64_t cgen_var_0;
-    *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
-    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
-    *streamPtrPtr += 1 * 8;
-    uint64_t cgen_var_1;
-    *&cgen_var_1 = get_host_u64_VkBuffer((*&local_buffer));
-    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
-    *streamPtrPtr += 1 * 8;
-    memcpy(*streamPtrPtr, (uint32_t*)&local_colorBuffer, sizeof(uint32_t));
-    *streamPtrPtr += sizeof(uint32_t);
-    VkResult vkRegisterBufferColorBufferGOOGLE_VkResult_return = (VkResult)0;
-    stream->read(&vkRegisterBufferColorBufferGOOGLE_VkResult_return, sizeof(VkResult));
-    ++encodeCount;;
-    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
-    {
-        pool->freeAll();
-        stream->clearPool();
-    }
-    if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
-    return vkRegisterBufferColorBufferGOOGLE_VkResult_return;
-}
-
+#ifdef VK_EXT_fragment_density_map
 #endif
 #ifdef VK_EXT_scalar_block_layout
 #endif
@@ -30454,7 +30345,7 @@
     if (pInfo)
     {
         local_pInfo = (VkBufferDeviceAddressInfo*)pool->alloc(sizeof(const VkBufferDeviceAddressInfo));
-        deepcopy_VkBufferDeviceAddressInfo(pool, pInfo, (VkBufferDeviceAddressInfo*)(local_pInfo));
+        deepcopy_VkBufferDeviceAddressInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo, (VkBufferDeviceAddressInfo*)(local_pInfo));
     }
     if (local_pInfo)
     {
@@ -30465,7 +30356,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkBufferDeviceAddressInfo(sFeatureBits, (VkBufferDeviceAddressInfo*)(local_pInfo), countPtr);
+        count_VkBufferDeviceAddressInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferDeviceAddressInfo*)(local_pInfo), countPtr);
     }
     uint32_t packetSize_vkGetBufferDeviceAddressEXT = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetBufferDeviceAddressEXT);
@@ -30479,7 +30370,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkBufferDeviceAddressInfo(stream, (VkBufferDeviceAddressInfo*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkBufferDeviceAddressInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferDeviceAddressInfo*)(local_pInfo), streamPtrPtr);
     VkDeviceAddress vkGetBufferDeviceAddressEXT_VkDeviceAddress_return = (VkDeviceAddress)0;
     stream->read(&vkGetBufferDeviceAddressEXT_VkDeviceAddress_return, sizeof(VkDeviceAddress));
     ++encodeCount;;
@@ -30526,7 +30417,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pToolCount)); ++i)
                 {
-                    count_VkPhysicalDeviceToolPropertiesEXT(sFeatureBits, (VkPhysicalDeviceToolPropertiesEXT*)(pToolProperties + i), countPtr);
+                    count_VkPhysicalDeviceToolPropertiesEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceToolPropertiesEXT*)(pToolProperties + i), countPtr);
                 }
             }
         }
@@ -30562,7 +30453,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pToolCount)); ++i)
         {
-            reservedmarshal_VkPhysicalDeviceToolPropertiesEXT(stream, (VkPhysicalDeviceToolPropertiesEXT*)(pToolProperties + i), streamPtrPtr);
+            reservedmarshal_VkPhysicalDeviceToolPropertiesEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceToolPropertiesEXT*)(pToolProperties + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -30589,7 +30480,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pToolCount)); ++i)
             {
-                unmarshal_VkPhysicalDeviceToolPropertiesEXT(stream, (VkPhysicalDeviceToolPropertiesEXT*)(pToolProperties + i));
+                unmarshal_VkPhysicalDeviceToolPropertiesEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceToolPropertiesEXT*)(pToolProperties + i));
             }
         }
     }
@@ -30653,7 +30544,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
                 {
-                    count_VkCooperativeMatrixPropertiesNV(sFeatureBits, (VkCooperativeMatrixPropertiesNV*)(pProperties + i), countPtr);
+                    count_VkCooperativeMatrixPropertiesNV(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCooperativeMatrixPropertiesNV*)(pProperties + i), countPtr);
                 }
             }
         }
@@ -30689,7 +30580,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            reservedmarshal_VkCooperativeMatrixPropertiesNV(stream, (VkCooperativeMatrixPropertiesNV*)(pProperties + i), streamPtrPtr);
+            reservedmarshal_VkCooperativeMatrixPropertiesNV(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCooperativeMatrixPropertiesNV*)(pProperties + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -30716,7 +30607,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                unmarshal_VkCooperativeMatrixPropertiesNV(stream, (VkCooperativeMatrixPropertiesNV*)(pProperties + i));
+                unmarshal_VkCooperativeMatrixPropertiesNV(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCooperativeMatrixPropertiesNV*)(pProperties + i));
             }
         }
     }
@@ -30776,7 +30667,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)(*(pCombinationCount)); ++i)
                 {
-                    count_VkFramebufferMixedSamplesCombinationNV(sFeatureBits, (VkFramebufferMixedSamplesCombinationNV*)(pCombinations + i), countPtr);
+                    count_VkFramebufferMixedSamplesCombinationNV(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFramebufferMixedSamplesCombinationNV*)(pCombinations + i), countPtr);
                 }
             }
         }
@@ -30812,7 +30703,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pCombinationCount)); ++i)
         {
-            reservedmarshal_VkFramebufferMixedSamplesCombinationNV(stream, (VkFramebufferMixedSamplesCombinationNV*)(pCombinations + i), streamPtrPtr);
+            reservedmarshal_VkFramebufferMixedSamplesCombinationNV(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFramebufferMixedSamplesCombinationNV*)(pCombinations + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -30839,7 +30730,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pCombinationCount)); ++i)
             {
-                unmarshal_VkFramebufferMixedSamplesCombinationNV(stream, (VkFramebufferMixedSamplesCombinationNV*)(pCombinations + i));
+                unmarshal_VkFramebufferMixedSamplesCombinationNV(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFramebufferMixedSamplesCombinationNV*)(pCombinations + i));
             }
         }
     }
@@ -30890,7 +30781,7 @@
     if (pSurfaceInfo)
     {
         local_pSurfaceInfo = (VkPhysicalDeviceSurfaceInfo2KHR*)pool->alloc(sizeof(const VkPhysicalDeviceSurfaceInfo2KHR));
-        deepcopy_VkPhysicalDeviceSurfaceInfo2KHR(pool, pSurfaceInfo, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo));
+        deepcopy_VkPhysicalDeviceSurfaceInfo2KHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSurfaceInfo, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo));
     }
     if (local_pSurfaceInfo)
     {
@@ -30901,7 +30792,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPhysicalDeviceSurfaceInfo2KHR(sFeatureBits, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo), countPtr);
+        count_VkPhysicalDeviceSurfaceInfo2KHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (pPresentModeCount)
@@ -30930,7 +30821,7 @@
     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPhysicalDeviceSurfaceInfo2KHR(stream, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo), streamPtrPtr);
+    reservedmarshal_VkPhysicalDeviceSurfaceInfo2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pPresentModeCount;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -31103,7 +30994,7 @@
     if (pSurfaceInfo)
     {
         local_pSurfaceInfo = (VkPhysicalDeviceSurfaceInfo2KHR*)pool->alloc(sizeof(const VkPhysicalDeviceSurfaceInfo2KHR));
-        deepcopy_VkPhysicalDeviceSurfaceInfo2KHR(pool, pSurfaceInfo, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo));
+        deepcopy_VkPhysicalDeviceSurfaceInfo2KHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSurfaceInfo, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo));
     }
     if (local_pSurfaceInfo)
     {
@@ -31114,7 +31005,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPhysicalDeviceSurfaceInfo2KHR(sFeatureBits, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo), countPtr);
+        count_VkPhysicalDeviceSurfaceInfo2KHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (pModes)
@@ -31134,7 +31025,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPhysicalDeviceSurfaceInfo2KHR(stream, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo), streamPtrPtr);
+    reservedmarshal_VkPhysicalDeviceSurfaceInfo2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pModes;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -31190,13 +31081,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkHeadlessSurfaceCreateInfoEXT*)pool->alloc(sizeof(const VkHeadlessSurfaceCreateInfoEXT));
-        deepcopy_VkHeadlessSurfaceCreateInfoEXT(pool, pCreateInfo, (VkHeadlessSurfaceCreateInfoEXT*)(local_pCreateInfo));
+        deepcopy_VkHeadlessSurfaceCreateInfoEXT(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkHeadlessSurfaceCreateInfoEXT*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -31212,12 +31103,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkHeadlessSurfaceCreateInfoEXT(sFeatureBits, (VkHeadlessSurfaceCreateInfoEXT*)(local_pCreateInfo), countPtr);
+        count_VkHeadlessSurfaceCreateInfoEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkHeadlessSurfaceCreateInfoEXT*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -31234,7 +31125,7 @@
     *&cgen_var_0 = get_host_u64_VkInstance((*&local_instance));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkHeadlessSurfaceCreateInfoEXT(stream, (VkHeadlessSurfaceCreateInfoEXT*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkHeadlessSurfaceCreateInfoEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkHeadlessSurfaceCreateInfoEXT*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -31242,7 +31133,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -31547,7 +31438,7 @@
         local_pViewports = (VkViewport*)pool->alloc(((viewportCount)) * sizeof(const VkViewport));
         for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
         {
-            deepcopy_VkViewport(pool, pViewports + i, (VkViewport*)(local_pViewports + i));
+            deepcopy_VkViewport(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pViewports + i, (VkViewport*)(local_pViewports + i));
         }
     }
     if (local_pViewports)
@@ -31565,7 +31456,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
         {
-            count_VkViewport(sFeatureBits, (VkViewport*)(local_pViewports + i), countPtr);
+            count_VkViewport(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkViewport*)(local_pViewports + i), countPtr);
         }
     }
     uint32_t packetSize_vkCmdSetViewportWithCountEXT = 4 + 4 + count;
@@ -31586,7 +31477,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
     {
-        reservedmarshal_VkViewport(stream, (VkViewport*)(local_pViewports + i), streamPtrPtr);
+        reservedmarshal_VkViewport(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkViewport*)(local_pViewports + i), streamPtrPtr);
     }
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
@@ -31619,7 +31510,7 @@
         local_pScissors = (VkRect2D*)pool->alloc(((scissorCount)) * sizeof(const VkRect2D));
         for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i)
         {
-            deepcopy_VkRect2D(pool, pScissors + i, (VkRect2D*)(local_pScissors + i));
+            deepcopy_VkRect2D(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pScissors + i, (VkRect2D*)(local_pScissors + i));
         }
     }
     if (local_pScissors)
@@ -31637,7 +31528,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i)
         {
-            count_VkRect2D(sFeatureBits, (VkRect2D*)(local_pScissors + i), countPtr);
+            count_VkRect2D(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRect2D*)(local_pScissors + i), countPtr);
         }
     }
     uint32_t packetSize_vkCmdSetScissorWithCountEXT = 4 + 4 + count;
@@ -31658,7 +31549,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i)
     {
-        reservedmarshal_VkRect2D(stream, (VkRect2D*)(local_pScissors + i), streamPtrPtr);
+        reservedmarshal_VkRect2D(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRect2D*)(local_pScissors + i), streamPtrPtr);
     }
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
@@ -32108,7 +31999,7 @@
     if (pInfo)
     {
         local_pInfo = (VkGeneratedCommandsMemoryRequirementsInfoNV*)pool->alloc(sizeof(const VkGeneratedCommandsMemoryRequirementsInfoNV));
-        deepcopy_VkGeneratedCommandsMemoryRequirementsInfoNV(pool, pInfo, (VkGeneratedCommandsMemoryRequirementsInfoNV*)(local_pInfo));
+        deepcopy_VkGeneratedCommandsMemoryRequirementsInfoNV(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo, (VkGeneratedCommandsMemoryRequirementsInfoNV*)(local_pInfo));
     }
     if (local_pInfo)
     {
@@ -32119,8 +32010,8 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkGeneratedCommandsMemoryRequirementsInfoNV(sFeatureBits, (VkGeneratedCommandsMemoryRequirementsInfoNV*)(local_pInfo), countPtr);
-        count_VkMemoryRequirements2(sFeatureBits, (VkMemoryRequirements2*)(pMemoryRequirements), countPtr);
+        count_VkGeneratedCommandsMemoryRequirementsInfoNV(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkGeneratedCommandsMemoryRequirementsInfoNV*)(local_pInfo), countPtr);
+        count_VkMemoryRequirements2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements), countPtr);
     }
     uint32_t packetSize_vkGetGeneratedCommandsMemoryRequirementsNV = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetGeneratedCommandsMemoryRequirementsNV);
@@ -32134,9 +32025,9 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkGeneratedCommandsMemoryRequirementsInfoNV(stream, (VkGeneratedCommandsMemoryRequirementsInfoNV*)(local_pInfo), streamPtrPtr);
-    reservedmarshal_VkMemoryRequirements2(stream, (VkMemoryRequirements2*)(pMemoryRequirements), streamPtrPtr);
-    unmarshal_VkMemoryRequirements2(stream, (VkMemoryRequirements2*)(pMemoryRequirements));
+    reservedmarshal_VkGeneratedCommandsMemoryRequirementsInfoNV(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkGeneratedCommandsMemoryRequirementsInfoNV*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements), streamPtrPtr);
+    unmarshal_VkMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements));
     if (pMemoryRequirements)
     {
         transform_fromhost_VkMemoryRequirements2(sResourceTracker, (VkMemoryRequirements2*)(pMemoryRequirements));
@@ -32167,7 +32058,7 @@
     if (pGeneratedCommandsInfo)
     {
         local_pGeneratedCommandsInfo = (VkGeneratedCommandsInfoNV*)pool->alloc(sizeof(const VkGeneratedCommandsInfoNV));
-        deepcopy_VkGeneratedCommandsInfoNV(pool, pGeneratedCommandsInfo, (VkGeneratedCommandsInfoNV*)(local_pGeneratedCommandsInfo));
+        deepcopy_VkGeneratedCommandsInfoNV(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pGeneratedCommandsInfo, (VkGeneratedCommandsInfoNV*)(local_pGeneratedCommandsInfo));
     }
     if (local_pGeneratedCommandsInfo)
     {
@@ -32178,7 +32069,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkGeneratedCommandsInfoNV(sFeatureBits, (VkGeneratedCommandsInfoNV*)(local_pGeneratedCommandsInfo), countPtr);
+        count_VkGeneratedCommandsInfoNV(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkGeneratedCommandsInfoNV*)(local_pGeneratedCommandsInfo), countPtr);
     }
     uint32_t packetSize_vkCmdPreprocessGeneratedCommandsNV = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdPreprocessGeneratedCommandsNV -= 8;
@@ -32194,7 +32085,7 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkGeneratedCommandsInfoNV(stream, (VkGeneratedCommandsInfoNV*)(local_pGeneratedCommandsInfo), streamPtrPtr);
+    reservedmarshal_VkGeneratedCommandsInfoNV(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkGeneratedCommandsInfoNV*)(local_pGeneratedCommandsInfo), streamPtrPtr);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -32224,7 +32115,7 @@
     if (pGeneratedCommandsInfo)
     {
         local_pGeneratedCommandsInfo = (VkGeneratedCommandsInfoNV*)pool->alloc(sizeof(const VkGeneratedCommandsInfoNV));
-        deepcopy_VkGeneratedCommandsInfoNV(pool, pGeneratedCommandsInfo, (VkGeneratedCommandsInfoNV*)(local_pGeneratedCommandsInfo));
+        deepcopy_VkGeneratedCommandsInfoNV(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pGeneratedCommandsInfo, (VkGeneratedCommandsInfoNV*)(local_pGeneratedCommandsInfo));
     }
     if (local_pGeneratedCommandsInfo)
     {
@@ -32236,7 +32127,7 @@
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
         *countPtr += sizeof(VkBool32);
-        count_VkGeneratedCommandsInfoNV(sFeatureBits, (VkGeneratedCommandsInfoNV*)(local_pGeneratedCommandsInfo), countPtr);
+        count_VkGeneratedCommandsInfoNV(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkGeneratedCommandsInfoNV*)(local_pGeneratedCommandsInfo), countPtr);
     }
     uint32_t packetSize_vkCmdExecuteGeneratedCommandsNV = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdExecuteGeneratedCommandsNV -= 8;
@@ -32254,7 +32145,7 @@
     }
     memcpy(*streamPtrPtr, (VkBool32*)&local_isPreprocessed, sizeof(VkBool32));
     *streamPtrPtr += sizeof(VkBool32);
-    reservedmarshal_VkGeneratedCommandsInfoNV(stream, (VkGeneratedCommandsInfoNV*)(local_pGeneratedCommandsInfo), streamPtrPtr);
+    reservedmarshal_VkGeneratedCommandsInfoNV(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkGeneratedCommandsInfoNV*)(local_pGeneratedCommandsInfo), streamPtrPtr);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -32345,13 +32236,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkIndirectCommandsLayoutCreateInfoNV*)pool->alloc(sizeof(const VkIndirectCommandsLayoutCreateInfoNV));
-        deepcopy_VkIndirectCommandsLayoutCreateInfoNV(pool, pCreateInfo, (VkIndirectCommandsLayoutCreateInfoNV*)(local_pCreateInfo));
+        deepcopy_VkIndirectCommandsLayoutCreateInfoNV(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkIndirectCommandsLayoutCreateInfoNV*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -32367,12 +32258,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkIndirectCommandsLayoutCreateInfoNV(sFeatureBits, (VkIndirectCommandsLayoutCreateInfoNV*)(local_pCreateInfo), countPtr);
+        count_VkIndirectCommandsLayoutCreateInfoNV(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkIndirectCommandsLayoutCreateInfoNV*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -32389,7 +32280,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkIndirectCommandsLayoutCreateInfoNV(stream, (VkIndirectCommandsLayoutCreateInfoNV*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkIndirectCommandsLayoutCreateInfoNV(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkIndirectCommandsLayoutCreateInfoNV*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -32397,7 +32288,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -32442,7 +32333,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -32460,7 +32351,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyIndirectCommandsLayoutNV = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -32486,7 +32377,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkIndirectCommandsLayoutNV((VkIndirectCommandsLayoutNV*)&indirectCommandsLayout);
     stream->flush();
@@ -32533,13 +32424,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkPrivateDataSlotCreateInfoEXT*)pool->alloc(sizeof(const VkPrivateDataSlotCreateInfoEXT));
-        deepcopy_VkPrivateDataSlotCreateInfoEXT(pool, pCreateInfo, (VkPrivateDataSlotCreateInfoEXT*)(local_pCreateInfo));
+        deepcopy_VkPrivateDataSlotCreateInfoEXT(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkPrivateDataSlotCreateInfoEXT*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -32555,12 +32446,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkPrivateDataSlotCreateInfoEXT(sFeatureBits, (VkPrivateDataSlotCreateInfoEXT*)(local_pCreateInfo), countPtr);
+        count_VkPrivateDataSlotCreateInfoEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPrivateDataSlotCreateInfoEXT*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         *countPtr += 8;
     }
@@ -32576,7 +32467,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPrivateDataSlotCreateInfoEXT(stream, (VkPrivateDataSlotCreateInfoEXT*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkPrivateDataSlotCreateInfoEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPrivateDataSlotCreateInfoEXT*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -32584,7 +32475,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     uint64_t cgen_var_2 = (uint64_t)(*pPrivateDataSlot);
     memcpy((*streamPtrPtr), &cgen_var_2, 8);
@@ -32623,7 +32514,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -32640,7 +32531,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyPrivateDataSlotEXT = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -32666,7 +32557,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     stream->flush();
     ++encodeCount;;
@@ -32898,13 +32789,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkDirectFBSurfaceCreateInfoEXT*)pool->alloc(sizeof(const VkDirectFBSurfaceCreateInfoEXT));
-        deepcopy_VkDirectFBSurfaceCreateInfoEXT(pool, pCreateInfo, (VkDirectFBSurfaceCreateInfoEXT*)(local_pCreateInfo));
+        deepcopy_VkDirectFBSurfaceCreateInfoEXT(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkDirectFBSurfaceCreateInfoEXT*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -32920,12 +32811,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkDirectFBSurfaceCreateInfoEXT(sFeatureBits, (VkDirectFBSurfaceCreateInfoEXT*)(local_pCreateInfo), countPtr);
+        count_VkDirectFBSurfaceCreateInfoEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDirectFBSurfaceCreateInfoEXT*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -32942,7 +32833,7 @@
     *&cgen_var_0 = get_host_u64_VkInstance((*&local_instance));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDirectFBSurfaceCreateInfoEXT(stream, (VkDirectFBSurfaceCreateInfoEXT*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkDirectFBSurfaceCreateInfoEXT(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDirectFBSurfaceCreateInfoEXT*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -32950,7 +32841,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -33027,6 +32918,118 @@
 
 #endif
 #ifdef VK_GOOGLE_gfxstream
+VkResult VkEncoder::vkRegisterImageColorBufferGOOGLE(
+    VkDevice device,
+    VkImage image,
+    uint32_t colorBuffer,
+    uint32_t doLock)
+{
+    (void)doLock;
+    bool queueSubmitWithCommandsEnabled = sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
+    if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
+    auto stream = mImpl->stream();
+    auto pool = mImpl->pool();
+    VkDevice local_device;
+    VkImage local_image;
+    uint32_t local_colorBuffer;
+    local_device = device;
+    local_image = image;
+    local_colorBuffer = colorBuffer;
+    size_t count = 0;
+    size_t* countPtr = &count;
+    {
+        uint64_t cgen_var_0;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+    }
+    uint32_t packetSize_vkRegisterImageColorBufferGOOGLE = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkRegisterImageColorBufferGOOGLE);
+    uint8_t** streamPtrPtr = &streamPtr;
+    uint32_t opcode_vkRegisterImageColorBufferGOOGLE = OP_vkRegisterImageColorBufferGOOGLE;
+    uint32_t seqno; if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
+    memcpy(streamPtr, &opcode_vkRegisterImageColorBufferGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkRegisterImageColorBufferGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    if (queueSubmitWithCommandsEnabled) { memcpy(streamPtr, &seqno, sizeof(uint32_t)); streamPtr += sizeof(uint32_t); }
+    uint64_t cgen_var_0;
+    *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1;
+    *&cgen_var_1 = get_host_u64_VkImage((*&local_image));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_colorBuffer, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    VkResult vkRegisterImageColorBufferGOOGLE_VkResult_return = (VkResult)0;
+    stream->read(&vkRegisterImageColorBufferGOOGLE_VkResult_return, sizeof(VkResult));
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
+    return vkRegisterImageColorBufferGOOGLE_VkResult_return;
+}
+
+VkResult VkEncoder::vkRegisterBufferColorBufferGOOGLE(
+    VkDevice device,
+    VkBuffer buffer,
+    uint32_t colorBuffer,
+    uint32_t doLock)
+{
+    (void)doLock;
+    bool queueSubmitWithCommandsEnabled = sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
+    if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
+    auto stream = mImpl->stream();
+    auto pool = mImpl->pool();
+    VkDevice local_device;
+    VkBuffer local_buffer;
+    uint32_t local_colorBuffer;
+    local_device = device;
+    local_buffer = buffer;
+    local_colorBuffer = colorBuffer;
+    size_t count = 0;
+    size_t* countPtr = &count;
+    {
+        uint64_t cgen_var_0;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+    }
+    uint32_t packetSize_vkRegisterBufferColorBufferGOOGLE = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkRegisterBufferColorBufferGOOGLE);
+    uint8_t** streamPtrPtr = &streamPtr;
+    uint32_t opcode_vkRegisterBufferColorBufferGOOGLE = OP_vkRegisterBufferColorBufferGOOGLE;
+    uint32_t seqno; if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
+    memcpy(streamPtr, &opcode_vkRegisterBufferColorBufferGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkRegisterBufferColorBufferGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    if (queueSubmitWithCommandsEnabled) { memcpy(streamPtr, &seqno, sizeof(uint32_t)); streamPtr += sizeof(uint32_t); }
+    uint64_t cgen_var_0;
+    *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1;
+    *&cgen_var_1 = get_host_u64_VkBuffer((*&local_buffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_colorBuffer, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    VkResult vkRegisterBufferColorBufferGOOGLE_VkResult_return = (VkResult)0;
+    stream->read(&vkRegisterBufferColorBufferGOOGLE_VkResult_return, sizeof(VkResult));
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
+    return vkRegisterBufferColorBufferGOOGLE_VkResult_return;
+}
+
 VkResult VkEncoder::vkMapMemoryIntoAddressSpaceGOOGLE(
     VkDevice device,
     VkDeviceMemory memory,
@@ -33158,7 +33161,7 @@
         local_pImageInfos = (VkDescriptorImageInfo*)pool->alloc(((imageInfoCount)) * sizeof(const VkDescriptorImageInfo));
         for (uint32_t i = 0; i < (uint32_t)((imageInfoCount)); ++i)
         {
-            deepcopy_VkDescriptorImageInfo(pool, pImageInfos + i, (VkDescriptorImageInfo*)(local_pImageInfos + i));
+            deepcopy_VkDescriptorImageInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pImageInfos + i, (VkDescriptorImageInfo*)(local_pImageInfos + i));
         }
     }
     local_pBufferInfos = nullptr;
@@ -33167,7 +33170,7 @@
         local_pBufferInfos = (VkDescriptorBufferInfo*)pool->alloc(((bufferInfoCount)) * sizeof(const VkDescriptorBufferInfo));
         for (uint32_t i = 0; i < (uint32_t)((bufferInfoCount)); ++i)
         {
-            deepcopy_VkDescriptorBufferInfo(pool, pBufferInfos + i, (VkDescriptorBufferInfo*)(local_pBufferInfos + i));
+            deepcopy_VkDescriptorBufferInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBufferInfos + i, (VkDescriptorBufferInfo*)(local_pBufferInfos + i));
         }
     }
     // Avoiding deepcopy for pBufferViews
@@ -33222,7 +33225,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)((imageInfoCount)); ++i)
             {
-                count_VkDescriptorImageInfo(sFeatureBits, (VkDescriptorImageInfo*)(local_pImageInfos + i), countPtr);
+                count_VkDescriptorImageInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorImageInfo*)(local_pImageInfos + i), countPtr);
             }
         }
         // WARNING PTR CHECK
@@ -33231,7 +33234,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)((bufferInfoCount)); ++i)
             {
-                count_VkDescriptorBufferInfo(sFeatureBits, (VkDescriptorBufferInfo*)(local_pBufferInfos + i), countPtr);
+                count_VkDescriptorBufferInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorBufferInfo*)(local_pBufferInfos + i), countPtr);
             }
         }
         // WARNING PTR CHECK
@@ -33309,7 +33312,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)((imageInfoCount)); ++i)
         {
-            reservedmarshal_VkDescriptorImageInfo(stream, (VkDescriptorImageInfo*)(local_pImageInfos + i), streamPtrPtr);
+            reservedmarshal_VkDescriptorImageInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorImageInfo*)(local_pImageInfos + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -33321,7 +33324,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)((bufferInfoCount)); ++i)
         {
-            reservedmarshal_VkDescriptorBufferInfo(stream, (VkDescriptorBufferInfo*)(local_pBufferInfos + i), streamPtrPtr);
+            reservedmarshal_VkDescriptorBufferInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorBufferInfo*)(local_pBufferInfos + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
@@ -33369,7 +33372,7 @@
     if (pBeginInfo)
     {
         local_pBeginInfo = (VkCommandBufferBeginInfo*)pool->alloc(sizeof(const VkCommandBufferBeginInfo));
-        deepcopy_VkCommandBufferBeginInfo(pool, pBeginInfo, (VkCommandBufferBeginInfo*)(local_pBeginInfo));
+        deepcopy_VkCommandBufferBeginInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBeginInfo, (VkCommandBufferBeginInfo*)(local_pBeginInfo));
     }
     if (local_pBeginInfo)
     {
@@ -33380,7 +33383,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkCommandBufferBeginInfo(sFeatureBits, (VkCommandBufferBeginInfo*)(local_pBeginInfo), countPtr);
+        count_VkCommandBufferBeginInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCommandBufferBeginInfo*)(local_pBeginInfo), countPtr);
     }
     uint32_t packetSize_vkBeginCommandBufferAsyncGOOGLE = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkBeginCommandBufferAsyncGOOGLE -= 8;
@@ -33396,7 +33399,7 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkCommandBufferBeginInfo(stream, (VkCommandBufferBeginInfo*)(local_pBeginInfo), streamPtrPtr);
+    reservedmarshal_VkCommandBufferBeginInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCommandBufferBeginInfo*)(local_pBeginInfo), streamPtrPtr);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -33566,13 +33569,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkImageCreateInfo*)pool->alloc(sizeof(const VkImageCreateInfo));
-        deepcopy_VkImageCreateInfo(pool, pCreateInfo, (VkImageCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkImageCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkImageCreateInfo*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     sResourceTracker->unwrap_VkNativeBufferANDROID(pCreateInfo, local_pCreateInfo);
     local_pAllocator = nullptr;
@@ -33589,16 +33592,16 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkImageCreateInfo(sFeatureBits, (VkImageCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkImageCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
-        count_VkMemoryRequirements(sFeatureBits, (VkMemoryRequirements*)(pMemoryRequirements), countPtr);
+        count_VkMemoryRequirements(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements*)(pMemoryRequirements), countPtr);
     }
     uint32_t packetSize_vkCreateImageWithRequirementsGOOGLE = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateImageWithRequirementsGOOGLE);
@@ -33612,7 +33615,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkImageCreateInfo(stream, (VkImageCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkImageCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -33620,7 +33623,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -33628,13 +33631,13 @@
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
     *streamPtrPtr += 8;
     /* is handle, possibly out */;
-    reservedmarshal_VkMemoryRequirements(stream, (VkMemoryRequirements*)(pMemoryRequirements), streamPtrPtr);
+    reservedmarshal_VkMemoryRequirements(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements*)(pMemoryRequirements), streamPtrPtr);
     stream->setHandleMapping(sResourceTracker->createMapping());
     uint64_t cgen_var_3;
     stream->read((uint64_t*)&cgen_var_3, 8);
     stream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_3, (VkImage*)pImage, 1);
     stream->unsetHandleMapping();
-    unmarshal_VkMemoryRequirements(stream, (VkMemoryRequirements*)(pMemoryRequirements));
+    unmarshal_VkMemoryRequirements(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements*)(pMemoryRequirements));
     if (pMemoryRequirements)
     {
         transform_fromhost_VkMemoryRequirements(sResourceTracker, (VkMemoryRequirements*)(pMemoryRequirements));
@@ -33672,13 +33675,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkBufferCreateInfo*)pool->alloc(sizeof(const VkBufferCreateInfo));
-        deepcopy_VkBufferCreateInfo(pool, pCreateInfo, (VkBufferCreateInfo*)(local_pCreateInfo));
+        deepcopy_VkBufferCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkBufferCreateInfo*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -33694,16 +33697,16 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkBufferCreateInfo(sFeatureBits, (VkBufferCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkBufferCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
-        count_VkMemoryRequirements(sFeatureBits, (VkMemoryRequirements*)(pMemoryRequirements), countPtr);
+        count_VkMemoryRequirements(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements*)(pMemoryRequirements), countPtr);
     }
     uint32_t packetSize_vkCreateBufferWithRequirementsGOOGLE = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateBufferWithRequirementsGOOGLE);
@@ -33717,7 +33720,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkBufferCreateInfo(stream, (VkBufferCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkBufferCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -33725,7 +33728,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -33733,13 +33736,13 @@
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
     *streamPtrPtr += 8;
     /* is handle, possibly out */;
-    reservedmarshal_VkMemoryRequirements(stream, (VkMemoryRequirements*)(pMemoryRequirements), streamPtrPtr);
+    reservedmarshal_VkMemoryRequirements(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements*)(pMemoryRequirements), streamPtrPtr);
     stream->setHandleMapping(sResourceTracker->createMapping());
     uint64_t cgen_var_3;
     stream->read((uint64_t*)&cgen_var_3, 8);
     stream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_3, (VkBuffer*)pBuffer, 1);
     stream->unsetHandleMapping();
-    unmarshal_VkMemoryRequirements(stream, (VkMemoryRequirements*)(pMemoryRequirements));
+    unmarshal_VkMemoryRequirements(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements*)(pMemoryRequirements));
     if (pMemoryRequirements)
     {
         transform_fromhost_VkMemoryRequirements(sResourceTracker, (VkMemoryRequirements*)(pMemoryRequirements));
@@ -33911,7 +33914,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     sResourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)&local_memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
@@ -33926,7 +33929,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkFreeMemorySyncGOOGLE = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -33952,7 +33955,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     VkResult vkFreeMemorySyncGOOGLE_VkResult_return = (VkResult)0;
     stream->read(&vkFreeMemorySyncGOOGLE_VkResult_return, sizeof(VkResult));
@@ -34042,7 +34045,7 @@
         local_pSubmits = (VkSubmitInfo*)pool->alloc(((submitCount)) * sizeof(const VkSubmitInfo));
         for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i)
         {
-            deepcopy_VkSubmitInfo(pool, pSubmits + i, (VkSubmitInfo*)(local_pSubmits + i));
+            deepcopy_VkSubmitInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubmits + i, (VkSubmitInfo*)(local_pSubmits + i));
         }
     }
     local_fence = fence;
@@ -34061,7 +34064,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i)
         {
-            count_VkSubmitInfo(sFeatureBits, (VkSubmitInfo*)(local_pSubmits + i), countPtr);
+            count_VkSubmitInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubmitInfo*)(local_pSubmits + i), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 1 * 8;
@@ -34082,7 +34085,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i)
     {
-        reservedmarshal_VkSubmitInfo(stream, (VkSubmitInfo*)(local_pSubmits + i), streamPtrPtr);
+        reservedmarshal_VkSubmitInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubmitInfo*)(local_pSubmits + i), streamPtrPtr);
     }
     uint64_t cgen_var_1;
     *&cgen_var_1 = get_host_u64_VkFence((*&local_fence));
@@ -34161,7 +34164,7 @@
         local_pBindInfo = (VkBindSparseInfo*)pool->alloc(((bindInfoCount)) * sizeof(const VkBindSparseInfo));
         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
         {
-            deepcopy_VkBindSparseInfo(pool, pBindInfo + i, (VkBindSparseInfo*)(local_pBindInfo + i));
+            deepcopy_VkBindSparseInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBindInfo + i, (VkBindSparseInfo*)(local_pBindInfo + i));
         }
     }
     local_fence = fence;
@@ -34180,7 +34183,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
         {
-            count_VkBindSparseInfo(sFeatureBits, (VkBindSparseInfo*)(local_pBindInfo + i), countPtr);
+            count_VkBindSparseInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBindSparseInfo*)(local_pBindInfo + i), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 1 * 8;
@@ -34201,7 +34204,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
     {
-        reservedmarshal_VkBindSparseInfo(stream, (VkBindSparseInfo*)(local_pBindInfo + i), streamPtrPtr);
+        reservedmarshal_VkBindSparseInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBindSparseInfo*)(local_pBindInfo + i), streamPtrPtr);
     }
     uint64_t cgen_var_1;
     *&cgen_var_1 = get_host_u64_VkFence((*&local_fence));
@@ -34333,7 +34336,7 @@
         local_pPendingDescriptorWrites = (VkWriteDescriptorSet*)pool->alloc(((pendingDescriptorWriteCount)) * sizeof(const VkWriteDescriptorSet));
         for (uint32_t i = 0; i < (uint32_t)((pendingDescriptorWriteCount)); ++i)
         {
-            deepcopy_VkWriteDescriptorSet(pool, pPendingDescriptorWrites + i, (VkWriteDescriptorSet*)(local_pPendingDescriptorWrites + i));
+            deepcopy_VkWriteDescriptorSet(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pPendingDescriptorWrites + i, (VkWriteDescriptorSet*)(local_pPendingDescriptorWrites + i));
         }
     }
     if (local_pPendingDescriptorWrites)
@@ -34365,7 +34368,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((pendingDescriptorWriteCount)); ++i)
         {
-            count_VkWriteDescriptorSet(sFeatureBits, (VkWriteDescriptorSet*)(local_pPendingDescriptorWrites + i), countPtr);
+            count_VkWriteDescriptorSet(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkWriteDescriptorSet*)(local_pPendingDescriptorWrites + i), countPtr);
         }
     }
     uint32_t packetSize_vkQueueCommitDescriptorSetUpdatesGOOGLE = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -34416,7 +34419,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((pendingDescriptorWriteCount)); ++i)
     {
-        reservedmarshal_VkWriteDescriptorSet(stream, (VkWriteDescriptorSet*)(local_pPendingDescriptorWrites + i), streamPtrPtr);
+        reservedmarshal_VkWriteDescriptorSet(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkWriteDescriptorSet*)(local_pPendingDescriptorWrites + i), streamPtrPtr);
     }
     stream->flush();
     ++encodeCount;;
@@ -34533,13 +34536,13 @@
     if (pCreateInfo)
     {
         local_pCreateInfo = (VkAccelerationStructureCreateInfoKHR*)pool->alloc(sizeof(const VkAccelerationStructureCreateInfoKHR));
-        deepcopy_VkAccelerationStructureCreateInfoKHR(pool, pCreateInfo, (VkAccelerationStructureCreateInfoKHR*)(local_pCreateInfo));
+        deepcopy_VkAccelerationStructureCreateInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkAccelerationStructureCreateInfoKHR*)(local_pCreateInfo));
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -34555,12 +34558,12 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkAccelerationStructureCreateInfoKHR(sFeatureBits, (VkAccelerationStructureCreateInfoKHR*)(local_pCreateInfo), countPtr);
+        count_VkAccelerationStructureCreateInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureCreateInfoKHR*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         uint64_t cgen_var_1;
         *countPtr += 8;
@@ -34577,7 +34580,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkAccelerationStructureCreateInfoKHR(stream, (VkAccelerationStructureCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkAccelerationStructureCreateInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
@@ -34585,7 +34588,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     uint64_t cgen_var_2;
@@ -34630,7 +34633,7 @@
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pAllocator)
@@ -34648,7 +34651,7 @@
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
     }
     uint32_t packetSize_vkDestroyAccelerationStructureKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -34674,7 +34677,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     sResourceTracker->destroyMapping()->mapHandles_VkAccelerationStructureKHR((VkAccelerationStructureKHR*)&accelerationStructure);
     stream->flush();
@@ -34711,7 +34714,7 @@
         local_pInfos = (VkAccelerationStructureBuildGeometryInfoKHR*)pool->alloc(((infoCount)) * sizeof(const VkAccelerationStructureBuildGeometryInfoKHR));
         for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i)
         {
-            deepcopy_VkAccelerationStructureBuildGeometryInfoKHR(pool, pInfos + i, (VkAccelerationStructureBuildGeometryInfoKHR*)(local_pInfos + i));
+            deepcopy_VkAccelerationStructureBuildGeometryInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfos + i, (VkAccelerationStructureBuildGeometryInfoKHR*)(local_pInfos + i));
         }
     }
     (void)ppBuildRangeInfos;
@@ -34731,7 +34734,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i)
         {
-            count_VkAccelerationStructureBuildGeometryInfoKHR(sFeatureBits, (VkAccelerationStructureBuildGeometryInfoKHR*)(local_pInfos + i), countPtr);
+            count_VkAccelerationStructureBuildGeometryInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureBuildGeometryInfoKHR*)(local_pInfos + i), countPtr);
         }
         (void)local_ppBuildRangeInfos;
     }
@@ -34753,7 +34756,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i)
     {
-        reservedmarshal_VkAccelerationStructureBuildGeometryInfoKHR(stream, (VkAccelerationStructureBuildGeometryInfoKHR*)(local_pInfos + i), streamPtrPtr);
+        reservedmarshal_VkAccelerationStructureBuildGeometryInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureBuildGeometryInfoKHR*)(local_pInfos + i), streamPtrPtr);
     }
     (void)local_ppBuildRangeInfos;
     ++encodeCount;;
@@ -34793,7 +34796,7 @@
         local_pInfos = (VkAccelerationStructureBuildGeometryInfoKHR*)pool->alloc(((infoCount)) * sizeof(const VkAccelerationStructureBuildGeometryInfoKHR));
         for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i)
         {
-            deepcopy_VkAccelerationStructureBuildGeometryInfoKHR(pool, pInfos + i, (VkAccelerationStructureBuildGeometryInfoKHR*)(local_pInfos + i));
+            deepcopy_VkAccelerationStructureBuildGeometryInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfos + i, (VkAccelerationStructureBuildGeometryInfoKHR*)(local_pInfos + i));
         }
     }
     // Avoiding deepcopy for pIndirectDeviceAddresses
@@ -34817,7 +34820,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i)
         {
-            count_VkAccelerationStructureBuildGeometryInfoKHR(sFeatureBits, (VkAccelerationStructureBuildGeometryInfoKHR*)(local_pInfos + i), countPtr);
+            count_VkAccelerationStructureBuildGeometryInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureBuildGeometryInfoKHR*)(local_pInfos + i), countPtr);
         }
         *countPtr += ((infoCount)) * sizeof(VkDeviceAddress);
         *countPtr += ((infoCount)) * sizeof(uint32_t);
@@ -34841,7 +34844,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i)
     {
-        reservedmarshal_VkAccelerationStructureBuildGeometryInfoKHR(stream, (VkAccelerationStructureBuildGeometryInfoKHR*)(local_pInfos + i), streamPtrPtr);
+        reservedmarshal_VkAccelerationStructureBuildGeometryInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureBuildGeometryInfoKHR*)(local_pInfos + i), streamPtrPtr);
     }
     memcpy(*streamPtrPtr, (VkDeviceAddress*)local_pIndirectDeviceAddresses, ((infoCount)) * sizeof(VkDeviceAddress));
     *streamPtrPtr += ((infoCount)) * sizeof(VkDeviceAddress);
@@ -34884,7 +34887,7 @@
         local_pInfos = (VkAccelerationStructureBuildGeometryInfoKHR*)pool->alloc(((infoCount)) * sizeof(const VkAccelerationStructureBuildGeometryInfoKHR));
         for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i)
         {
-            deepcopy_VkAccelerationStructureBuildGeometryInfoKHR(pool, pInfos + i, (VkAccelerationStructureBuildGeometryInfoKHR*)(local_pInfos + i));
+            deepcopy_VkAccelerationStructureBuildGeometryInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfos + i, (VkAccelerationStructureBuildGeometryInfoKHR*)(local_pInfos + i));
         }
     }
     (void)ppBuildRangeInfos;
@@ -34905,7 +34908,7 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i)
         {
-            count_VkAccelerationStructureBuildGeometryInfoKHR(sFeatureBits, (VkAccelerationStructureBuildGeometryInfoKHR*)(local_pInfos + i), countPtr);
+            count_VkAccelerationStructureBuildGeometryInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureBuildGeometryInfoKHR*)(local_pInfos + i), countPtr);
         }
         (void)local_ppBuildRangeInfos;
     }
@@ -34929,7 +34932,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i)
     {
-        reservedmarshal_VkAccelerationStructureBuildGeometryInfoKHR(stream, (VkAccelerationStructureBuildGeometryInfoKHR*)(local_pInfos + i), streamPtrPtr);
+        reservedmarshal_VkAccelerationStructureBuildGeometryInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureBuildGeometryInfoKHR*)(local_pInfos + i), streamPtrPtr);
     }
     (void)local_ppBuildRangeInfos;
     VkResult vkBuildAccelerationStructuresKHR_VkResult_return = (VkResult)0;
@@ -34964,7 +34967,7 @@
     if (pInfo)
     {
         local_pInfo = (VkCopyAccelerationStructureInfoKHR*)pool->alloc(sizeof(const VkCopyAccelerationStructureInfoKHR));
-        deepcopy_VkCopyAccelerationStructureInfoKHR(pool, pInfo, (VkCopyAccelerationStructureInfoKHR*)(local_pInfo));
+        deepcopy_VkCopyAccelerationStructureInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo, (VkCopyAccelerationStructureInfoKHR*)(local_pInfo));
     }
     if (local_pInfo)
     {
@@ -34976,7 +34979,7 @@
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
         *countPtr += 8;
-        count_VkCopyAccelerationStructureInfoKHR(sFeatureBits, (VkCopyAccelerationStructureInfoKHR*)(local_pInfo), countPtr);
+        count_VkCopyAccelerationStructureInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyAccelerationStructureInfoKHR*)(local_pInfo), countPtr);
     }
     uint32_t packetSize_vkCopyAccelerationStructureKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkCopyAccelerationStructureKHR);
@@ -34994,7 +34997,7 @@
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
     android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
     *streamPtrPtr += 8;
-    reservedmarshal_VkCopyAccelerationStructureInfoKHR(stream, (VkCopyAccelerationStructureInfoKHR*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkCopyAccelerationStructureInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyAccelerationStructureInfoKHR*)(local_pInfo), streamPtrPtr);
     VkResult vkCopyAccelerationStructureKHR_VkResult_return = (VkResult)0;
     stream->read(&vkCopyAccelerationStructureKHR_VkResult_return, sizeof(VkResult));
     ++encodeCount;;
@@ -35027,7 +35030,7 @@
     if (pInfo)
     {
         local_pInfo = (VkCopyAccelerationStructureToMemoryInfoKHR*)pool->alloc(sizeof(const VkCopyAccelerationStructureToMemoryInfoKHR));
-        deepcopy_VkCopyAccelerationStructureToMemoryInfoKHR(pool, pInfo, (VkCopyAccelerationStructureToMemoryInfoKHR*)(local_pInfo));
+        deepcopy_VkCopyAccelerationStructureToMemoryInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo, (VkCopyAccelerationStructureToMemoryInfoKHR*)(local_pInfo));
     }
     if (local_pInfo)
     {
@@ -35039,7 +35042,7 @@
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
         *countPtr += 8;
-        count_VkCopyAccelerationStructureToMemoryInfoKHR(sFeatureBits, (VkCopyAccelerationStructureToMemoryInfoKHR*)(local_pInfo), countPtr);
+        count_VkCopyAccelerationStructureToMemoryInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyAccelerationStructureToMemoryInfoKHR*)(local_pInfo), countPtr);
     }
     uint32_t packetSize_vkCopyAccelerationStructureToMemoryKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkCopyAccelerationStructureToMemoryKHR);
@@ -35057,7 +35060,7 @@
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
     android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
     *streamPtrPtr += 8;
-    reservedmarshal_VkCopyAccelerationStructureToMemoryInfoKHR(stream, (VkCopyAccelerationStructureToMemoryInfoKHR*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkCopyAccelerationStructureToMemoryInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyAccelerationStructureToMemoryInfoKHR*)(local_pInfo), streamPtrPtr);
     VkResult vkCopyAccelerationStructureToMemoryKHR_VkResult_return = (VkResult)0;
     stream->read(&vkCopyAccelerationStructureToMemoryKHR_VkResult_return, sizeof(VkResult));
     ++encodeCount;;
@@ -35090,7 +35093,7 @@
     if (pInfo)
     {
         local_pInfo = (VkCopyMemoryToAccelerationStructureInfoKHR*)pool->alloc(sizeof(const VkCopyMemoryToAccelerationStructureInfoKHR));
-        deepcopy_VkCopyMemoryToAccelerationStructureInfoKHR(pool, pInfo, (VkCopyMemoryToAccelerationStructureInfoKHR*)(local_pInfo));
+        deepcopy_VkCopyMemoryToAccelerationStructureInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo, (VkCopyMemoryToAccelerationStructureInfoKHR*)(local_pInfo));
     }
     if (local_pInfo)
     {
@@ -35102,7 +35105,7 @@
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
         *countPtr += 8;
-        count_VkCopyMemoryToAccelerationStructureInfoKHR(sFeatureBits, (VkCopyMemoryToAccelerationStructureInfoKHR*)(local_pInfo), countPtr);
+        count_VkCopyMemoryToAccelerationStructureInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyMemoryToAccelerationStructureInfoKHR*)(local_pInfo), countPtr);
     }
     uint32_t packetSize_vkCopyMemoryToAccelerationStructureKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkCopyMemoryToAccelerationStructureKHR);
@@ -35120,7 +35123,7 @@
     memcpy((*streamPtrPtr), &cgen_var_1, 8);
     android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
     *streamPtrPtr += 8;
-    reservedmarshal_VkCopyMemoryToAccelerationStructureInfoKHR(stream, (VkCopyMemoryToAccelerationStructureInfoKHR*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkCopyMemoryToAccelerationStructureInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyMemoryToAccelerationStructureInfoKHR*)(local_pInfo), streamPtrPtr);
     VkResult vkCopyMemoryToAccelerationStructureKHR_VkResult_return = (VkResult)0;
     stream->read(&vkCopyMemoryToAccelerationStructureKHR_VkResult_return, sizeof(VkResult));
     ++encodeCount;;
@@ -35242,7 +35245,7 @@
     if (pInfo)
     {
         local_pInfo = (VkCopyAccelerationStructureInfoKHR*)pool->alloc(sizeof(const VkCopyAccelerationStructureInfoKHR));
-        deepcopy_VkCopyAccelerationStructureInfoKHR(pool, pInfo, (VkCopyAccelerationStructureInfoKHR*)(local_pInfo));
+        deepcopy_VkCopyAccelerationStructureInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo, (VkCopyAccelerationStructureInfoKHR*)(local_pInfo));
     }
     if (local_pInfo)
     {
@@ -35253,7 +35256,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkCopyAccelerationStructureInfoKHR(sFeatureBits, (VkCopyAccelerationStructureInfoKHR*)(local_pInfo), countPtr);
+        count_VkCopyAccelerationStructureInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyAccelerationStructureInfoKHR*)(local_pInfo), countPtr);
     }
     uint32_t packetSize_vkCmdCopyAccelerationStructureKHR = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdCopyAccelerationStructureKHR -= 8;
@@ -35269,7 +35272,7 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkCopyAccelerationStructureInfoKHR(stream, (VkCopyAccelerationStructureInfoKHR*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkCopyAccelerationStructureInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyAccelerationStructureInfoKHR*)(local_pInfo), streamPtrPtr);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -35296,7 +35299,7 @@
     if (pInfo)
     {
         local_pInfo = (VkCopyAccelerationStructureToMemoryInfoKHR*)pool->alloc(sizeof(const VkCopyAccelerationStructureToMemoryInfoKHR));
-        deepcopy_VkCopyAccelerationStructureToMemoryInfoKHR(pool, pInfo, (VkCopyAccelerationStructureToMemoryInfoKHR*)(local_pInfo));
+        deepcopy_VkCopyAccelerationStructureToMemoryInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo, (VkCopyAccelerationStructureToMemoryInfoKHR*)(local_pInfo));
     }
     if (local_pInfo)
     {
@@ -35307,7 +35310,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkCopyAccelerationStructureToMemoryInfoKHR(sFeatureBits, (VkCopyAccelerationStructureToMemoryInfoKHR*)(local_pInfo), countPtr);
+        count_VkCopyAccelerationStructureToMemoryInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyAccelerationStructureToMemoryInfoKHR*)(local_pInfo), countPtr);
     }
     uint32_t packetSize_vkCmdCopyAccelerationStructureToMemoryKHR = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdCopyAccelerationStructureToMemoryKHR -= 8;
@@ -35323,7 +35326,7 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkCopyAccelerationStructureToMemoryInfoKHR(stream, (VkCopyAccelerationStructureToMemoryInfoKHR*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkCopyAccelerationStructureToMemoryInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyAccelerationStructureToMemoryInfoKHR*)(local_pInfo), streamPtrPtr);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -35350,7 +35353,7 @@
     if (pInfo)
     {
         local_pInfo = (VkCopyMemoryToAccelerationStructureInfoKHR*)pool->alloc(sizeof(const VkCopyMemoryToAccelerationStructureInfoKHR));
-        deepcopy_VkCopyMemoryToAccelerationStructureInfoKHR(pool, pInfo, (VkCopyMemoryToAccelerationStructureInfoKHR*)(local_pInfo));
+        deepcopy_VkCopyMemoryToAccelerationStructureInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo, (VkCopyMemoryToAccelerationStructureInfoKHR*)(local_pInfo));
     }
     if (local_pInfo)
     {
@@ -35361,7 +35364,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkCopyMemoryToAccelerationStructureInfoKHR(sFeatureBits, (VkCopyMemoryToAccelerationStructureInfoKHR*)(local_pInfo), countPtr);
+        count_VkCopyMemoryToAccelerationStructureInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyMemoryToAccelerationStructureInfoKHR*)(local_pInfo), countPtr);
     }
     uint32_t packetSize_vkCmdCopyMemoryToAccelerationStructureKHR = 4 + 4 + count;
     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdCopyMemoryToAccelerationStructureKHR -= 8;
@@ -35377,7 +35380,7 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkCopyMemoryToAccelerationStructureInfoKHR(stream, (VkCopyMemoryToAccelerationStructureInfoKHR*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkCopyMemoryToAccelerationStructureInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyMemoryToAccelerationStructureInfoKHR*)(local_pInfo), streamPtrPtr);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -35404,7 +35407,7 @@
     if (pInfo)
     {
         local_pInfo = (VkAccelerationStructureDeviceAddressInfoKHR*)pool->alloc(sizeof(const VkAccelerationStructureDeviceAddressInfoKHR));
-        deepcopy_VkAccelerationStructureDeviceAddressInfoKHR(pool, pInfo, (VkAccelerationStructureDeviceAddressInfoKHR*)(local_pInfo));
+        deepcopy_VkAccelerationStructureDeviceAddressInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo, (VkAccelerationStructureDeviceAddressInfoKHR*)(local_pInfo));
     }
     if (local_pInfo)
     {
@@ -35415,7 +35418,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkAccelerationStructureDeviceAddressInfoKHR(sFeatureBits, (VkAccelerationStructureDeviceAddressInfoKHR*)(local_pInfo), countPtr);
+        count_VkAccelerationStructureDeviceAddressInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureDeviceAddressInfoKHR*)(local_pInfo), countPtr);
     }
     uint32_t packetSize_vkGetAccelerationStructureDeviceAddressKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetAccelerationStructureDeviceAddressKHR);
@@ -35429,7 +35432,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkAccelerationStructureDeviceAddressInfoKHR(stream, (VkAccelerationStructureDeviceAddressInfoKHR*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkAccelerationStructureDeviceAddressInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureDeviceAddressInfoKHR*)(local_pInfo), streamPtrPtr);
     VkDeviceAddress vkGetAccelerationStructureDeviceAddressKHR_VkDeviceAddress_return = (VkDeviceAddress)0;
     stream->read(&vkGetAccelerationStructureDeviceAddressKHR_VkDeviceAddress_return, sizeof(VkDeviceAddress));
     ++encodeCount;;
@@ -35545,7 +35548,7 @@
     if (pVersionInfo)
     {
         local_pVersionInfo = (VkAccelerationStructureVersionInfoKHR*)pool->alloc(sizeof(const VkAccelerationStructureVersionInfoKHR));
-        deepcopy_VkAccelerationStructureVersionInfoKHR(pool, pVersionInfo, (VkAccelerationStructureVersionInfoKHR*)(local_pVersionInfo));
+        deepcopy_VkAccelerationStructureVersionInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pVersionInfo, (VkAccelerationStructureVersionInfoKHR*)(local_pVersionInfo));
     }
     if (local_pVersionInfo)
     {
@@ -35556,7 +35559,7 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkAccelerationStructureVersionInfoKHR(sFeatureBits, (VkAccelerationStructureVersionInfoKHR*)(local_pVersionInfo), countPtr);
+        count_VkAccelerationStructureVersionInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureVersionInfoKHR*)(local_pVersionInfo), countPtr);
         *countPtr += sizeof(VkAccelerationStructureCompatibilityKHR);
     }
     uint32_t packetSize_vkGetDeviceAccelerationStructureCompatibilityKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
@@ -35571,7 +35574,7 @@
     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
     *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkAccelerationStructureVersionInfoKHR(stream, (VkAccelerationStructureVersionInfoKHR*)(local_pVersionInfo), streamPtrPtr);
+    reservedmarshal_VkAccelerationStructureVersionInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureVersionInfoKHR*)(local_pVersionInfo), streamPtrPtr);
     memcpy(*streamPtrPtr, (VkAccelerationStructureCompatibilityKHR*)pCompatibility, sizeof(VkAccelerationStructureCompatibilityKHR));
     *streamPtrPtr += sizeof(VkAccelerationStructureCompatibilityKHR);
     stream->read((VkAccelerationStructureCompatibilityKHR*)pCompatibility, sizeof(VkAccelerationStructureCompatibilityKHR));
@@ -35607,7 +35610,7 @@
     if (pBuildInfo)
     {
         local_pBuildInfo = (VkAccelerationStructureBuildGeometryInfoKHR*)pool->alloc(sizeof(const VkAccelerationStructureBuildGeometryInfoKHR));
-        deepcopy_VkAccelerationStructureBuildGeometryInfoKHR(pool, pBuildInfo, (VkAccelerationStructureBuildGeometryInfoKHR*)(local_pBuildInfo));
+        deepcopy_VkAccelerationStructureBuildGeometryInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBuildInfo, (VkAccelerationStructureBuildGeometryInfoKHR*)(local_pBuildInfo));
     }
     // Avoiding deepcopy for pMaxPrimitiveCounts
     local_pMaxPrimitiveCounts = (uint32_t*)pMaxPrimitiveCounts;
@@ -35621,9 +35624,9 @@
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
         *countPtr += sizeof(VkAccelerationStructureBuildTypeKHR);
-        count_VkAccelerationStructureBuildGeometryInfoKHR(sFeatureBits, (VkAccelerationStructureBuildGeometryInfoKHR*)(local_pBuildInfo), countPtr);
+        count_VkAccelerationStructureBuildGeometryInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureBuildGeometryInfoKHR*)(local_pBuildInfo), countPtr);
         *countPtr += pBuildInfo->geometryCount * sizeof(uint32_t);
-        count_VkAccelerationStructureBuildSizesInfoKHR(sFeatureBits, (VkAccelerationStructureBuildSizesInfoKHR*)(pSizeInfo), countPtr);
+        count_VkAccelerationStructureBuildSizesInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureBuildSizesInfoKHR*)(pSizeInfo), countPtr);
     }
     uint32_t packetSize_vkGetAccelerationStructureBuildSizesKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
     uint8_t* streamPtr = stream->reserve(packetSize_vkGetAccelerationStructureBuildSizesKHR);
@@ -35639,11 +35642,11 @@
     *streamPtrPtr += 1 * 8;
     memcpy(*streamPtrPtr, (VkAccelerationStructureBuildTypeKHR*)&local_buildType, sizeof(VkAccelerationStructureBuildTypeKHR));
     *streamPtrPtr += sizeof(VkAccelerationStructureBuildTypeKHR);
-    reservedmarshal_VkAccelerationStructureBuildGeometryInfoKHR(stream, (VkAccelerationStructureBuildGeometryInfoKHR*)(local_pBuildInfo), streamPtrPtr);
+    reservedmarshal_VkAccelerationStructureBuildGeometryInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureBuildGeometryInfoKHR*)(local_pBuildInfo), streamPtrPtr);
     memcpy(*streamPtrPtr, (uint32_t*)local_pMaxPrimitiveCounts, pBuildInfo->geometryCount * sizeof(uint32_t));
     *streamPtrPtr += pBuildInfo->geometryCount * sizeof(uint32_t);
-    reservedmarshal_VkAccelerationStructureBuildSizesInfoKHR(stream, (VkAccelerationStructureBuildSizesInfoKHR*)(pSizeInfo), streamPtrPtr);
-    unmarshal_VkAccelerationStructureBuildSizesInfoKHR(stream, (VkAccelerationStructureBuildSizesInfoKHR*)(pSizeInfo));
+    reservedmarshal_VkAccelerationStructureBuildSizesInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureBuildSizesInfoKHR*)(pSizeInfo), streamPtrPtr);
+    unmarshal_VkAccelerationStructureBuildSizesInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureBuildSizesInfoKHR*)(pSizeInfo));
     if (pSizeInfo)
     {
         transform_fromhost_VkAccelerationStructureBuildSizesInfoKHR(sResourceTracker, (VkAccelerationStructureBuildSizesInfoKHR*)(pSizeInfo));
@@ -35688,25 +35691,25 @@
     if (pRaygenShaderBindingTable)
     {
         local_pRaygenShaderBindingTable = (VkStridedDeviceAddressRegionKHR*)pool->alloc(sizeof(const VkStridedDeviceAddressRegionKHR));
-        deepcopy_VkStridedDeviceAddressRegionKHR(pool, pRaygenShaderBindingTable, (VkStridedDeviceAddressRegionKHR*)(local_pRaygenShaderBindingTable));
+        deepcopy_VkStridedDeviceAddressRegionKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRaygenShaderBindingTable, (VkStridedDeviceAddressRegionKHR*)(local_pRaygenShaderBindingTable));
     }
     local_pMissShaderBindingTable = nullptr;
     if (pMissShaderBindingTable)
     {
         local_pMissShaderBindingTable = (VkStridedDeviceAddressRegionKHR*)pool->alloc(sizeof(const VkStridedDeviceAddressRegionKHR));
-        deepcopy_VkStridedDeviceAddressRegionKHR(pool, pMissShaderBindingTable, (VkStridedDeviceAddressRegionKHR*)(local_pMissShaderBindingTable));
+        deepcopy_VkStridedDeviceAddressRegionKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pMissShaderBindingTable, (VkStridedDeviceAddressRegionKHR*)(local_pMissShaderBindingTable));
     }
     local_pHitShaderBindingTable = nullptr;
     if (pHitShaderBindingTable)
     {
         local_pHitShaderBindingTable = (VkStridedDeviceAddressRegionKHR*)pool->alloc(sizeof(const VkStridedDeviceAddressRegionKHR));
-        deepcopy_VkStridedDeviceAddressRegionKHR(pool, pHitShaderBindingTable, (VkStridedDeviceAddressRegionKHR*)(local_pHitShaderBindingTable));
+        deepcopy_VkStridedDeviceAddressRegionKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pHitShaderBindingTable, (VkStridedDeviceAddressRegionKHR*)(local_pHitShaderBindingTable));
     }
     local_pCallableShaderBindingTable = nullptr;
     if (pCallableShaderBindingTable)
     {
         local_pCallableShaderBindingTable = (VkStridedDeviceAddressRegionKHR*)pool->alloc(sizeof(const VkStridedDeviceAddressRegionKHR));
-        deepcopy_VkStridedDeviceAddressRegionKHR(pool, pCallableShaderBindingTable, (VkStridedDeviceAddressRegionKHR*)(local_pCallableShaderBindingTable));
+        deepcopy_VkStridedDeviceAddressRegionKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCallableShaderBindingTable, (VkStridedDeviceAddressRegionKHR*)(local_pCallableShaderBindingTable));
     }
     local_width = width;
     local_height = height;
@@ -35732,10 +35735,10 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkStridedDeviceAddressRegionKHR(sFeatureBits, (VkStridedDeviceAddressRegionKHR*)(local_pRaygenShaderBindingTable), countPtr);
-        count_VkStridedDeviceAddressRegionKHR(sFeatureBits, (VkStridedDeviceAddressRegionKHR*)(local_pMissShaderBindingTable), countPtr);
-        count_VkStridedDeviceAddressRegionKHR(sFeatureBits, (VkStridedDeviceAddressRegionKHR*)(local_pHitShaderBindingTable), countPtr);
-        count_VkStridedDeviceAddressRegionKHR(sFeatureBits, (VkStridedDeviceAddressRegionKHR*)(local_pCallableShaderBindingTable), countPtr);
+        count_VkStridedDeviceAddressRegionKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(local_pRaygenShaderBindingTable), countPtr);
+        count_VkStridedDeviceAddressRegionKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(local_pMissShaderBindingTable), countPtr);
+        count_VkStridedDeviceAddressRegionKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(local_pHitShaderBindingTable), countPtr);
+        count_VkStridedDeviceAddressRegionKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(local_pCallableShaderBindingTable), countPtr);
         *countPtr += sizeof(uint32_t);
         *countPtr += sizeof(uint32_t);
         *countPtr += sizeof(uint32_t);
@@ -35754,10 +35757,10 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkStridedDeviceAddressRegionKHR(stream, (VkStridedDeviceAddressRegionKHR*)(local_pRaygenShaderBindingTable), streamPtrPtr);
-    reservedmarshal_VkStridedDeviceAddressRegionKHR(stream, (VkStridedDeviceAddressRegionKHR*)(local_pMissShaderBindingTable), streamPtrPtr);
-    reservedmarshal_VkStridedDeviceAddressRegionKHR(stream, (VkStridedDeviceAddressRegionKHR*)(local_pHitShaderBindingTable), streamPtrPtr);
-    reservedmarshal_VkStridedDeviceAddressRegionKHR(stream, (VkStridedDeviceAddressRegionKHR*)(local_pCallableShaderBindingTable), streamPtrPtr);
+    reservedmarshal_VkStridedDeviceAddressRegionKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(local_pRaygenShaderBindingTable), streamPtrPtr);
+    reservedmarshal_VkStridedDeviceAddressRegionKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(local_pMissShaderBindingTable), streamPtrPtr);
+    reservedmarshal_VkStridedDeviceAddressRegionKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(local_pHitShaderBindingTable), streamPtrPtr);
+    reservedmarshal_VkStridedDeviceAddressRegionKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(local_pCallableShaderBindingTable), streamPtrPtr);
     memcpy(*streamPtrPtr, (uint32_t*)&local_width, sizeof(uint32_t));
     *streamPtrPtr += sizeof(uint32_t);
     memcpy(*streamPtrPtr, (uint32_t*)&local_height, sizeof(uint32_t));
@@ -35804,14 +35807,14 @@
         local_pCreateInfos = (VkRayTracingPipelineCreateInfoKHR*)pool->alloc(((createInfoCount)) * sizeof(const VkRayTracingPipelineCreateInfoKHR));
         for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i)
         {
-            deepcopy_VkRayTracingPipelineCreateInfoKHR(pool, pCreateInfos + i, (VkRayTracingPipelineCreateInfoKHR*)(local_pCreateInfos + i));
+            deepcopy_VkRayTracingPipelineCreateInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfos + i, (VkRayTracingPipelineCreateInfoKHR*)(local_pCreateInfos + i));
         }
     }
     local_pAllocator = nullptr;
     if (pAllocator)
     {
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
+        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
     local_pAllocator = nullptr;
     if (local_pCreateInfos)
@@ -35836,13 +35839,13 @@
         *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i)
         {
-            count_VkRayTracingPipelineCreateInfoKHR(sFeatureBits, (VkRayTracingPipelineCreateInfoKHR*)(local_pCreateInfos + i), countPtr);
+            count_VkRayTracingPipelineCreateInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRayTracingPipelineCreateInfoKHR*)(local_pCreateInfos + i), countPtr);
         }
         // WARNING PTR CHECK
         *countPtr += 8;
         if (local_pAllocator)
         {
-            count_VkAllocationCallbacks(sFeatureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
+            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         if (((createInfoCount)))
         {
@@ -35873,7 +35876,7 @@
     *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i)
     {
-        reservedmarshal_VkRayTracingPipelineCreateInfoKHR(stream, (VkRayTracingPipelineCreateInfoKHR*)(local_pCreateInfos + i), streamPtrPtr);
+        reservedmarshal_VkRayTracingPipelineCreateInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRayTracingPipelineCreateInfoKHR*)(local_pCreateInfos + i), streamPtrPtr);
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_3 = (uint64_t)(uintptr_t)local_pAllocator;
@@ -35882,7 +35885,7 @@
     *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
+        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
     /* is handle, possibly out */;
     if (((createInfoCount)))
@@ -36015,25 +36018,25 @@
     if (pRaygenShaderBindingTable)
     {
         local_pRaygenShaderBindingTable = (VkStridedDeviceAddressRegionKHR*)pool->alloc(sizeof(const VkStridedDeviceAddressRegionKHR));
-        deepcopy_VkStridedDeviceAddressRegionKHR(pool, pRaygenShaderBindingTable, (VkStridedDeviceAddressRegionKHR*)(local_pRaygenShaderBindingTable));
+        deepcopy_VkStridedDeviceAddressRegionKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRaygenShaderBindingTable, (VkStridedDeviceAddressRegionKHR*)(local_pRaygenShaderBindingTable));
     }
     local_pMissShaderBindingTable = nullptr;
     if (pMissShaderBindingTable)
     {
         local_pMissShaderBindingTable = (VkStridedDeviceAddressRegionKHR*)pool->alloc(sizeof(const VkStridedDeviceAddressRegionKHR));
-        deepcopy_VkStridedDeviceAddressRegionKHR(pool, pMissShaderBindingTable, (VkStridedDeviceAddressRegionKHR*)(local_pMissShaderBindingTable));
+        deepcopy_VkStridedDeviceAddressRegionKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pMissShaderBindingTable, (VkStridedDeviceAddressRegionKHR*)(local_pMissShaderBindingTable));
     }
     local_pHitShaderBindingTable = nullptr;
     if (pHitShaderBindingTable)
     {
         local_pHitShaderBindingTable = (VkStridedDeviceAddressRegionKHR*)pool->alloc(sizeof(const VkStridedDeviceAddressRegionKHR));
-        deepcopy_VkStridedDeviceAddressRegionKHR(pool, pHitShaderBindingTable, (VkStridedDeviceAddressRegionKHR*)(local_pHitShaderBindingTable));
+        deepcopy_VkStridedDeviceAddressRegionKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pHitShaderBindingTable, (VkStridedDeviceAddressRegionKHR*)(local_pHitShaderBindingTable));
     }
     local_pCallableShaderBindingTable = nullptr;
     if (pCallableShaderBindingTable)
     {
         local_pCallableShaderBindingTable = (VkStridedDeviceAddressRegionKHR*)pool->alloc(sizeof(const VkStridedDeviceAddressRegionKHR));
-        deepcopy_VkStridedDeviceAddressRegionKHR(pool, pCallableShaderBindingTable, (VkStridedDeviceAddressRegionKHR*)(local_pCallableShaderBindingTable));
+        deepcopy_VkStridedDeviceAddressRegionKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCallableShaderBindingTable, (VkStridedDeviceAddressRegionKHR*)(local_pCallableShaderBindingTable));
     }
     local_indirectDeviceAddress = indirectDeviceAddress;
     if (local_pRaygenShaderBindingTable)
@@ -36057,10 +36060,10 @@
     {
         uint64_t cgen_var_0;
         *countPtr += 1 * 8;
-        count_VkStridedDeviceAddressRegionKHR(sFeatureBits, (VkStridedDeviceAddressRegionKHR*)(local_pRaygenShaderBindingTable), countPtr);
-        count_VkStridedDeviceAddressRegionKHR(sFeatureBits, (VkStridedDeviceAddressRegionKHR*)(local_pMissShaderBindingTable), countPtr);
-        count_VkStridedDeviceAddressRegionKHR(sFeatureBits, (VkStridedDeviceAddressRegionKHR*)(local_pHitShaderBindingTable), countPtr);
-        count_VkStridedDeviceAddressRegionKHR(sFeatureBits, (VkStridedDeviceAddressRegionKHR*)(local_pCallableShaderBindingTable), countPtr);
+        count_VkStridedDeviceAddressRegionKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(local_pRaygenShaderBindingTable), countPtr);
+        count_VkStridedDeviceAddressRegionKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(local_pMissShaderBindingTable), countPtr);
+        count_VkStridedDeviceAddressRegionKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(local_pHitShaderBindingTable), countPtr);
+        count_VkStridedDeviceAddressRegionKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(local_pCallableShaderBindingTable), countPtr);
         *countPtr += sizeof(VkDeviceAddress);
     }
     uint32_t packetSize_vkCmdTraceRaysIndirectKHR = 4 + 4 + count;
@@ -36077,10 +36080,10 @@
         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
         *streamPtrPtr += 1 * 8;
     }
-    reservedmarshal_VkStridedDeviceAddressRegionKHR(stream, (VkStridedDeviceAddressRegionKHR*)(local_pRaygenShaderBindingTable), streamPtrPtr);
-    reservedmarshal_VkStridedDeviceAddressRegionKHR(stream, (VkStridedDeviceAddressRegionKHR*)(local_pMissShaderBindingTable), streamPtrPtr);
-    reservedmarshal_VkStridedDeviceAddressRegionKHR(stream, (VkStridedDeviceAddressRegionKHR*)(local_pHitShaderBindingTable), streamPtrPtr);
-    reservedmarshal_VkStridedDeviceAddressRegionKHR(stream, (VkStridedDeviceAddressRegionKHR*)(local_pCallableShaderBindingTable), streamPtrPtr);
+    reservedmarshal_VkStridedDeviceAddressRegionKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(local_pRaygenShaderBindingTable), streamPtrPtr);
+    reservedmarshal_VkStridedDeviceAddressRegionKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(local_pMissShaderBindingTable), streamPtrPtr);
+    reservedmarshal_VkStridedDeviceAddressRegionKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(local_pHitShaderBindingTable), streamPtrPtr);
+    reservedmarshal_VkStridedDeviceAddressRegionKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(local_pCallableShaderBindingTable), streamPtrPtr);
     memcpy(*streamPtrPtr, (VkDeviceAddress*)&local_indirectDeviceAddress, sizeof(VkDeviceAddress));
     *streamPtrPtr += sizeof(VkDeviceAddress);
     ++encodeCount;;
diff --git a/system/vulkan_enc/VkEncoder.h b/system/vulkan_enc/VkEncoder.h
index d61dbb3..160632a 100644
--- a/system/vulkan_enc/VkEncoder.h
+++ b/system/vulkan_enc/VkEncoder.h
@@ -2597,17 +2597,7 @@
         VkSurfaceKHR* pSurface,
         uint32_t doLock);
 #endif
-#ifdef VK_GOOGLE_color_buffer
-    VkResult vkRegisterImageColorBufferGOOGLE(
-    VkDevice device,
-        VkImage image,
-        uint32_t colorBuffer,
-        uint32_t doLock);
-    VkResult vkRegisterBufferColorBufferGOOGLE(
-    VkDevice device,
-        VkBuffer buffer,
-        uint32_t colorBuffer,
-        uint32_t doLock);
+#ifdef VK_EXT_fragment_density_map
 #endif
 #ifdef VK_EXT_scalar_block_layout
 #endif
@@ -2882,6 +2872,16 @@
         uint32_t doLock);
 #endif
 #ifdef VK_GOOGLE_gfxstream
+    VkResult vkRegisterImageColorBufferGOOGLE(
+    VkDevice device,
+        VkImage image,
+        uint32_t colorBuffer,
+        uint32_t doLock);
+    VkResult vkRegisterBufferColorBufferGOOGLE(
+    VkDevice device,
+        VkBuffer buffer,
+        uint32_t colorBuffer,
+        uint32_t doLock);
     VkResult vkMapMemoryIntoAddressSpaceGOOGLE(
     VkDevice device,
         VkDeviceMemory memory,
diff --git a/system/vulkan_enc/VulkanHandles.h b/system/vulkan_enc/VulkanHandles.h
index a233408..b0f4f6c 100644
--- a/system/vulkan_enc/VulkanHandles.h
+++ b/system/vulkan_enc/VulkanHandles.h
@@ -86,7 +86,6 @@
     f(VkBufferView) \
     f(VkImageView) \
     f(VkShaderModule) \
-    f(VkSampler) \
     f(VkPipeline) \
     f(VkPipelineCache) \
     f(VkPipelineLayout) \
@@ -118,6 +117,7 @@
     f(VkDescriptorSet) \
     f(VkDescriptorSetLayout) \
     f(VkCommandPool) \
+    f(VkSampler) \
     __GOLDFISH_VK_LIST_NON_DISPATCHABLE_HANDLE_TYPES_FUCHSIA(f) \
     GOLDFISH_VK_LIST_TRIVIAL_NON_DISPATCHABLE_HANDLE_TYPES(f) \
 
@@ -129,6 +129,12 @@
     GOLDFISH_VK_LIST_TRIVIAL_DISPATCHABLE_HANDLE_TYPES(f) \
     GOLDFISH_VK_LIST_TRIVIAL_NON_DISPATCHABLE_HANDLE_TYPES(f)
 
+#define GOLDFISH_VK_LIST_AUTODEFINED_STRUCT_DISPATCHABLE_HANDLE_TYPES(f) \
+    f(VkInstance) \
+    f(VkDevice) \
+    f(VkQueue) \
+    GOLDFISH_VK_LIST_TRIVIAL_DISPATCHABLE_HANDLE_TYPES(f)
+
 #define GOLDFISH_VK_LIST_AUTODEFINED_STRUCT_NON_DISPATCHABLE_HANDLE_TYPES(f) \
     f(VkDeviceMemory) \
     f(VkBuffer) \
@@ -137,6 +143,7 @@
     f(VkFence) \
     f(VkDescriptorUpdateTemplate) \
     f(VkCommandPool) \
+    f(VkSampler) \
     __GOLDFISH_VK_LIST_NON_DISPATCHABLE_HANDLE_TYPES_FUCHSIA(f) \
     GOLDFISH_VK_LIST_TRIVIAL_NON_DISPATCHABLE_HANDLE_TYPES(f) \
 
diff --git a/system/vulkan_enc/func_table.cpp b/system/vulkan_enc/func_table.cpp
index 3199d88..dc3f66d 100644
--- a/system/vulkan_enc/func_table.cpp
+++ b/system/vulkan_enc/func_table.cpp
@@ -1025,7 +1025,8 @@
     AEMU_SCOPED_TRACE("vkAllocateCommandBuffers");
     auto vkEnc = ResourceTracker::getThreadLocalEncoder();
     VkResult vkAllocateCommandBuffers_VkResult_return = (VkResult)0;
-    vkAllocateCommandBuffers_VkResult_return = vkEnc->vkAllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers, true /* do lock */);
+    auto resources = ResourceTracker::get();
+    vkAllocateCommandBuffers_VkResult_return = resources->on_vkAllocateCommandBuffers(vkEnc, VK_SUCCESS, device, pAllocateInfo, pCommandBuffers);
     if (vkAllocateCommandBuffers_VkResult_return == VK_SUCCESS) {
         ResourceTracker::get()->addToCommandPool(pAllocateInfo->commandPool, pAllocateInfo->commandBufferCount, pCommandBuffers);
     }
@@ -6435,61 +6436,7 @@
     return vkCreateMetalSurfaceEXT_VkResult_return;
 }
 #endif
-#ifdef VK_GOOGLE_color_buffer
-static VkResult entry_vkRegisterImageColorBufferGOOGLE(
-    VkDevice device,
-    VkImage image,
-    uint32_t colorBuffer)
-{
-    AEMU_SCOPED_TRACE("vkRegisterImageColorBufferGOOGLE");
-    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
-    VkResult vkRegisterImageColorBufferGOOGLE_VkResult_return = (VkResult)0;
-    vkRegisterImageColorBufferGOOGLE_VkResult_return = vkEnc->vkRegisterImageColorBufferGOOGLE(device, image, colorBuffer, true /* do lock */);
-    return vkRegisterImageColorBufferGOOGLE_VkResult_return;
-}
-static VkResult dynCheck_entry_vkRegisterImageColorBufferGOOGLE(
-    VkDevice device,
-    VkImage image,
-    uint32_t colorBuffer)
-{
-    auto resources = ResourceTracker::get();
-    if (!resources->hasDeviceExtension(device, "VK_GOOGLE_color_buffer"))
-    {
-        sOnInvalidDynamicallyCheckedCall("vkRegisterImageColorBufferGOOGLE", "VK_GOOGLE_color_buffer");
-    }
-    AEMU_SCOPED_TRACE("vkRegisterImageColorBufferGOOGLE");
-    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
-    VkResult vkRegisterImageColorBufferGOOGLE_VkResult_return = (VkResult)0;
-    vkRegisterImageColorBufferGOOGLE_VkResult_return = vkEnc->vkRegisterImageColorBufferGOOGLE(device, image, colorBuffer, true /* do lock */);
-    return vkRegisterImageColorBufferGOOGLE_VkResult_return;
-}
-static VkResult entry_vkRegisterBufferColorBufferGOOGLE(
-    VkDevice device,
-    VkBuffer buffer,
-    uint32_t colorBuffer)
-{
-    AEMU_SCOPED_TRACE("vkRegisterBufferColorBufferGOOGLE");
-    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
-    VkResult vkRegisterBufferColorBufferGOOGLE_VkResult_return = (VkResult)0;
-    vkRegisterBufferColorBufferGOOGLE_VkResult_return = vkEnc->vkRegisterBufferColorBufferGOOGLE(device, buffer, colorBuffer, true /* do lock */);
-    return vkRegisterBufferColorBufferGOOGLE_VkResult_return;
-}
-static VkResult dynCheck_entry_vkRegisterBufferColorBufferGOOGLE(
-    VkDevice device,
-    VkBuffer buffer,
-    uint32_t colorBuffer)
-{
-    auto resources = ResourceTracker::get();
-    if (!resources->hasDeviceExtension(device, "VK_GOOGLE_color_buffer"))
-    {
-        sOnInvalidDynamicallyCheckedCall("vkRegisterBufferColorBufferGOOGLE", "VK_GOOGLE_color_buffer");
-    }
-    AEMU_SCOPED_TRACE("vkRegisterBufferColorBufferGOOGLE");
-    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
-    VkResult vkRegisterBufferColorBufferGOOGLE_VkResult_return = (VkResult)0;
-    vkRegisterBufferColorBufferGOOGLE_VkResult_return = vkEnc->vkRegisterBufferColorBufferGOOGLE(device, buffer, colorBuffer, true /* do lock */);
-    return vkRegisterBufferColorBufferGOOGLE_VkResult_return;
-}
+#ifdef VK_EXT_fragment_density_map
 #endif
 #ifdef VK_EXT_scalar_block_layout
 #endif
@@ -7122,6 +7069,60 @@
 }
 #endif
 #ifdef VK_GOOGLE_gfxstream
+static VkResult entry_vkRegisterImageColorBufferGOOGLE(
+    VkDevice device,
+    VkImage image,
+    uint32_t colorBuffer)
+{
+    AEMU_SCOPED_TRACE("vkRegisterImageColorBufferGOOGLE");
+    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
+    VkResult vkRegisterImageColorBufferGOOGLE_VkResult_return = (VkResult)0;
+    vkRegisterImageColorBufferGOOGLE_VkResult_return = vkEnc->vkRegisterImageColorBufferGOOGLE(device, image, colorBuffer, true /* do lock */);
+    return vkRegisterImageColorBufferGOOGLE_VkResult_return;
+}
+static VkResult dynCheck_entry_vkRegisterImageColorBufferGOOGLE(
+    VkDevice device,
+    VkImage image,
+    uint32_t colorBuffer)
+{
+    auto resources = ResourceTracker::get();
+    if (!resources->hasDeviceExtension(device, "VK_GOOGLE_gfxstream"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkRegisterImageColorBufferGOOGLE", "VK_GOOGLE_gfxstream");
+    }
+    AEMU_SCOPED_TRACE("vkRegisterImageColorBufferGOOGLE");
+    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
+    VkResult vkRegisterImageColorBufferGOOGLE_VkResult_return = (VkResult)0;
+    vkRegisterImageColorBufferGOOGLE_VkResult_return = vkEnc->vkRegisterImageColorBufferGOOGLE(device, image, colorBuffer, true /* do lock */);
+    return vkRegisterImageColorBufferGOOGLE_VkResult_return;
+}
+static VkResult entry_vkRegisterBufferColorBufferGOOGLE(
+    VkDevice device,
+    VkBuffer buffer,
+    uint32_t colorBuffer)
+{
+    AEMU_SCOPED_TRACE("vkRegisterBufferColorBufferGOOGLE");
+    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
+    VkResult vkRegisterBufferColorBufferGOOGLE_VkResult_return = (VkResult)0;
+    vkRegisterBufferColorBufferGOOGLE_VkResult_return = vkEnc->vkRegisterBufferColorBufferGOOGLE(device, buffer, colorBuffer, true /* do lock */);
+    return vkRegisterBufferColorBufferGOOGLE_VkResult_return;
+}
+static VkResult dynCheck_entry_vkRegisterBufferColorBufferGOOGLE(
+    VkDevice device,
+    VkBuffer buffer,
+    uint32_t colorBuffer)
+{
+    auto resources = ResourceTracker::get();
+    if (!resources->hasDeviceExtension(device, "VK_GOOGLE_gfxstream"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkRegisterBufferColorBufferGOOGLE", "VK_GOOGLE_gfxstream");
+    }
+    AEMU_SCOPED_TRACE("vkRegisterBufferColorBufferGOOGLE");
+    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
+    VkResult vkRegisterBufferColorBufferGOOGLE_VkResult_return = (VkResult)0;
+    vkRegisterBufferColorBufferGOOGLE_VkResult_return = vkEnc->vkRegisterBufferColorBufferGOOGLE(device, buffer, colorBuffer, true /* do lock */);
+    return vkRegisterBufferColorBufferGOOGLE_VkResult_return;
+}
 static VkResult entry_vkMapMemoryIntoAddressSpaceGOOGLE(
     VkDevice device,
     VkDeviceMemory memory,
@@ -9672,16 +9673,6 @@
         return nullptr;
     }
 #endif
-#ifdef VK_GOOGLE_color_buffer
-    if (!strcmp(name, "vkRegisterImageColorBufferGOOGLE"))
-    {
-        return nullptr;
-    }
-    if (!strcmp(name, "vkRegisterBufferColorBufferGOOGLE"))
-    {
-        return nullptr;
-    }
-#endif
 #ifdef VK_EXT_buffer_device_address
     if (!strcmp(name, "vkGetBufferDeviceAddressEXT"))
     {
@@ -9853,6 +9844,14 @@
     }
 #endif
 #ifdef VK_GOOGLE_gfxstream
+    if (!strcmp(name, "vkRegisterImageColorBufferGOOGLE"))
+    {
+        return nullptr;
+    }
+    if (!strcmp(name, "vkRegisterBufferColorBufferGOOGLE"))
+    {
+        return nullptr;
+    }
     if (!strcmp(name, "vkMapMemoryIntoAddressSpaceGOOGLE"))
     {
         return nullptr;
@@ -11899,16 +11898,6 @@
         return hasExt ? (void*)entry_vkCreateMetalSurfaceEXT : nullptr;
     }
 #endif
-#ifdef VK_GOOGLE_color_buffer
-    if (!strcmp(name, "vkRegisterImageColorBufferGOOGLE"))
-    {
-        return (void*)dynCheck_entry_vkRegisterImageColorBufferGOOGLE;
-    }
-    if (!strcmp(name, "vkRegisterBufferColorBufferGOOGLE"))
-    {
-        return (void*)dynCheck_entry_vkRegisterBufferColorBufferGOOGLE;
-    }
-#endif
 #ifdef VK_EXT_buffer_device_address
     if (!strcmp(name, "vkGetBufferDeviceAddressEXT"))
     {
@@ -12104,6 +12093,14 @@
     }
 #endif
 #ifdef VK_GOOGLE_gfxstream
+    if (!strcmp(name, "vkRegisterImageColorBufferGOOGLE"))
+    {
+        return (void*)dynCheck_entry_vkRegisterImageColorBufferGOOGLE;
+    }
+    if (!strcmp(name, "vkRegisterBufferColorBufferGOOGLE"))
+    {
+        return (void*)dynCheck_entry_vkRegisterBufferColorBufferGOOGLE;
+    }
     if (!strcmp(name, "vkMapMemoryIntoAddressSpaceGOOGLE"))
     {
         return (void*)dynCheck_entry_vkMapMemoryIntoAddressSpaceGOOGLE;
@@ -14269,18 +14266,6 @@
         return hasExt ? (void*)entry_vkCreateMetalSurfaceEXT : nullptr;
     }
 #endif
-#ifdef VK_GOOGLE_color_buffer
-    if (!strcmp(name, "vkRegisterImageColorBufferGOOGLE"))
-    {
-        bool hasExt = resources->hasDeviceExtension(device, "VK_GOOGLE_color_buffer");
-        return hasExt ? (void*)entry_vkRegisterImageColorBufferGOOGLE : nullptr;
-    }
-    if (!strcmp(name, "vkRegisterBufferColorBufferGOOGLE"))
-    {
-        bool hasExt = resources->hasDeviceExtension(device, "VK_GOOGLE_color_buffer");
-        return hasExt ? (void*)entry_vkRegisterBufferColorBufferGOOGLE : nullptr;
-    }
-#endif
 #ifdef VK_EXT_buffer_device_address
     if (!strcmp(name, "vkGetBufferDeviceAddressEXT"))
     {
@@ -14488,6 +14473,16 @@
     }
 #endif
 #ifdef VK_GOOGLE_gfxstream
+    if (!strcmp(name, "vkRegisterImageColorBufferGOOGLE"))
+    {
+        bool hasExt = resources->hasDeviceExtension(device, "VK_GOOGLE_gfxstream");
+        return hasExt ? (void*)entry_vkRegisterImageColorBufferGOOGLE : nullptr;
+    }
+    if (!strcmp(name, "vkRegisterBufferColorBufferGOOGLE"))
+    {
+        bool hasExt = resources->hasDeviceExtension(device, "VK_GOOGLE_gfxstream");
+        return hasExt ? (void*)entry_vkRegisterBufferColorBufferGOOGLE : nullptr;
+    }
     if (!strcmp(name, "vkMapMemoryIntoAddressSpaceGOOGLE"))
     {
         bool hasExt = resources->hasDeviceExtension(device, "VK_GOOGLE_gfxstream");
diff --git a/system/vulkan_enc/func_table.h b/system/vulkan_enc/func_table.h
index 39f2e02..3c12410 100644
--- a/system/vulkan_enc/func_table.h
+++ b/system/vulkan_enc/func_table.h
@@ -388,7 +388,7 @@
 #endif
 #ifdef VK_EXT_metal_surface
 #endif
-#ifdef VK_GOOGLE_color_buffer
+#ifdef VK_EXT_fragment_density_map
 #endif
 #ifdef VK_EXT_scalar_block_layout
 #endif
diff --git a/system/vulkan_enc/goldfish_vk_counting_guest.cpp b/system/vulkan_enc/goldfish_vk_counting_guest.cpp
index cc187cc..4e42832 100644
--- a/system/vulkan_enc/goldfish_vk_counting_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_counting_guest.cpp
@@ -33,16 +33,19 @@
 
 void count_extension_struct(
     uint32_t featureBits,
+    VkStructureType rootType,
     const void* structExtension,
     size_t* count);
 
 #ifdef VK_VERSION_1_0
 void count_VkExtent2D(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExtent2D* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -51,10 +54,12 @@
 
 void count_VkExtent3D(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExtent3D* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -64,10 +69,12 @@
 
 void count_VkOffset2D(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkOffset2D* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(int32_t);
@@ -76,10 +83,12 @@
 
 void count_VkOffset3D(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkOffset3D* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(int32_t);
@@ -89,50 +98,70 @@
 
 void count_VkRect2D(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRect2D* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
-    count_VkOffset2D(featureBits, (VkOffset2D*)(&toCount->offset), count);
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->extent), count);
+    count_VkOffset2D(featureBits, rootType, (VkOffset2D*)(&toCount->offset), count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->extent), count);
 }
 
 void count_VkBaseInStructure(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBaseInStructure* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
 }
 
 void count_VkBaseOutStructure(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBaseOutStructure* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
 }
 
 void count_VkBufferMemoryBarrier(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBufferMemoryBarrier* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkAccessFlags);
     *count += sizeof(VkAccessFlags);
     *count += sizeof(uint32_t);
@@ -145,10 +174,12 @@
 
 void count_VkDispatchIndirectCommand(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDispatchIndirectCommand* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -158,10 +189,12 @@
 
 void count_VkDrawIndexedIndirectCommand(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDrawIndexedIndirectCommand* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -173,10 +206,12 @@
 
 void count_VkDrawIndirectCommand(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDrawIndirectCommand* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -187,10 +222,12 @@
 
 void count_VkImageSubresourceRange(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageSubresourceRange* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkImageAspectFlags);
@@ -202,14 +239,20 @@
 
 void count_VkImageMemoryBarrier(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageMemoryBarrier* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkAccessFlags);
     *count += sizeof(VkAccessFlags);
     *count += sizeof(VkImageLayout);
@@ -218,29 +261,37 @@
     *count += sizeof(uint32_t);
     uint64_t cgen_var_0;
     *count += 1 * 8;
-    count_VkImageSubresourceRange(featureBits, (VkImageSubresourceRange*)(&toCount->subresourceRange), count);
+    count_VkImageSubresourceRange(featureBits, rootType, (VkImageSubresourceRange*)(&toCount->subresourceRange), count);
 }
 
 void count_VkMemoryBarrier(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryBarrier* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkAccessFlags);
     *count += sizeof(VkAccessFlags);
 }
 
 void count_VkAllocationCallbacks(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAllocationCallbacks* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     // WARNING PTR CHECK
@@ -258,14 +309,20 @@
 
 void count_VkApplicationInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkApplicationInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     if (featureBits & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
     {
         // WARNING PTR CHECK
@@ -299,10 +356,12 @@
 
 void count_VkFormatProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkFormatProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkFormatFeatureFlags);
@@ -312,13 +371,15 @@
 
 void count_VkImageFormatProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageFormatProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
-    count_VkExtent3D(featureBits, (VkExtent3D*)(&toCount->maxExtent), count);
+    count_VkExtent3D(featureBits, rootType, (VkExtent3D*)(&toCount->maxExtent), count);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
     *count += sizeof(VkSampleCountFlags);
@@ -327,20 +388,26 @@
 
 void count_VkInstanceCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkInstanceCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkInstanceCreateFlags);
     // WARNING PTR CHECK
     *count += 8;
     if (toCount->pApplicationInfo)
     {
-        count_VkApplicationInfo(featureBits, (const VkApplicationInfo*)(toCount->pApplicationInfo), count);
+        count_VkApplicationInfo(featureBits, rootType, (const VkApplicationInfo*)(toCount->pApplicationInfo), count);
     }
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
@@ -366,10 +433,12 @@
 
 void count_VkMemoryHeap(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryHeap* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkDeviceSize);
@@ -378,10 +447,12 @@
 
 void count_VkMemoryType(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryType* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkMemoryPropertyFlags);
@@ -390,10 +461,12 @@
 
 void count_VkPhysicalDeviceFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceFeatures* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkBool32);
@@ -455,10 +528,12 @@
 
 void count_VkPhysicalDeviceLimits(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceLimits* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -571,30 +646,34 @@
 
 void count_VkPhysicalDeviceMemoryProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_TYPES; ++i)
     {
-        count_VkMemoryType(featureBits, (VkMemoryType*)(toCount->memoryTypes + i), count);
+        count_VkMemoryType(featureBits, rootType, (VkMemoryType*)(toCount->memoryTypes + i), count);
     }
     *count += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_HEAPS; ++i)
     {
-        count_VkMemoryHeap(featureBits, (VkMemoryHeap*)(toCount->memoryHeaps + i), count);
+        count_VkMemoryHeap(featureBits, rootType, (VkMemoryHeap*)(toCount->memoryHeaps + i), count);
     }
 }
 
 void count_VkPhysicalDeviceSparseProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceSparseProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkBool32);
@@ -606,10 +685,12 @@
 
 void count_VkPhysicalDeviceProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -619,34 +700,42 @@
     *count += sizeof(VkPhysicalDeviceType);
     *count += VK_MAX_PHYSICAL_DEVICE_NAME_SIZE * sizeof(char);
     *count += VK_UUID_SIZE * sizeof(uint8_t);
-    count_VkPhysicalDeviceLimits(featureBits, (VkPhysicalDeviceLimits*)(&toCount->limits), count);
-    count_VkPhysicalDeviceSparseProperties(featureBits, (VkPhysicalDeviceSparseProperties*)(&toCount->sparseProperties), count);
+    count_VkPhysicalDeviceLimits(featureBits, rootType, (VkPhysicalDeviceLimits*)(&toCount->limits), count);
+    count_VkPhysicalDeviceSparseProperties(featureBits, rootType, (VkPhysicalDeviceSparseProperties*)(&toCount->sparseProperties), count);
 }
 
 void count_VkQueueFamilyProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkQueueFamilyProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkQueueFlags);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
-    count_VkExtent3D(featureBits, (VkExtent3D*)(&toCount->minImageTransferGranularity), count);
+    count_VkExtent3D(featureBits, rootType, (VkExtent3D*)(&toCount->minImageTransferGranularity), count);
 }
 
 void count_VkDeviceQueueCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceQueueCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDeviceQueueCreateFlags);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
@@ -658,21 +747,27 @@
 
 void count_VkDeviceCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDeviceCreateFlags);
     *count += sizeof(uint32_t);
     if (toCount)
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->queueCreateInfoCount; ++i)
         {
-            count_VkDeviceQueueCreateInfo(featureBits, (const VkDeviceQueueCreateInfo*)(toCount->pQueueCreateInfos + i), count);
+            count_VkDeviceQueueCreateInfo(featureBits, rootType, (const VkDeviceQueueCreateInfo*)(toCount->pQueueCreateInfos + i), count);
         }
     }
     *count += sizeof(uint32_t);
@@ -699,16 +794,18 @@
     *count += 8;
     if (toCount->pEnabledFeatures)
     {
-        count_VkPhysicalDeviceFeatures(featureBits, (const VkPhysicalDeviceFeatures*)(toCount->pEnabledFeatures), count);
+        count_VkPhysicalDeviceFeatures(featureBits, rootType, (const VkPhysicalDeviceFeatures*)(toCount->pEnabledFeatures), count);
     }
 }
 
 void count_VkExtensionProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExtensionProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += VK_MAX_EXTENSION_NAME_SIZE * sizeof(char);
@@ -717,10 +814,12 @@
 
 void count_VkLayerProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkLayerProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += VK_MAX_EXTENSION_NAME_SIZE * sizeof(char);
@@ -731,14 +830,20 @@
 
 void count_VkSubmitInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSubmitInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     if (toCount->waitSemaphoreCount)
     {
@@ -762,14 +867,20 @@
 
 void count_VkMappedMemoryRange(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMappedMemoryRange* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(VkDeviceSize);
@@ -778,24 +889,32 @@
 
 void count_VkMemoryAllocateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryAllocateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDeviceSize);
     *count += sizeof(uint32_t);
 }
 
 void count_VkMemoryRequirements(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryRequirements* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkDeviceSize);
@@ -805,10 +924,12 @@
 
 void count_VkSparseMemoryBind(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSparseMemoryBind* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkDeviceSize);
@@ -821,10 +942,12 @@
 
 void count_VkSparseBufferMemoryBindInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSparseBufferMemoryBindInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     uint64_t cgen_var_0;
@@ -834,17 +957,19 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->bindCount; ++i)
         {
-            count_VkSparseMemoryBind(featureBits, (const VkSparseMemoryBind*)(toCount->pBinds + i), count);
+            count_VkSparseMemoryBind(featureBits, rootType, (const VkSparseMemoryBind*)(toCount->pBinds + i), count);
         }
     }
 }
 
 void count_VkSparseImageOpaqueMemoryBindInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSparseImageOpaqueMemoryBindInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     uint64_t cgen_var_0;
@@ -854,17 +979,19 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->bindCount; ++i)
         {
-            count_VkSparseMemoryBind(featureBits, (const VkSparseMemoryBind*)(toCount->pBinds + i), count);
+            count_VkSparseMemoryBind(featureBits, rootType, (const VkSparseMemoryBind*)(toCount->pBinds + i), count);
         }
     }
 }
 
 void count_VkImageSubresource(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageSubresource* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkImageAspectFlags);
@@ -874,15 +1001,17 @@
 
 void count_VkSparseImageMemoryBind(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSparseImageMemoryBind* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
-    count_VkImageSubresource(featureBits, (VkImageSubresource*)(&toCount->subresource), count);
-    count_VkOffset3D(featureBits, (VkOffset3D*)(&toCount->offset), count);
-    count_VkExtent3D(featureBits, (VkExtent3D*)(&toCount->extent), count);
+    count_VkImageSubresource(featureBits, rootType, (VkImageSubresource*)(&toCount->subresource), count);
+    count_VkOffset3D(featureBits, rootType, (VkOffset3D*)(&toCount->offset), count);
+    count_VkExtent3D(featureBits, rootType, (VkExtent3D*)(&toCount->extent), count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(VkDeviceSize);
@@ -891,10 +1020,12 @@
 
 void count_VkSparseImageMemoryBindInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSparseImageMemoryBindInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     uint64_t cgen_var_0;
@@ -904,21 +1035,27 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->bindCount; ++i)
         {
-            count_VkSparseImageMemoryBind(featureBits, (const VkSparseImageMemoryBind*)(toCount->pBinds + i), count);
+            count_VkSparseImageMemoryBind(featureBits, rootType, (const VkSparseImageMemoryBind*)(toCount->pBinds + i), count);
         }
     }
 }
 
 void count_VkBindSparseInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBindSparseInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     if (toCount->waitSemaphoreCount)
     {
@@ -929,7 +1066,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->bufferBindCount; ++i)
         {
-            count_VkSparseBufferMemoryBindInfo(featureBits, (const VkSparseBufferMemoryBindInfo*)(toCount->pBufferBinds + i), count);
+            count_VkSparseBufferMemoryBindInfo(featureBits, rootType, (const VkSparseBufferMemoryBindInfo*)(toCount->pBufferBinds + i), count);
         }
     }
     *count += sizeof(uint32_t);
@@ -937,7 +1074,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->imageOpaqueBindCount; ++i)
         {
-            count_VkSparseImageOpaqueMemoryBindInfo(featureBits, (const VkSparseImageOpaqueMemoryBindInfo*)(toCount->pImageOpaqueBinds + i), count);
+            count_VkSparseImageOpaqueMemoryBindInfo(featureBits, rootType, (const VkSparseImageOpaqueMemoryBindInfo*)(toCount->pImageOpaqueBinds + i), count);
         }
     }
     *count += sizeof(uint32_t);
@@ -945,7 +1082,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->imageBindCount; ++i)
         {
-            count_VkSparseImageMemoryBindInfo(featureBits, (const VkSparseImageMemoryBindInfo*)(toCount->pImageBinds + i), count);
+            count_VkSparseImageMemoryBindInfo(featureBits, rootType, (const VkSparseImageMemoryBindInfo*)(toCount->pImageBinds + i), count);
         }
     }
     *count += sizeof(uint32_t);
@@ -957,26 +1094,30 @@
 
 void count_VkSparseImageFormatProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSparseImageFormatProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkImageAspectFlags);
-    count_VkExtent3D(featureBits, (VkExtent3D*)(&toCount->imageGranularity), count);
+    count_VkExtent3D(featureBits, rootType, (VkExtent3D*)(&toCount->imageGranularity), count);
     *count += sizeof(VkSparseImageFormatFlags);
 }
 
 void count_VkSparseImageMemoryRequirements(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSparseImageMemoryRequirements* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
-    count_VkSparseImageFormatProperties(featureBits, (VkSparseImageFormatProperties*)(&toCount->formatProperties), count);
+    count_VkSparseImageFormatProperties(featureBits, rootType, (VkSparseImageFormatProperties*)(&toCount->formatProperties), count);
     *count += sizeof(uint32_t);
     *count += sizeof(VkDeviceSize);
     *count += sizeof(VkDeviceSize);
@@ -985,53 +1126,77 @@
 
 void count_VkFenceCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkFenceCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkFenceCreateFlags);
 }
 
 void count_VkSemaphoreCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSemaphoreCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkSemaphoreCreateFlags);
 }
 
 void count_VkEventCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkEventCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkEventCreateFlags);
 }
 
 void count_VkQueryPoolCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkQueryPoolCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkQueryPoolCreateFlags);
     *count += sizeof(VkQueryType);
     *count += sizeof(uint32_t);
@@ -1040,14 +1205,20 @@
 
 void count_VkBufferCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBufferCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBufferCreateFlags);
     *count += sizeof(VkDeviceSize);
     *count += sizeof(VkBufferUsageFlags);
@@ -1066,14 +1237,20 @@
 
 void count_VkBufferViewCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBufferViewCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBufferViewCreateFlags);
     uint64_t cgen_var_0;
     *count += 1 * 8;
@@ -1084,18 +1261,24 @@
 
 void count_VkImageCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkImageCreateFlags);
     *count += sizeof(VkImageType);
     *count += sizeof(VkFormat);
-    count_VkExtent3D(featureBits, (VkExtent3D*)(&toCount->extent), count);
+    count_VkExtent3D(featureBits, rootType, (VkExtent3D*)(&toCount->extent), count);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
     *count += sizeof(VkSampleCountFlagBits);
@@ -1117,10 +1300,12 @@
 
 void count_VkSubresourceLayout(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSubresourceLayout* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkDeviceSize);
@@ -1132,10 +1317,12 @@
 
 void count_VkComponentMapping(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkComponentMapping* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkComponentSwizzle);
@@ -1146,33 +1333,45 @@
 
 void count_VkImageViewCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageViewCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkImageViewCreateFlags);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(VkImageViewType);
     *count += sizeof(VkFormat);
-    count_VkComponentMapping(featureBits, (VkComponentMapping*)(&toCount->components), count);
-    count_VkImageSubresourceRange(featureBits, (VkImageSubresourceRange*)(&toCount->subresourceRange), count);
+    count_VkComponentMapping(featureBits, rootType, (VkComponentMapping*)(&toCount->components), count);
+    count_VkImageSubresourceRange(featureBits, rootType, (VkImageSubresourceRange*)(&toCount->subresourceRange), count);
 }
 
 void count_VkShaderModuleCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkShaderModuleCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkShaderModuleCreateFlags);
     *count += 8;
     if (toCount)
@@ -1183,14 +1382,20 @@
 
 void count_VkPipelineCacheCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineCacheCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineCacheCreateFlags);
     *count += 8;
     if (toCount)
@@ -1201,10 +1406,12 @@
 
 void count_VkSpecializationMapEntry(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSpecializationMapEntry* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -1214,10 +1421,12 @@
 
 void count_VkSpecializationInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSpecializationInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -1225,7 +1434,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->mapEntryCount; ++i)
         {
-            count_VkSpecializationMapEntry(featureBits, (const VkSpecializationMapEntry*)(toCount->pMapEntries + i), count);
+            count_VkSpecializationMapEntry(featureBits, rootType, (const VkSpecializationMapEntry*)(toCount->pMapEntries + i), count);
         }
     }
     *count += 8;
@@ -1237,14 +1446,20 @@
 
 void count_VkPipelineShaderStageCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineShaderStageCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineShaderStageCreateFlags);
     *count += sizeof(VkShaderStageFlagBits);
     uint64_t cgen_var_0;
@@ -1254,22 +1469,28 @@
     *count += 8;
     if (toCount->pSpecializationInfo)
     {
-        count_VkSpecializationInfo(featureBits, (const VkSpecializationInfo*)(toCount->pSpecializationInfo), count);
+        count_VkSpecializationInfo(featureBits, rootType, (const VkSpecializationInfo*)(toCount->pSpecializationInfo), count);
     }
 }
 
 void count_VkComputePipelineCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkComputePipelineCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineCreateFlags);
-    count_VkPipelineShaderStageCreateInfo(featureBits, (VkPipelineShaderStageCreateInfo*)(&toCount->stage), count);
+    count_VkPipelineShaderStageCreateInfo(featureBits, rootType, (VkPipelineShaderStageCreateInfo*)(&toCount->stage), count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     uint64_t cgen_var_1;
@@ -1279,10 +1500,12 @@
 
 void count_VkVertexInputBindingDescription(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkVertexInputBindingDescription* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -1292,10 +1515,12 @@
 
 void count_VkVertexInputAttributeDescription(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkVertexInputAttributeDescription* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -1306,21 +1531,27 @@
 
 void count_VkPipelineVertexInputStateCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineVertexInputStateCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineVertexInputStateCreateFlags);
     *count += sizeof(uint32_t);
     if (toCount)
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->vertexBindingDescriptionCount; ++i)
         {
-            count_VkVertexInputBindingDescription(featureBits, (const VkVertexInputBindingDescription*)(toCount->pVertexBindingDescriptions + i), count);
+            count_VkVertexInputBindingDescription(featureBits, rootType, (const VkVertexInputBindingDescription*)(toCount->pVertexBindingDescriptions + i), count);
         }
     }
     *count += sizeof(uint32_t);
@@ -1328,21 +1559,27 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->vertexAttributeDescriptionCount; ++i)
         {
-            count_VkVertexInputAttributeDescription(featureBits, (const VkVertexInputAttributeDescription*)(toCount->pVertexAttributeDescriptions + i), count);
+            count_VkVertexInputAttributeDescription(featureBits, rootType, (const VkVertexInputAttributeDescription*)(toCount->pVertexAttributeDescriptions + i), count);
         }
     }
 }
 
 void count_VkPipelineInputAssemblyStateCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineInputAssemblyStateCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineInputAssemblyStateCreateFlags);
     *count += sizeof(VkPrimitiveTopology);
     *count += sizeof(VkBool32);
@@ -1350,24 +1587,32 @@
 
 void count_VkPipelineTessellationStateCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineTessellationStateCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineTessellationStateCreateFlags);
     *count += sizeof(uint32_t);
 }
 
 void count_VkViewport(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkViewport* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(float);
@@ -1380,14 +1625,20 @@
 
 void count_VkPipelineViewportStateCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineViewportStateCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineViewportStateCreateFlags);
     *count += sizeof(uint32_t);
     // WARNING PTR CHECK
@@ -1398,7 +1649,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)toCount->viewportCount; ++i)
             {
-                count_VkViewport(featureBits, (const VkViewport*)(toCount->pViewports + i), count);
+                count_VkViewport(featureBits, rootType, (const VkViewport*)(toCount->pViewports + i), count);
             }
         }
     }
@@ -1411,7 +1662,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)toCount->scissorCount; ++i)
             {
-                count_VkRect2D(featureBits, (const VkRect2D*)(toCount->pScissors + i), count);
+                count_VkRect2D(featureBits, rootType, (const VkRect2D*)(toCount->pScissors + i), count);
             }
         }
     }
@@ -1419,14 +1670,20 @@
 
 void count_VkPipelineRasterizationStateCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineRasterizationStateCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineRasterizationStateCreateFlags);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
@@ -1442,14 +1699,20 @@
 
 void count_VkPipelineMultisampleStateCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineMultisampleStateCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineMultisampleStateCreateFlags);
     *count += sizeof(VkSampleCountFlagBits);
     *count += sizeof(VkBool32);
@@ -1469,10 +1732,12 @@
 
 void count_VkStencilOpState(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkStencilOpState* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStencilOp);
@@ -1486,32 +1751,40 @@
 
 void count_VkPipelineDepthStencilStateCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineDepthStencilStateCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineDepthStencilStateCreateFlags);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
     *count += sizeof(VkCompareOp);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
-    count_VkStencilOpState(featureBits, (VkStencilOpState*)(&toCount->front), count);
-    count_VkStencilOpState(featureBits, (VkStencilOpState*)(&toCount->back), count);
+    count_VkStencilOpState(featureBits, rootType, (VkStencilOpState*)(&toCount->front), count);
+    count_VkStencilOpState(featureBits, rootType, (VkStencilOpState*)(&toCount->back), count);
     *count += sizeof(float);
     *count += sizeof(float);
 }
 
 void count_VkPipelineColorBlendAttachmentState(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineColorBlendAttachmentState* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkBool32);
@@ -1526,14 +1799,20 @@
 
 void count_VkPipelineColorBlendStateCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineColorBlendStateCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineColorBlendStateCreateFlags);
     *count += sizeof(VkBool32);
     *count += sizeof(VkLogicOp);
@@ -1542,7 +1821,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->attachmentCount; ++i)
         {
-            count_VkPipelineColorBlendAttachmentState(featureBits, (const VkPipelineColorBlendAttachmentState*)(toCount->pAttachments + i), count);
+            count_VkPipelineColorBlendAttachmentState(featureBits, rootType, (const VkPipelineColorBlendAttachmentState*)(toCount->pAttachments + i), count);
         }
     }
     *count += 4 * sizeof(float);
@@ -1550,14 +1829,20 @@
 
 void count_VkPipelineDynamicStateCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineDynamicStateCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineDynamicStateCreateFlags);
     *count += sizeof(uint32_t);
     if (toCount)
@@ -1568,10 +1853,12 @@
 
 void count_VkGraphicsPipelineCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkGraphicsPipelineCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     uint32_t hasRasterization = 1;
@@ -1587,14 +1874,18 @@
         *count += 4;
     }
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineCreateFlags);
     *count += sizeof(uint32_t);
     if (toCount)
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->stageCount; ++i)
         {
-            count_VkPipelineShaderStageCreateInfo(featureBits, (const VkPipelineShaderStageCreateInfo*)(toCount->pStages + i), count);
+            count_VkPipelineShaderStageCreateInfo(featureBits, rootType, (const VkPipelineShaderStageCreateInfo*)(toCount->pStages + i), count);
         }
     }
     // WARNING PTR CHECK
@@ -1604,7 +1895,7 @@
     }
     if ((!(featureBits & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || toCount->pVertexInputState))
     {
-        count_VkPipelineVertexInputStateCreateInfo(featureBits, (const VkPipelineVertexInputStateCreateInfo*)(toCount->pVertexInputState), count);
+        count_VkPipelineVertexInputStateCreateInfo(featureBits, rootType, (const VkPipelineVertexInputStateCreateInfo*)(toCount->pVertexInputState), count);
     }
     // WARNING PTR CHECK
     if (featureBits & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
@@ -1613,7 +1904,7 @@
     }
     if ((!(featureBits & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || toCount->pInputAssemblyState))
     {
-        count_VkPipelineInputAssemblyStateCreateInfo(featureBits, (const VkPipelineInputAssemblyStateCreateInfo*)(toCount->pInputAssemblyState), count);
+        count_VkPipelineInputAssemblyStateCreateInfo(featureBits, rootType, (const VkPipelineInputAssemblyStateCreateInfo*)(toCount->pInputAssemblyState), count);
     }
     // WARNING PTR CHECK
     *count += 8;
@@ -1621,7 +1912,7 @@
     {
         if (hasTessellation)
         {
-            count_VkPipelineTessellationStateCreateInfo(featureBits, (const VkPipelineTessellationStateCreateInfo*)(toCount->pTessellationState), count);
+            count_VkPipelineTessellationStateCreateInfo(featureBits, rootType, (const VkPipelineTessellationStateCreateInfo*)(toCount->pTessellationState), count);
         }
     }
     // WARNING PTR CHECK
@@ -1630,7 +1921,7 @@
     {
         if (hasRasterization)
         {
-            count_VkPipelineViewportStateCreateInfo(featureBits, (const VkPipelineViewportStateCreateInfo*)(toCount->pViewportState), count);
+            count_VkPipelineViewportStateCreateInfo(featureBits, rootType, (const VkPipelineViewportStateCreateInfo*)(toCount->pViewportState), count);
         }
     }
     // WARNING PTR CHECK
@@ -1640,7 +1931,7 @@
     }
     if ((!(featureBits & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || toCount->pRasterizationState))
     {
-        count_VkPipelineRasterizationStateCreateInfo(featureBits, (const VkPipelineRasterizationStateCreateInfo*)(toCount->pRasterizationState), count);
+        count_VkPipelineRasterizationStateCreateInfo(featureBits, rootType, (const VkPipelineRasterizationStateCreateInfo*)(toCount->pRasterizationState), count);
     }
     // WARNING PTR CHECK
     *count += 8;
@@ -1648,7 +1939,7 @@
     {
         if (hasRasterization)
         {
-            count_VkPipelineMultisampleStateCreateInfo(featureBits, (const VkPipelineMultisampleStateCreateInfo*)(toCount->pMultisampleState), count);
+            count_VkPipelineMultisampleStateCreateInfo(featureBits, rootType, (const VkPipelineMultisampleStateCreateInfo*)(toCount->pMultisampleState), count);
         }
     }
     // WARNING PTR CHECK
@@ -1657,7 +1948,7 @@
     {
         if (hasRasterization)
         {
-            count_VkPipelineDepthStencilStateCreateInfo(featureBits, (const VkPipelineDepthStencilStateCreateInfo*)(toCount->pDepthStencilState), count);
+            count_VkPipelineDepthStencilStateCreateInfo(featureBits, rootType, (const VkPipelineDepthStencilStateCreateInfo*)(toCount->pDepthStencilState), count);
         }
     }
     // WARNING PTR CHECK
@@ -1666,14 +1957,14 @@
     {
         if (hasRasterization)
         {
-            count_VkPipelineColorBlendStateCreateInfo(featureBits, (const VkPipelineColorBlendStateCreateInfo*)(toCount->pColorBlendState), count);
+            count_VkPipelineColorBlendStateCreateInfo(featureBits, rootType, (const VkPipelineColorBlendStateCreateInfo*)(toCount->pColorBlendState), count);
         }
     }
     // WARNING PTR CHECK
     *count += 8;
     if (toCount->pDynamicState)
     {
-        count_VkPipelineDynamicStateCreateInfo(featureBits, (const VkPipelineDynamicStateCreateInfo*)(toCount->pDynamicState), count);
+        count_VkPipelineDynamicStateCreateInfo(featureBits, rootType, (const VkPipelineDynamicStateCreateInfo*)(toCount->pDynamicState), count);
     }
     uint64_t cgen_var_0;
     *count += 1 * 8;
@@ -1687,10 +1978,12 @@
 
 void count_VkPushConstantRange(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPushConstantRange* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkShaderStageFlags);
@@ -1700,14 +1993,20 @@
 
 void count_VkPipelineLayoutCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineLayoutCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineLayoutCreateFlags);
     *count += sizeof(uint32_t);
     if (toCount->setLayoutCount)
@@ -1719,21 +2018,27 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->pushConstantRangeCount; ++i)
         {
-            count_VkPushConstantRange(featureBits, (const VkPushConstantRange*)(toCount->pPushConstantRanges + i), count);
+            count_VkPushConstantRange(featureBits, rootType, (const VkPushConstantRange*)(toCount->pPushConstantRanges + i), count);
         }
     }
 }
 
 void count_VkSamplerCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSamplerCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkSamplerCreateFlags);
     *count += sizeof(VkFilter);
     *count += sizeof(VkFilter);
@@ -1754,14 +2059,20 @@
 
 void count_VkCopyDescriptorSet(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCopyDescriptorSet* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(uint32_t);
@@ -1775,10 +2086,12 @@
 
 void count_VkDescriptorBufferInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorBufferInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     uint64_t cgen_var_0;
@@ -1789,10 +2102,12 @@
 
 void count_VkDescriptorImageInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorImageInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     uint64_t cgen_var_0;
@@ -1804,10 +2119,12 @@
 
 void count_VkDescriptorPoolSize(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorPoolSize* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkDescriptorType);
@@ -1816,14 +2133,20 @@
 
 void count_VkDescriptorPoolCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorPoolCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDescriptorPoolCreateFlags);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
@@ -1831,21 +2154,27 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->poolSizeCount; ++i)
         {
-            count_VkDescriptorPoolSize(featureBits, (const VkDescriptorPoolSize*)(toCount->pPoolSizes + i), count);
+            count_VkDescriptorPoolSize(featureBits, rootType, (const VkDescriptorPoolSize*)(toCount->pPoolSizes + i), count);
         }
     }
 }
 
 void count_VkDescriptorSetAllocateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorSetAllocateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(uint32_t);
@@ -1857,10 +2186,12 @@
 
 void count_VkDescriptorSetLayoutBinding(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutBinding* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -1880,35 +2211,47 @@
 
 void count_VkDescriptorSetLayoutCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDescriptorSetLayoutCreateFlags);
     *count += sizeof(uint32_t);
     if (toCount)
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->bindingCount; ++i)
         {
-            count_VkDescriptorSetLayoutBinding(featureBits, (const VkDescriptorSetLayoutBinding*)(toCount->pBindings + i), count);
+            count_VkDescriptorSetLayoutBinding(featureBits, rootType, (const VkDescriptorSetLayoutBinding*)(toCount->pBindings + i), count);
         }
     }
 }
 
 void count_VkWriteDescriptorSet(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkWriteDescriptorSet* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(uint32_t);
@@ -1925,7 +2268,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)toCount->descriptorCount; ++i)
                 {
-                    count_VkDescriptorImageInfo(featureBits, (const VkDescriptorImageInfo*)(toCount->pImageInfo + i), count);
+                    count_VkDescriptorImageInfo(featureBits, rootType, (const VkDescriptorImageInfo*)(toCount->pImageInfo + i), count);
                 }
             }
         }
@@ -1940,7 +2283,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)toCount->descriptorCount; ++i)
                 {
-                    count_VkDescriptorBufferInfo(featureBits, (const VkDescriptorBufferInfo*)(toCount->pBufferInfo + i), count);
+                    count_VkDescriptorBufferInfo(featureBits, rootType, (const VkDescriptorBufferInfo*)(toCount->pBufferInfo + i), count);
                 }
             }
         }
@@ -1961,10 +2304,12 @@
 
 void count_VkAttachmentDescription(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAttachmentDescription* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkAttachmentDescriptionFlags);
@@ -1980,10 +2325,12 @@
 
 void count_VkAttachmentReference(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAttachmentReference* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -1992,14 +2339,20 @@
 
 void count_VkFramebufferCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkFramebufferCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkFramebufferCreateFlags);
     uint64_t cgen_var_0;
     *count += 1 * 8;
@@ -2015,10 +2368,12 @@
 
 void count_VkSubpassDescription(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSubpassDescription* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkSubpassDescriptionFlags);
@@ -2028,7 +2383,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->inputAttachmentCount; ++i)
         {
-            count_VkAttachmentReference(featureBits, (const VkAttachmentReference*)(toCount->pInputAttachments + i), count);
+            count_VkAttachmentReference(featureBits, rootType, (const VkAttachmentReference*)(toCount->pInputAttachments + i), count);
         }
     }
     *count += sizeof(uint32_t);
@@ -2036,7 +2391,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->colorAttachmentCount; ++i)
         {
-            count_VkAttachmentReference(featureBits, (const VkAttachmentReference*)(toCount->pColorAttachments + i), count);
+            count_VkAttachmentReference(featureBits, rootType, (const VkAttachmentReference*)(toCount->pColorAttachments + i), count);
         }
     }
     // WARNING PTR CHECK
@@ -2047,7 +2402,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)toCount->colorAttachmentCount; ++i)
             {
-                count_VkAttachmentReference(featureBits, (const VkAttachmentReference*)(toCount->pResolveAttachments + i), count);
+                count_VkAttachmentReference(featureBits, rootType, (const VkAttachmentReference*)(toCount->pResolveAttachments + i), count);
             }
         }
     }
@@ -2055,7 +2410,7 @@
     *count += 8;
     if (toCount->pDepthStencilAttachment)
     {
-        count_VkAttachmentReference(featureBits, (const VkAttachmentReference*)(toCount->pDepthStencilAttachment), count);
+        count_VkAttachmentReference(featureBits, rootType, (const VkAttachmentReference*)(toCount->pDepthStencilAttachment), count);
     }
     *count += sizeof(uint32_t);
     if (toCount)
@@ -2066,10 +2421,12 @@
 
 void count_VkSubpassDependency(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSubpassDependency* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -2083,21 +2440,27 @@
 
 void count_VkRenderPassCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRenderPassCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkRenderPassCreateFlags);
     *count += sizeof(uint32_t);
     if (toCount)
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->attachmentCount; ++i)
         {
-            count_VkAttachmentDescription(featureBits, (const VkAttachmentDescription*)(toCount->pAttachments + i), count);
+            count_VkAttachmentDescription(featureBits, rootType, (const VkAttachmentDescription*)(toCount->pAttachments + i), count);
         }
     }
     *count += sizeof(uint32_t);
@@ -2105,7 +2468,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->subpassCount; ++i)
         {
-            count_VkSubpassDescription(featureBits, (const VkSubpassDescription*)(toCount->pSubpasses + i), count);
+            count_VkSubpassDescription(featureBits, rootType, (const VkSubpassDescription*)(toCount->pSubpasses + i), count);
         }
     }
     *count += sizeof(uint32_t);
@@ -2113,35 +2476,47 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->dependencyCount; ++i)
         {
-            count_VkSubpassDependency(featureBits, (const VkSubpassDependency*)(toCount->pDependencies + i), count);
+            count_VkSubpassDependency(featureBits, rootType, (const VkSubpassDependency*)(toCount->pDependencies + i), count);
         }
     }
 }
 
 void count_VkCommandPoolCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCommandPoolCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkCommandPoolCreateFlags);
     *count += sizeof(uint32_t);
 }
 
 void count_VkCommandBufferAllocateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCommandBufferAllocateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(VkCommandBufferLevel);
@@ -2150,14 +2525,20 @@
 
 void count_VkCommandBufferInheritanceInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCommandBufferInheritanceInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(uint32_t);
@@ -2170,29 +2551,37 @@
 
 void count_VkCommandBufferBeginInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCommandBufferBeginInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkCommandBufferUsageFlags);
     // WARNING PTR CHECK
     *count += 8;
     if (toCount->pInheritanceInfo)
     {
-        count_VkCommandBufferInheritanceInfo(featureBits, (const VkCommandBufferInheritanceInfo*)(toCount->pInheritanceInfo), count);
+        count_VkCommandBufferInheritanceInfo(featureBits, rootType, (const VkCommandBufferInheritanceInfo*)(toCount->pInheritanceInfo), count);
     }
 }
 
 void count_VkBufferCopy(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBufferCopy* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkDeviceSize);
@@ -2202,10 +2591,12 @@
 
 void count_VkImageSubresourceLayers(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageSubresourceLayers* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkImageAspectFlags);
@@ -2216,26 +2607,30 @@
 
 void count_VkBufferImageCopy(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBufferImageCopy* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkDeviceSize);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
-    count_VkImageSubresourceLayers(featureBits, (VkImageSubresourceLayers*)(&toCount->imageSubresource), count);
-    count_VkOffset3D(featureBits, (VkOffset3D*)(&toCount->imageOffset), count);
-    count_VkExtent3D(featureBits, (VkExtent3D*)(&toCount->imageExtent), count);
+    count_VkImageSubresourceLayers(featureBits, rootType, (VkImageSubresourceLayers*)(&toCount->imageSubresource), count);
+    count_VkOffset3D(featureBits, rootType, (VkOffset3D*)(&toCount->imageOffset), count);
+    count_VkExtent3D(featureBits, rootType, (VkExtent3D*)(&toCount->imageExtent), count);
 }
 
 void count_VkClearColorValue(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkClearColorValue* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += 4 * sizeof(float);
@@ -2243,10 +2638,12 @@
 
 void count_VkClearDepthStencilValue(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkClearDepthStencilValue* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(float);
@@ -2255,106 +2652,124 @@
 
 void count_VkClearValue(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkClearValue* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
-    count_VkClearColorValue(featureBits, (VkClearColorValue*)(&toCount->color), count);
+    count_VkClearColorValue(featureBits, rootType, (VkClearColorValue*)(&toCount->color), count);
 }
 
 void count_VkClearAttachment(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkClearAttachment* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkImageAspectFlags);
     *count += sizeof(uint32_t);
-    count_VkClearValue(featureBits, (VkClearValue*)(&toCount->clearValue), count);
+    count_VkClearValue(featureBits, rootType, (VkClearValue*)(&toCount->clearValue), count);
 }
 
 void count_VkClearRect(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkClearRect* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
-    count_VkRect2D(featureBits, (VkRect2D*)(&toCount->rect), count);
+    count_VkRect2D(featureBits, rootType, (VkRect2D*)(&toCount->rect), count);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
 }
 
 void count_VkImageBlit(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageBlit* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
-    count_VkImageSubresourceLayers(featureBits, (VkImageSubresourceLayers*)(&toCount->srcSubresource), count);
+    count_VkImageSubresourceLayers(featureBits, rootType, (VkImageSubresourceLayers*)(&toCount->srcSubresource), count);
     for (uint32_t i = 0; i < (uint32_t)2; ++i)
     {
-        count_VkOffset3D(featureBits, (VkOffset3D*)(toCount->srcOffsets + i), count);
+        count_VkOffset3D(featureBits, rootType, (VkOffset3D*)(toCount->srcOffsets + i), count);
     }
-    count_VkImageSubresourceLayers(featureBits, (VkImageSubresourceLayers*)(&toCount->dstSubresource), count);
+    count_VkImageSubresourceLayers(featureBits, rootType, (VkImageSubresourceLayers*)(&toCount->dstSubresource), count);
     for (uint32_t i = 0; i < (uint32_t)2; ++i)
     {
-        count_VkOffset3D(featureBits, (VkOffset3D*)(toCount->dstOffsets + i), count);
+        count_VkOffset3D(featureBits, rootType, (VkOffset3D*)(toCount->dstOffsets + i), count);
     }
 }
 
 void count_VkImageCopy(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageCopy* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
-    count_VkImageSubresourceLayers(featureBits, (VkImageSubresourceLayers*)(&toCount->srcSubresource), count);
-    count_VkOffset3D(featureBits, (VkOffset3D*)(&toCount->srcOffset), count);
-    count_VkImageSubresourceLayers(featureBits, (VkImageSubresourceLayers*)(&toCount->dstSubresource), count);
-    count_VkOffset3D(featureBits, (VkOffset3D*)(&toCount->dstOffset), count);
-    count_VkExtent3D(featureBits, (VkExtent3D*)(&toCount->extent), count);
+    count_VkImageSubresourceLayers(featureBits, rootType, (VkImageSubresourceLayers*)(&toCount->srcSubresource), count);
+    count_VkOffset3D(featureBits, rootType, (VkOffset3D*)(&toCount->srcOffset), count);
+    count_VkImageSubresourceLayers(featureBits, rootType, (VkImageSubresourceLayers*)(&toCount->dstSubresource), count);
+    count_VkOffset3D(featureBits, rootType, (VkOffset3D*)(&toCount->dstOffset), count);
+    count_VkExtent3D(featureBits, rootType, (VkExtent3D*)(&toCount->extent), count);
 }
 
 void count_VkImageResolve(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageResolve* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
-    count_VkImageSubresourceLayers(featureBits, (VkImageSubresourceLayers*)(&toCount->srcSubresource), count);
-    count_VkOffset3D(featureBits, (VkOffset3D*)(&toCount->srcOffset), count);
-    count_VkImageSubresourceLayers(featureBits, (VkImageSubresourceLayers*)(&toCount->dstSubresource), count);
-    count_VkOffset3D(featureBits, (VkOffset3D*)(&toCount->dstOffset), count);
-    count_VkExtent3D(featureBits, (VkExtent3D*)(&toCount->extent), count);
+    count_VkImageSubresourceLayers(featureBits, rootType, (VkImageSubresourceLayers*)(&toCount->srcSubresource), count);
+    count_VkOffset3D(featureBits, rootType, (VkOffset3D*)(&toCount->srcOffset), count);
+    count_VkImageSubresourceLayers(featureBits, rootType, (VkImageSubresourceLayers*)(&toCount->dstSubresource), count);
+    count_VkOffset3D(featureBits, rootType, (VkOffset3D*)(&toCount->dstOffset), count);
+    count_VkExtent3D(featureBits, rootType, (VkExtent3D*)(&toCount->extent), count);
 }
 
 void count_VkRenderPassBeginInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRenderPassBeginInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     uint64_t cgen_var_1;
     *count += 1 * 8;
-    count_VkRect2D(featureBits, (VkRect2D*)(&toCount->renderArea), count);
+    count_VkRect2D(featureBits, rootType, (VkRect2D*)(&toCount->renderArea), count);
     *count += sizeof(uint32_t);
     // WARNING PTR CHECK
     *count += 8;
@@ -2364,7 +2779,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)toCount->clearValueCount; ++i)
             {
-                count_VkClearValue(featureBits, (const VkClearValue*)(toCount->pClearValues + i), count);
+                count_VkClearValue(featureBits, rootType, (const VkClearValue*)(toCount->pClearValues + i), count);
             }
         }
     }
@@ -2374,14 +2789,20 @@
 #ifdef VK_VERSION_1_1
 void count_VkPhysicalDeviceSubgroupProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceSubgroupProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     *count += sizeof(VkShaderStageFlags);
     *count += sizeof(VkSubgroupFeatureFlags);
@@ -2390,14 +2811,20 @@
 
 void count_VkBindBufferMemoryInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBindBufferMemoryInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     uint64_t cgen_var_1;
@@ -2407,14 +2834,20 @@
 
 void count_VkBindImageMemoryInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBindImageMemoryInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     uint64_t cgen_var_1;
@@ -2424,14 +2857,20 @@
 
 void count_VkPhysicalDevice16BitStorageFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDevice16BitStorageFeatures* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
@@ -2440,28 +2879,40 @@
 
 void count_VkMemoryDedicatedRequirements(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryDedicatedRequirements* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
 }
 
 void count_VkMemoryDedicatedAllocateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryDedicatedAllocateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     uint64_t cgen_var_1;
@@ -2470,62 +2921,86 @@
 
 void count_VkMemoryAllocateFlagsInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryAllocateFlagsInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkMemoryAllocateFlags);
     *count += sizeof(uint32_t);
 }
 
 void count_VkDeviceGroupRenderPassBeginInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceGroupRenderPassBeginInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
     if (toCount)
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->deviceRenderAreaCount; ++i)
         {
-            count_VkRect2D(featureBits, (const VkRect2D*)(toCount->pDeviceRenderAreas + i), count);
+            count_VkRect2D(featureBits, rootType, (const VkRect2D*)(toCount->pDeviceRenderAreas + i), count);
         }
     }
 }
 
 void count_VkDeviceGroupCommandBufferBeginInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceGroupCommandBufferBeginInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
 }
 
 void count_VkDeviceGroupSubmitInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceGroupSubmitInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     if (toCount)
     {
@@ -2545,28 +3020,40 @@
 
 void count_VkDeviceGroupBindSparseInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceGroupBindSparseInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
 }
 
 void count_VkBindBufferMemoryDeviceGroupInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBindBufferMemoryDeviceGroupInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     if (toCount)
     {
@@ -2576,14 +3063,20 @@
 
 void count_VkBindImageMemoryDeviceGroupInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBindImageMemoryDeviceGroupInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     if (toCount)
     {
@@ -2594,21 +3087,27 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->splitInstanceBindRegionCount; ++i)
         {
-            count_VkRect2D(featureBits, (const VkRect2D*)(toCount->pSplitInstanceBindRegions + i), count);
+            count_VkRect2D(featureBits, rootType, (const VkRect2D*)(toCount->pSplitInstanceBindRegions + i), count);
         }
     }
 }
 
 void count_VkPhysicalDeviceGroupProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceGroupProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     *count += VK_MAX_DEVICE_GROUP_SIZE * sizeof(VkPhysicalDevice);
     *count += sizeof(VkBool32);
@@ -2616,14 +3115,20 @@
 
 void count_VkDeviceGroupDeviceCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceGroupDeviceCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     if (toCount->physicalDeviceCount)
     {
@@ -2633,134 +3138,194 @@
 
 void count_VkBufferMemoryRequirementsInfo2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBufferMemoryRequirementsInfo2* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
 }
 
 void count_VkImageMemoryRequirementsInfo2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageMemoryRequirementsInfo2* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
 }
 
 void count_VkImageSparseMemoryRequirementsInfo2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageSparseMemoryRequirementsInfo2* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
 }
 
 void count_VkMemoryRequirements2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryRequirements2* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkMemoryRequirements(featureBits, (VkMemoryRequirements*)(&toCount->memoryRequirements), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkMemoryRequirements(featureBits, rootType, (VkMemoryRequirements*)(&toCount->memoryRequirements), count);
 }
 
 void count_VkSparseImageMemoryRequirements2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSparseImageMemoryRequirements2* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkSparseImageMemoryRequirements(featureBits, (VkSparseImageMemoryRequirements*)(&toCount->memoryRequirements), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkSparseImageMemoryRequirements(featureBits, rootType, (VkSparseImageMemoryRequirements*)(&toCount->memoryRequirements), count);
 }
 
 void count_VkPhysicalDeviceFeatures2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceFeatures2* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkPhysicalDeviceFeatures(featureBits, (VkPhysicalDeviceFeatures*)(&toCount->features), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkPhysicalDeviceFeatures(featureBits, rootType, (VkPhysicalDeviceFeatures*)(&toCount->features), count);
 }
 
 void count_VkPhysicalDeviceProperties2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceProperties2* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkPhysicalDeviceProperties(featureBits, (VkPhysicalDeviceProperties*)(&toCount->properties), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkPhysicalDeviceProperties(featureBits, rootType, (VkPhysicalDeviceProperties*)(&toCount->properties), count);
 }
 
 void count_VkFormatProperties2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkFormatProperties2* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkFormatProperties(featureBits, (VkFormatProperties*)(&toCount->formatProperties), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkFormatProperties(featureBits, rootType, (VkFormatProperties*)(&toCount->formatProperties), count);
 }
 
 void count_VkImageFormatProperties2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageFormatProperties2* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkImageFormatProperties(featureBits, (VkImageFormatProperties*)(&toCount->imageFormatProperties), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkImageFormatProperties(featureBits, rootType, (VkImageFormatProperties*)(&toCount->imageFormatProperties), count);
 }
 
 void count_VkPhysicalDeviceImageFormatInfo2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageFormatInfo2* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkFormat);
     *count += sizeof(VkImageType);
     *count += sizeof(VkImageTiling);
@@ -2770,53 +3335,77 @@
 
 void count_VkQueueFamilyProperties2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkQueueFamilyProperties2* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkQueueFamilyProperties(featureBits, (VkQueueFamilyProperties*)(&toCount->queueFamilyProperties), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkQueueFamilyProperties(featureBits, rootType, (VkQueueFamilyProperties*)(&toCount->queueFamilyProperties), count);
 }
 
 void count_VkPhysicalDeviceMemoryProperties2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryProperties2* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkPhysicalDeviceMemoryProperties(featureBits, (VkPhysicalDeviceMemoryProperties*)(&toCount->memoryProperties), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkPhysicalDeviceMemoryProperties(featureBits, rootType, (VkPhysicalDeviceMemoryProperties*)(&toCount->memoryProperties), count);
 }
 
 void count_VkSparseImageFormatProperties2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSparseImageFormatProperties2* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkSparseImageFormatProperties(featureBits, (VkSparseImageFormatProperties*)(&toCount->properties), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkSparseImageFormatProperties(featureBits, rootType, (VkSparseImageFormatProperties*)(&toCount->properties), count);
 }
 
 void count_VkPhysicalDeviceSparseImageFormatInfo2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceSparseImageFormatInfo2* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkFormat);
     *count += sizeof(VkImageType);
     *count += sizeof(VkSampleCountFlagBits);
@@ -2826,23 +3415,31 @@
 
 void count_VkPhysicalDevicePointClippingProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDevicePointClippingProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPointClippingBehavior);
 }
 
 void count_VkInputAttachmentAspectReference(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkInputAttachmentAspectReference* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -2852,60 +3449,84 @@
 
 void count_VkRenderPassInputAttachmentAspectCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRenderPassInputAttachmentAspectCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     if (toCount)
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->aspectReferenceCount; ++i)
         {
-            count_VkInputAttachmentAspectReference(featureBits, (const VkInputAttachmentAspectReference*)(toCount->pAspectReferences + i), count);
+            count_VkInputAttachmentAspectReference(featureBits, rootType, (const VkInputAttachmentAspectReference*)(toCount->pAspectReferences + i), count);
         }
     }
 }
 
 void count_VkImageViewUsageCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageViewUsageCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkImageUsageFlags);
 }
 
 void count_VkPipelineTessellationDomainOriginStateCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineTessellationDomainOriginStateCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkTessellationDomainOrigin);
 }
 
 void count_VkRenderPassMultiviewCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRenderPassMultiviewCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     if (toCount)
     {
@@ -2925,14 +3546,20 @@
 
 void count_VkPhysicalDeviceMultiviewFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceMultiviewFeatures* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
@@ -2940,68 +3567,98 @@
 
 void count_VkPhysicalDeviceMultiviewProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceMultiviewProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
 }
 
 void count_VkPhysicalDeviceVariablePointersFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceVariablePointersFeatures* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
 }
 
 void count_VkPhysicalDeviceProtectedMemoryFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceProtectedMemoryFeatures* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkPhysicalDeviceProtectedMemoryProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceProtectedMemoryProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkDeviceQueueInfo2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceQueueInfo2* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDeviceQueueCreateFlags);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
@@ -3009,31 +3666,43 @@
 
 void count_VkProtectedSubmitInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkProtectedSubmitInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkSamplerYcbcrConversionCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSamplerYcbcrConversionCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkFormat);
     *count += sizeof(VkSamplerYcbcrModelConversion);
     *count += sizeof(VkSamplerYcbcrRange);
-    count_VkComponentMapping(featureBits, (VkComponentMapping*)(&toCount->components), count);
+    count_VkComponentMapping(featureBits, rootType, (VkComponentMapping*)(&toCount->components), count);
     *count += sizeof(VkChromaLocation);
     *count += sizeof(VkChromaLocation);
     *count += sizeof(VkFilter);
@@ -3042,76 +3711,108 @@
 
 void count_VkSamplerYcbcrConversionInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSamplerYcbcrConversionInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
 }
 
 void count_VkBindImagePlaneMemoryInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBindImagePlaneMemoryInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkImageAspectFlagBits);
 }
 
 void count_VkImagePlaneMemoryRequirementsInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImagePlaneMemoryRequirementsInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkImageAspectFlagBits);
 }
 
 void count_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceSamplerYcbcrConversionFeatures* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkSamplerYcbcrConversionImageFormatProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSamplerYcbcrConversionImageFormatProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
 }
 
 void count_VkDescriptorUpdateTemplateEntry(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorUpdateTemplateEntry* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -3124,21 +3825,27 @@
 
 void count_VkDescriptorUpdateTemplateCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorUpdateTemplateCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDescriptorUpdateTemplateCreateFlags);
     *count += sizeof(uint32_t);
     if (toCount)
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->descriptorUpdateEntryCount; ++i)
         {
-            count_VkDescriptorUpdateTemplateEntry(featureBits, (const VkDescriptorUpdateTemplateEntry*)(toCount->pDescriptorUpdateEntries + i), count);
+            count_VkDescriptorUpdateTemplateEntry(featureBits, rootType, (const VkDescriptorUpdateTemplateEntry*)(toCount->pDescriptorUpdateEntries + i), count);
         }
     }
     *count += sizeof(VkDescriptorUpdateTemplateType);
@@ -3152,10 +3859,12 @@
 
 void count_VkExternalMemoryProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExternalMemoryProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkExternalMemoryFeatureFlags);
@@ -3165,40 +3874,58 @@
 
 void count_VkPhysicalDeviceExternalImageFormatInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalImageFormatInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkExternalMemoryHandleTypeFlagBits);
 }
 
 void count_VkExternalImageFormatProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExternalImageFormatProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkExternalMemoryProperties(featureBits, (VkExternalMemoryProperties*)(&toCount->externalMemoryProperties), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkExternalMemoryProperties(featureBits, rootType, (VkExternalMemoryProperties*)(&toCount->externalMemoryProperties), count);
 }
 
 void count_VkPhysicalDeviceExternalBufferInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalBufferInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBufferCreateFlags);
     *count += sizeof(VkBufferUsageFlags);
     *count += sizeof(VkExternalMemoryHandleTypeFlagBits);
@@ -3206,27 +3933,39 @@
 
 void count_VkExternalBufferProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExternalBufferProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkExternalMemoryProperties(featureBits, (VkExternalMemoryProperties*)(&toCount->externalMemoryProperties), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkExternalMemoryProperties(featureBits, rootType, (VkExternalMemoryProperties*)(&toCount->externalMemoryProperties), count);
 }
 
 void count_VkPhysicalDeviceIDProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceIDProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += VK_UUID_SIZE * sizeof(uint8_t);
     *count += VK_UUID_SIZE * sizeof(uint8_t);
     *count += VK_LUID_SIZE * sizeof(uint8_t);
@@ -3236,66 +3975,96 @@
 
 void count_VkExternalMemoryImageCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExternalMemoryImageCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkExternalMemoryHandleTypeFlags);
 }
 
 void count_VkExternalMemoryBufferCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExternalMemoryBufferCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkExternalMemoryHandleTypeFlags);
 }
 
 void count_VkExportMemoryAllocateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExportMemoryAllocateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkExternalMemoryHandleTypeFlags);
 }
 
 void count_VkPhysicalDeviceExternalFenceInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalFenceInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkExternalFenceHandleTypeFlagBits);
 }
 
 void count_VkExternalFenceProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExternalFenceProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkExternalFenceHandleTypeFlags);
     *count += sizeof(VkExternalFenceHandleTypeFlags);
     *count += sizeof(VkExternalFenceFeatureFlags);
@@ -3303,53 +4072,77 @@
 
 void count_VkExportFenceCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExportFenceCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkExternalFenceHandleTypeFlags);
 }
 
 void count_VkExportSemaphoreCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExportSemaphoreCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkExternalSemaphoreHandleTypeFlags);
 }
 
 void count_VkPhysicalDeviceExternalSemaphoreInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalSemaphoreInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkExternalSemaphoreHandleTypeFlagBits);
 }
 
 void count_VkExternalSemaphoreProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExternalSemaphoreProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkExternalSemaphoreHandleTypeFlags);
     *count += sizeof(VkExternalSemaphoreHandleTypeFlags);
     *count += sizeof(VkExternalSemaphoreFeatureFlags);
@@ -3357,41 +4150,59 @@
 
 void count_VkPhysicalDeviceMaintenance3Properties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceMaintenance3Properties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     *count += sizeof(VkDeviceSize);
 }
 
 void count_VkDescriptorSetLayoutSupport(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutSupport* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkPhysicalDeviceShaderDrawParametersFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderDrawParametersFeatures* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
@@ -3399,14 +4210,20 @@
 #ifdef VK_VERSION_1_2
 void count_VkPhysicalDeviceVulkan11Features(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan11Features* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
@@ -3423,14 +4240,20 @@
 
 void count_VkPhysicalDeviceVulkan11Properties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan11Properties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += VK_UUID_SIZE * sizeof(uint8_t);
     *count += VK_UUID_SIZE * sizeof(uint8_t);
     *count += VK_LUID_SIZE * sizeof(uint8_t);
@@ -3450,14 +4273,20 @@
 
 void count_VkPhysicalDeviceVulkan12Features(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan12Features* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
@@ -3509,10 +4338,12 @@
 
 void count_VkConformanceVersion(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkConformanceVersion* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint8_t);
@@ -3523,18 +4354,24 @@
 
 void count_VkPhysicalDeviceVulkan12Properties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan12Properties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDriverId);
     *count += VK_MAX_DRIVER_NAME_SIZE * sizeof(char);
     *count += VK_MAX_DRIVER_INFO_SIZE * sizeof(char);
-    count_VkConformanceVersion(featureBits, (VkConformanceVersion*)(&toCount->conformanceVersion), count);
+    count_VkConformanceVersion(featureBits, rootType, (VkConformanceVersion*)(&toCount->conformanceVersion), count);
     *count += sizeof(VkShaderFloatControlsIndependence);
     *count += sizeof(VkShaderFloatControlsIndependence);
     *count += sizeof(VkBool32);
@@ -3587,14 +4424,20 @@
 
 void count_VkImageFormatListCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageFormatListCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     if (toCount)
     {
@@ -3604,14 +4447,20 @@
 
 void count_VkAttachmentDescription2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAttachmentDescription2* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkAttachmentDescriptionFlags);
     *count += sizeof(VkFormat);
     *count += sizeof(VkSampleCountFlagBits);
@@ -3625,14 +4474,20 @@
 
 void count_VkAttachmentReference2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAttachmentReference2* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     *count += sizeof(VkImageLayout);
     *count += sizeof(VkImageAspectFlags);
@@ -3640,14 +4495,20 @@
 
 void count_VkSubpassDescription2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSubpassDescription2* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkSubpassDescriptionFlags);
     *count += sizeof(VkPipelineBindPoint);
     *count += sizeof(uint32_t);
@@ -3656,7 +4517,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->inputAttachmentCount; ++i)
         {
-            count_VkAttachmentReference2(featureBits, (const VkAttachmentReference2*)(toCount->pInputAttachments + i), count);
+            count_VkAttachmentReference2(featureBits, rootType, (const VkAttachmentReference2*)(toCount->pInputAttachments + i), count);
         }
     }
     *count += sizeof(uint32_t);
@@ -3664,7 +4525,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->colorAttachmentCount; ++i)
         {
-            count_VkAttachmentReference2(featureBits, (const VkAttachmentReference2*)(toCount->pColorAttachments + i), count);
+            count_VkAttachmentReference2(featureBits, rootType, (const VkAttachmentReference2*)(toCount->pColorAttachments + i), count);
         }
     }
     // WARNING PTR CHECK
@@ -3675,7 +4536,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)toCount->colorAttachmentCount; ++i)
             {
-                count_VkAttachmentReference2(featureBits, (const VkAttachmentReference2*)(toCount->pResolveAttachments + i), count);
+                count_VkAttachmentReference2(featureBits, rootType, (const VkAttachmentReference2*)(toCount->pResolveAttachments + i), count);
             }
         }
     }
@@ -3683,7 +4544,7 @@
     *count += 8;
     if (toCount->pDepthStencilAttachment)
     {
-        count_VkAttachmentReference2(featureBits, (const VkAttachmentReference2*)(toCount->pDepthStencilAttachment), count);
+        count_VkAttachmentReference2(featureBits, rootType, (const VkAttachmentReference2*)(toCount->pDepthStencilAttachment), count);
     }
     *count += sizeof(uint32_t);
     if (toCount)
@@ -3694,14 +4555,20 @@
 
 void count_VkSubpassDependency2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSubpassDependency2* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
     *count += sizeof(VkPipelineStageFlags);
@@ -3714,21 +4581,27 @@
 
 void count_VkRenderPassCreateInfo2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRenderPassCreateInfo2* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkRenderPassCreateFlags);
     *count += sizeof(uint32_t);
     if (toCount)
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->attachmentCount; ++i)
         {
-            count_VkAttachmentDescription2(featureBits, (const VkAttachmentDescription2*)(toCount->pAttachments + i), count);
+            count_VkAttachmentDescription2(featureBits, rootType, (const VkAttachmentDescription2*)(toCount->pAttachments + i), count);
         }
     }
     *count += sizeof(uint32_t);
@@ -3736,7 +4609,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->subpassCount; ++i)
         {
-            count_VkSubpassDescription2(featureBits, (const VkSubpassDescription2*)(toCount->pSubpasses + i), count);
+            count_VkSubpassDescription2(featureBits, rootType, (const VkSubpassDescription2*)(toCount->pSubpasses + i), count);
         }
     }
     *count += sizeof(uint32_t);
@@ -3744,7 +4617,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->dependencyCount; ++i)
         {
-            count_VkSubpassDependency2(featureBits, (const VkSubpassDependency2*)(toCount->pDependencies + i), count);
+            count_VkSubpassDependency2(featureBits, rootType, (const VkSubpassDependency2*)(toCount->pDependencies + i), count);
         }
     }
     *count += sizeof(uint32_t);
@@ -3756,39 +4629,57 @@
 
 void count_VkSubpassBeginInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSubpassBeginInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkSubpassContents);
 }
 
 void count_VkSubpassEndInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSubpassEndInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
 }
 
 void count_VkPhysicalDevice8BitStorageFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDevice8BitStorageFeatures* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
@@ -3796,58 +4687,82 @@
 
 void count_VkPhysicalDeviceDriverProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceDriverProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDriverId);
     *count += VK_MAX_DRIVER_NAME_SIZE * sizeof(char);
     *count += VK_MAX_DRIVER_INFO_SIZE * sizeof(char);
-    count_VkConformanceVersion(featureBits, (VkConformanceVersion*)(&toCount->conformanceVersion), count);
+    count_VkConformanceVersion(featureBits, rootType, (VkConformanceVersion*)(&toCount->conformanceVersion), count);
 }
 
 void count_VkPhysicalDeviceShaderAtomicInt64Features(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderAtomicInt64Features* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
 }
 
 void count_VkPhysicalDeviceShaderFloat16Int8Features(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderFloat16Int8Features* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
 }
 
 void count_VkPhysicalDeviceFloatControlsProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceFloatControlsProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkShaderFloatControlsIndependence);
     *count += sizeof(VkShaderFloatControlsIndependence);
     *count += sizeof(VkBool32);
@@ -3869,14 +4784,20 @@
 
 void count_VkDescriptorSetLayoutBindingFlagsCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutBindingFlagsCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     // WARNING PTR CHECK
     *count += 8;
@@ -3891,14 +4812,20 @@
 
 void count_VkPhysicalDeviceDescriptorIndexingFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceDescriptorIndexingFeatures* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
@@ -3923,14 +4850,20 @@
 
 void count_VkPhysicalDeviceDescriptorIndexingProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceDescriptorIndexingProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
@@ -3958,14 +4891,20 @@
 
 void count_VkDescriptorSetVariableDescriptorCountAllocateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorSetVariableDescriptorCountAllocateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     if (toCount)
     {
@@ -3975,47 +4914,65 @@
 
 void count_VkDescriptorSetVariableDescriptorCountLayoutSupport(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorSetVariableDescriptorCountLayoutSupport* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
 }
 
 void count_VkSubpassDescriptionDepthStencilResolve(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSubpassDescriptionDepthStencilResolve* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkResolveModeFlagBits);
     *count += sizeof(VkResolveModeFlagBits);
     // WARNING PTR CHECK
     *count += 8;
     if (toCount->pDepthStencilResolveAttachment)
     {
-        count_VkAttachmentReference2(featureBits, (const VkAttachmentReference2*)(toCount->pDepthStencilResolveAttachment), count);
+        count_VkAttachmentReference2(featureBits, rootType, (const VkAttachmentReference2*)(toCount->pDepthStencilResolveAttachment), count);
     }
 }
 
 void count_VkPhysicalDeviceDepthStencilResolveProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceDepthStencilResolveProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkResolveModeFlags);
     *count += sizeof(VkResolveModeFlags);
     *count += sizeof(VkBool32);
@@ -4024,67 +4981,97 @@
 
 void count_VkPhysicalDeviceScalarBlockLayoutFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceScalarBlockLayoutFeatures* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkImageStencilUsageCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageStencilUsageCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkImageUsageFlags);
 }
 
 void count_VkSamplerReductionModeCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSamplerReductionModeCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkSamplerReductionMode);
 }
 
 void count_VkPhysicalDeviceSamplerFilterMinmaxProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceSamplerFilterMinmaxProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
 }
 
 void count_VkPhysicalDeviceVulkanMemoryModelFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkanMemoryModelFeatures* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
@@ -4092,27 +5079,39 @@
 
 void count_VkPhysicalDeviceImagelessFramebufferFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceImagelessFramebufferFeatures* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkFramebufferAttachmentImageInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkFramebufferAttachmentImageInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkImageCreateFlags);
     *count += sizeof(VkImageUsageFlags);
     *count += sizeof(uint32_t);
@@ -4127,34 +5126,46 @@
 
 void count_VkFramebufferAttachmentsCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkFramebufferAttachmentsCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     if (toCount)
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->attachmentImageInfoCount; ++i)
         {
-            count_VkFramebufferAttachmentImageInfo(featureBits, (const VkFramebufferAttachmentImageInfo*)(toCount->pAttachmentImageInfos + i), count);
+            count_VkFramebufferAttachmentImageInfo(featureBits, rootType, (const VkFramebufferAttachmentImageInfo*)(toCount->pAttachmentImageInfos + i), count);
         }
     }
 }
 
 void count_VkRenderPassAttachmentBeginInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRenderPassAttachmentBeginInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     if (toCount->attachmentCount)
     {
@@ -4164,133 +5175,193 @@
 
 void count_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceUniformBufferStandardLayoutFeatures* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkAttachmentReferenceStencilLayout(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAttachmentReferenceStencilLayout* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkImageLayout);
 }
 
 void count_VkAttachmentDescriptionStencilLayout(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAttachmentDescriptionStencilLayout* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkImageLayout);
     *count += sizeof(VkImageLayout);
 }
 
 void count_VkPhysicalDeviceHostQueryResetFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceHostQueryResetFeatures* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkPhysicalDeviceTimelineSemaphoreFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceTimelineSemaphoreFeatures* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkPhysicalDeviceTimelineSemaphoreProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceTimelineSemaphoreProperties* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint64_t);
 }
 
 void count_VkSemaphoreTypeCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSemaphoreTypeCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkSemaphoreType);
     *count += sizeof(uint64_t);
 }
 
 void count_VkTimelineSemaphoreSubmitInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkTimelineSemaphoreSubmitInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     // WARNING PTR CHECK
     *count += 8;
@@ -4315,14 +5386,20 @@
 
 void count_VkSemaphoreWaitInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSemaphoreWaitInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkSemaphoreWaitFlags);
     *count += sizeof(uint32_t);
     if (toCount->semaphoreCount)
@@ -4337,14 +5414,20 @@
 
 void count_VkSemaphoreSignalInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSemaphoreSignalInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(uint64_t);
@@ -4352,14 +5435,20 @@
 
 void count_VkPhysicalDeviceBufferDeviceAddressFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceBufferDeviceAddressFeatures* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
@@ -4367,54 +5456,78 @@
 
 void count_VkBufferDeviceAddressInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBufferDeviceAddressInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
 }
 
 void count_VkBufferOpaqueCaptureAddressCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBufferOpaqueCaptureAddressCreateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint64_t);
 }
 
 void count_VkMemoryOpaqueCaptureAddressAllocateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryOpaqueCaptureAddressAllocateInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint64_t);
 }
 
 void count_VkDeviceMemoryOpaqueCaptureAddressInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceMemoryOpaqueCaptureAddressInfo* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
 }
@@ -4423,17 +5536,19 @@
 #ifdef VK_KHR_surface
 void count_VkSurfaceCapabilitiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSurfaceCapabilitiesKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->currentExtent), count);
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->minImageExtent), count);
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->maxImageExtent), count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->currentExtent), count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->minImageExtent), count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->maxImageExtent), count);
     *count += sizeof(uint32_t);
     *count += sizeof(VkSurfaceTransformFlagsKHR);
     *count += sizeof(VkSurfaceTransformFlagBitsKHR);
@@ -4443,10 +5558,12 @@
 
 void count_VkSurfaceFormatKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSurfaceFormatKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkFormat);
@@ -4457,21 +5574,27 @@
 #ifdef VK_KHR_swapchain
 void count_VkSwapchainCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSwapchainCreateInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkSwapchainCreateFlagsKHR);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(uint32_t);
     *count += sizeof(VkFormat);
     *count += sizeof(VkColorSpaceKHR);
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->imageExtent), count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->imageExtent), count);
     *count += sizeof(uint32_t);
     *count += sizeof(VkImageUsageFlags);
     *count += sizeof(VkSharingMode);
@@ -4495,14 +5618,20 @@
 
 void count_VkPresentInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPresentInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     if (toCount->waitSemaphoreCount)
     {
@@ -4530,28 +5659,40 @@
 
 void count_VkImageSwapchainCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageSwapchainCreateInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
 }
 
 void count_VkBindImageMemorySwapchainInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBindImageMemorySwapchainInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(uint32_t);
@@ -4559,14 +5700,20 @@
 
 void count_VkAcquireNextImageInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAcquireNextImageInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(uint64_t);
@@ -4579,28 +5726,40 @@
 
 void count_VkDeviceGroupPresentCapabilitiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceGroupPresentCapabilitiesKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += VK_MAX_DEVICE_GROUP_SIZE * sizeof(uint32_t);
     *count += sizeof(VkDeviceGroupPresentModeFlagsKHR);
 }
 
 void count_VkDeviceGroupPresentInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceGroupPresentInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     if (toCount)
     {
@@ -4611,14 +5770,20 @@
 
 void count_VkDeviceGroupSwapchainCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceGroupSwapchainCreateInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDeviceGroupPresentModeFlagsKHR);
 }
 
@@ -4626,68 +5791,82 @@
 #ifdef VK_KHR_display
 void count_VkDisplayModeParametersKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayModeParametersKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->visibleRegion), count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->visibleRegion), count);
     *count += sizeof(uint32_t);
 }
 
 void count_VkDisplayModeCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayModeCreateInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDisplayModeCreateFlagsKHR);
-    count_VkDisplayModeParametersKHR(featureBits, (VkDisplayModeParametersKHR*)(&toCount->parameters), count);
+    count_VkDisplayModeParametersKHR(featureBits, rootType, (VkDisplayModeParametersKHR*)(&toCount->parameters), count);
 }
 
 void count_VkDisplayModePropertiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayModePropertiesKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     uint64_t cgen_var_0;
     *count += 1 * 8;
-    count_VkDisplayModeParametersKHR(featureBits, (VkDisplayModeParametersKHR*)(&toCount->parameters), count);
+    count_VkDisplayModeParametersKHR(featureBits, rootType, (VkDisplayModeParametersKHR*)(&toCount->parameters), count);
 }
 
 void count_VkDisplayPlaneCapabilitiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayPlaneCapabilitiesKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkDisplayPlaneAlphaFlagsKHR);
-    count_VkOffset2D(featureBits, (VkOffset2D*)(&toCount->minSrcPosition), count);
-    count_VkOffset2D(featureBits, (VkOffset2D*)(&toCount->maxSrcPosition), count);
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->minSrcExtent), count);
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->maxSrcExtent), count);
-    count_VkOffset2D(featureBits, (VkOffset2D*)(&toCount->minDstPosition), count);
-    count_VkOffset2D(featureBits, (VkOffset2D*)(&toCount->maxDstPosition), count);
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->minDstExtent), count);
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->maxDstExtent), count);
+    count_VkOffset2D(featureBits, rootType, (VkOffset2D*)(&toCount->minSrcPosition), count);
+    count_VkOffset2D(featureBits, rootType, (VkOffset2D*)(&toCount->maxSrcPosition), count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->minSrcExtent), count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->maxSrcExtent), count);
+    count_VkOffset2D(featureBits, rootType, (VkOffset2D*)(&toCount->minDstPosition), count);
+    count_VkOffset2D(featureBits, rootType, (VkOffset2D*)(&toCount->maxDstPosition), count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->minDstExtent), count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->maxDstExtent), count);
 }
 
 void count_VkDisplayPlanePropertiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayPlanePropertiesKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     uint64_t cgen_var_0;
@@ -4697,17 +5876,19 @@
 
 void count_VkDisplayPropertiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayPropertiesKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(uint32_t) + (toCount->displayName ? strlen(toCount->displayName) : 0);
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->physicalDimensions), count);
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->physicalResolution), count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->physicalDimensions), count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->physicalResolution), count);
     *count += sizeof(VkSurfaceTransformFlagsKHR);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
@@ -4715,14 +5896,20 @@
 
 void count_VkDisplaySurfaceCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplaySurfaceCreateInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDisplaySurfaceCreateFlagsKHR);
     uint64_t cgen_var_0;
     *count += 1 * 8;
@@ -4731,23 +5918,29 @@
     *count += sizeof(VkSurfaceTransformFlagBitsKHR);
     *count += sizeof(float);
     *count += sizeof(VkDisplayPlaneAlphaFlagBitsKHR);
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->imageExtent), count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->imageExtent), count);
 }
 
 #endif
 #ifdef VK_KHR_display_swapchain
 void count_VkDisplayPresentInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayPresentInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkRect2D(featureBits, (VkRect2D*)(&toCount->srcRect), count);
-    count_VkRect2D(featureBits, (VkRect2D*)(&toCount->dstRect), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkRect2D(featureBits, rootType, (VkRect2D*)(&toCount->srcRect), count);
+    count_VkRect2D(featureBits, rootType, (VkRect2D*)(&toCount->dstRect), count);
     *count += sizeof(VkBool32);
 }
 
@@ -4755,14 +5948,20 @@
 #ifdef VK_KHR_xlib_surface
 void count_VkXlibSurfaceCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkXlibSurfaceCreateInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkXlibSurfaceCreateFlagsKHR);
     // WARNING PTR CHECK
     *count += 8;
@@ -4777,14 +5976,20 @@
 #ifdef VK_KHR_xcb_surface
 void count_VkXcbSurfaceCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkXcbSurfaceCreateInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkXcbSurfaceCreateFlagsKHR);
     // WARNING PTR CHECK
     *count += 8;
@@ -4799,14 +6004,20 @@
 #ifdef VK_KHR_wayland_surface
 void count_VkWaylandSurfaceCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkWaylandSurfaceCreateInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkWaylandSurfaceCreateFlagsKHR);
     // WARNING PTR CHECK
     *count += 8;
@@ -4826,14 +6037,20 @@
 #ifdef VK_KHR_android_surface
 void count_VkAndroidSurfaceCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAndroidSurfaceCreateInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkAndroidSurfaceCreateFlagsKHR);
     // WARNING PTR CHECK
     *count += 8;
@@ -4847,14 +6064,20 @@
 #ifdef VK_KHR_win32_surface
 void count_VkWin32SurfaceCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkWin32SurfaceCreateInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkWin32SurfaceCreateFlagsKHR);
     *count += sizeof(HINSTANCE);
     *count += sizeof(HWND);
@@ -4882,14 +6105,20 @@
 #ifdef VK_KHR_external_memory_win32
 void count_VkImportMemoryWin32HandleInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImportMemoryWin32HandleInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkExternalMemoryHandleTypeFlagBits);
     *count += sizeof(HANDLE);
     *count += sizeof(LPCWSTR);
@@ -4897,14 +6126,20 @@
 
 void count_VkExportMemoryWin32HandleInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExportMemoryWin32HandleInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     // WARNING PTR CHECK
     *count += 8;
     if (toCount->pAttributes)
@@ -4917,27 +6152,39 @@
 
 void count_VkMemoryWin32HandlePropertiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryWin32HandlePropertiesKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
 }
 
 void count_VkMemoryGetWin32HandleInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryGetWin32HandleInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(VkExternalMemoryHandleTypeFlagBits);
@@ -4947,41 +6194,59 @@
 #ifdef VK_KHR_external_memory_fd
 void count_VkImportMemoryFdInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImportMemoryFdInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkExternalMemoryHandleTypeFlagBits);
     *count += sizeof(int);
 }
 
 void count_VkMemoryFdPropertiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryFdPropertiesKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
 }
 
 void count_VkMemoryGetFdInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryGetFdInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(VkExternalMemoryHandleTypeFlagBits);
@@ -4991,14 +6256,20 @@
 #ifdef VK_KHR_win32_keyed_mutex
 void count_VkWin32KeyedMutexAcquireReleaseInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkWin32KeyedMutexAcquireReleaseInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     if (toCount->acquireCount)
     {
@@ -5031,14 +6302,20 @@
 #ifdef VK_KHR_external_semaphore_win32
 void count_VkImportSemaphoreWin32HandleInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImportSemaphoreWin32HandleInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(VkSemaphoreImportFlags);
@@ -5049,14 +6326,20 @@
 
 void count_VkExportSemaphoreWin32HandleInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExportSemaphoreWin32HandleInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     // WARNING PTR CHECK
     *count += 8;
     if (toCount->pAttributes)
@@ -5069,14 +6352,20 @@
 
 void count_VkD3D12FenceSubmitInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkD3D12FenceSubmitInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     // WARNING PTR CHECK
     *count += 8;
@@ -5101,14 +6390,20 @@
 
 void count_VkSemaphoreGetWin32HandleInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSemaphoreGetWin32HandleInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(VkExternalSemaphoreHandleTypeFlagBits);
@@ -5118,14 +6413,20 @@
 #ifdef VK_KHR_external_semaphore_fd
 void count_VkImportSemaphoreFdInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImportSemaphoreFdInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(VkSemaphoreImportFlags);
@@ -5135,14 +6436,20 @@
 
 void count_VkSemaphoreGetFdInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSemaphoreGetFdInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(VkExternalSemaphoreHandleTypeFlagBits);
@@ -5152,14 +6459,20 @@
 #ifdef VK_KHR_push_descriptor
 void count_VkPhysicalDevicePushDescriptorPropertiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDevicePushDescriptorPropertiesKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
 }
 
@@ -5171,23 +6484,27 @@
 #ifdef VK_KHR_incremental_present
 void count_VkRectLayerKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRectLayerKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
-    count_VkOffset2D(featureBits, (VkOffset2D*)(&toCount->offset), count);
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->extent), count);
+    count_VkOffset2D(featureBits, rootType, (VkOffset2D*)(&toCount->offset), count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->extent), count);
     *count += sizeof(uint32_t);
 }
 
 void count_VkPresentRegionKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPresentRegionKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -5199,7 +6516,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)toCount->rectangleCount; ++i)
             {
-                count_VkRectLayerKHR(featureBits, (const VkRectLayerKHR*)(toCount->pRectangles + i), count);
+                count_VkRectLayerKHR(featureBits, rootType, (const VkRectLayerKHR*)(toCount->pRectangles + i), count);
             }
         }
     }
@@ -5207,14 +6524,20 @@
 
 void count_VkPresentRegionsKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPresentRegionsKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     // WARNING PTR CHECK
     *count += 8;
@@ -5224,7 +6547,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)toCount->swapchainCount; ++i)
             {
-                count_VkPresentRegionKHR(featureBits, (const VkPresentRegionKHR*)(toCount->pRegions + i), count);
+                count_VkPresentRegionKHR(featureBits, rootType, (const VkPresentRegionKHR*)(toCount->pRegions + i), count);
             }
         }
     }
@@ -5240,14 +6563,20 @@
 #ifdef VK_KHR_shared_presentable_image
 void count_VkSharedPresentSurfaceCapabilitiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSharedPresentSurfaceCapabilitiesKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkImageUsageFlags);
 }
 
@@ -5259,14 +6588,20 @@
 #ifdef VK_KHR_external_fence_win32
 void count_VkImportFenceWin32HandleInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImportFenceWin32HandleInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(VkFenceImportFlags);
@@ -5277,14 +6612,20 @@
 
 void count_VkExportFenceWin32HandleInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExportFenceWin32HandleInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     // WARNING PTR CHECK
     *count += 8;
     if (toCount->pAttributes)
@@ -5297,14 +6638,20 @@
 
 void count_VkFenceGetWin32HandleInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkFenceGetWin32HandleInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(VkExternalFenceHandleTypeFlagBits);
@@ -5314,14 +6661,20 @@
 #ifdef VK_KHR_external_fence_fd
 void count_VkImportFenceFdInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImportFenceFdInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(VkFenceImportFlags);
@@ -5331,14 +6684,20 @@
 
 void count_VkFenceGetFdInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkFenceGetFdInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(VkExternalFenceHandleTypeFlagBits);
@@ -5348,41 +6707,59 @@
 #ifdef VK_KHR_performance_query
 void count_VkPhysicalDevicePerformanceQueryFeaturesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDevicePerformanceQueryFeaturesKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
 }
 
 void count_VkPhysicalDevicePerformanceQueryPropertiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDevicePerformanceQueryPropertiesKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkPerformanceCounterKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPerformanceCounterKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPerformanceCounterUnitKHR);
     *count += sizeof(VkPerformanceCounterScopeKHR);
     *count += sizeof(VkPerformanceCounterStorageKHR);
@@ -5391,14 +6768,20 @@
 
 void count_VkPerformanceCounterDescriptionKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPerformanceCounterDescriptionKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPerformanceCounterDescriptionFlagsKHR);
     *count += VK_MAX_DESCRIPTION_SIZE * sizeof(char);
     *count += VK_MAX_DESCRIPTION_SIZE * sizeof(char);
@@ -5407,14 +6790,20 @@
 
 void count_VkQueryPoolPerformanceCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkQueryPoolPerformanceCreateInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
     if (toCount)
@@ -5425,10 +6814,12 @@
 
 void count_VkPerformanceCounterResultKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPerformanceCounterResultKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(int32_t);
@@ -5436,28 +6827,40 @@
 
 void count_VkAcquireProfilingLockInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAcquireProfilingLockInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkAcquireProfilingLockFlagsKHR);
     *count += sizeof(uint64_t);
 }
 
 void count_VkPerformanceQuerySubmitInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPerformanceQuerySubmitInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
 }
 
@@ -5467,42 +6870,60 @@
 #ifdef VK_KHR_get_surface_capabilities2
 void count_VkPhysicalDeviceSurfaceInfo2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceSurfaceInfo2KHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
 }
 
 void count_VkSurfaceCapabilities2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSurfaceCapabilities2KHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkSurfaceCapabilitiesKHR(featureBits, (VkSurfaceCapabilitiesKHR*)(&toCount->surfaceCapabilities), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkSurfaceCapabilitiesKHR(featureBits, rootType, (VkSurfaceCapabilitiesKHR*)(&toCount->surfaceCapabilities), count);
 }
 
 void count_VkSurfaceFormat2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSurfaceFormat2KHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkSurfaceFormatKHR(featureBits, (VkSurfaceFormatKHR*)(&toCount->surfaceFormat), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkSurfaceFormatKHR(featureBits, rootType, (VkSurfaceFormatKHR*)(&toCount->surfaceFormat), count);
 }
 
 #endif
@@ -5511,53 +6932,77 @@
 #ifdef VK_KHR_get_display_properties2
 void count_VkDisplayProperties2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayProperties2KHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkDisplayPropertiesKHR(featureBits, (VkDisplayPropertiesKHR*)(&toCount->displayProperties), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkDisplayPropertiesKHR(featureBits, rootType, (VkDisplayPropertiesKHR*)(&toCount->displayProperties), count);
 }
 
 void count_VkDisplayPlaneProperties2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayPlaneProperties2KHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkDisplayPlanePropertiesKHR(featureBits, (VkDisplayPlanePropertiesKHR*)(&toCount->displayPlaneProperties), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkDisplayPlanePropertiesKHR(featureBits, rootType, (VkDisplayPlanePropertiesKHR*)(&toCount->displayPlaneProperties), count);
 }
 
 void count_VkDisplayModeProperties2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayModeProperties2KHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkDisplayModePropertiesKHR(featureBits, (VkDisplayModePropertiesKHR*)(&toCount->displayModeProperties), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkDisplayModePropertiesKHR(featureBits, rootType, (VkDisplayModePropertiesKHR*)(&toCount->displayModeProperties), count);
 }
 
 void count_VkDisplayPlaneInfo2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayPlaneInfo2KHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(uint32_t);
@@ -5565,15 +7010,21 @@
 
 void count_VkDisplayPlaneCapabilities2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayPlaneCapabilities2KHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkDisplayPlaneCapabilitiesKHR(featureBits, (VkDisplayPlaneCapabilitiesKHR*)(&toCount->capabilities), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkDisplayPlaneCapabilitiesKHR(featureBits, rootType, (VkDisplayPlaneCapabilitiesKHR*)(&toCount->capabilities), count);
 }
 
 #endif
@@ -5594,14 +7045,20 @@
 #ifdef VK_KHR_portability_subset
 void count_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDevicePortabilitySubsetFeaturesKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
@@ -5621,14 +7078,20 @@
 
 void count_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDevicePortabilitySubsetPropertiesKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
 }
 
@@ -5646,14 +7109,20 @@
 #ifdef VK_KHR_shader_clock
 void count_VkPhysicalDeviceShaderClockFeaturesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderClockFeaturesKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
 }
@@ -5674,14 +7143,20 @@
 #ifdef VK_KHR_shader_terminate_invocation
 void count_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
@@ -5689,42 +7164,60 @@
 #ifdef VK_KHR_fragment_shading_rate
 void count_VkFragmentShadingRateAttachmentInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkFragmentShadingRateAttachmentInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkAttachmentReference2(featureBits, (const VkAttachmentReference2*)(toCount->pFragmentShadingRateAttachment), count);
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->shadingRateAttachmentTexelSize), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkAttachmentReference2(featureBits, rootType, (const VkAttachmentReference2*)(toCount->pFragmentShadingRateAttachment), count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->shadingRateAttachmentTexelSize), count);
 }
 
 void count_VkPipelineFragmentShadingRateStateCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineFragmentShadingRateStateCreateInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->fragmentSize), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->fragmentSize), count);
     *count += 2 * sizeof(VkFragmentShadingRateCombinerOpKHR);
 }
 
 void count_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateFeaturesKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
@@ -5732,21 +7225,27 @@
 
 void count_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRatePropertiesKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->minFragmentShadingRateAttachmentTexelSize), count);
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->maxFragmentShadingRateAttachmentTexelSize), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->minFragmentShadingRateAttachmentTexelSize), count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->maxFragmentShadingRateAttachmentTexelSize), count);
     *count += sizeof(uint32_t);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->maxFragmentSize), count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->maxFragmentSize), count);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
     *count += sizeof(VkSampleCountFlagBits);
@@ -5761,16 +7260,22 @@
 
 void count_VkPhysicalDeviceFragmentShadingRateKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkSampleCountFlags);
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->fragmentSize), count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->fragmentSize), count);
 }
 
 #endif
@@ -5779,14 +7284,20 @@
 #ifdef VK_KHR_surface_protected_capabilities
 void count_VkSurfaceProtectedCapabilitiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSurfaceProtectedCapabilitiesKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
@@ -5802,41 +7313,59 @@
 #ifdef VK_KHR_pipeline_executable_properties
 void count_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkPipelineInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
 }
 
 void count_VkPipelineExecutablePropertiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineExecutablePropertiesKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkShaderStageFlags);
     *count += VK_MAX_DESCRIPTION_SIZE * sizeof(char);
     *count += VK_MAX_DESCRIPTION_SIZE * sizeof(char);
@@ -5845,14 +7374,20 @@
 
 void count_VkPipelineExecutableInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineExecutableInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(uint32_t);
@@ -5860,10 +7395,12 @@
 
 void count_VkPipelineExecutableStatisticValueKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineExecutableStatisticValueKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkBool32);
@@ -5871,30 +7408,42 @@
 
 void count_VkPipelineExecutableStatisticKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineExecutableStatisticKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += VK_MAX_DESCRIPTION_SIZE * sizeof(char);
     *count += VK_MAX_DESCRIPTION_SIZE * sizeof(char);
     *count += sizeof(VkPipelineExecutableStatisticFormatKHR);
-    count_VkPipelineExecutableStatisticValueKHR(featureBits, (VkPipelineExecutableStatisticValueKHR*)(&toCount->value), count);
+    count_VkPipelineExecutableStatisticValueKHR(featureBits, rootType, (VkPipelineExecutableStatisticValueKHR*)(&toCount->value), count);
 }
 
 void count_VkPipelineExecutableInternalRepresentationKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineExecutableInternalRepresentationKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += VK_MAX_DESCRIPTION_SIZE * sizeof(char);
     *count += VK_MAX_DESCRIPTION_SIZE * sizeof(char);
     *count += sizeof(VkBool32);
@@ -5914,14 +7463,20 @@
 #ifdef VK_KHR_pipeline_library
 void count_VkPipelineLibraryCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineLibraryCreateInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     if (toCount->libraryCount)
     {
@@ -5935,14 +7490,20 @@
 #ifdef VK_KHR_copy_commands2
 void count_VkBufferCopy2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBufferCopy2KHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDeviceSize);
     *count += sizeof(VkDeviceSize);
     *count += sizeof(VkDeviceSize);
@@ -5950,14 +7511,20 @@
 
 void count_VkCopyBufferInfo2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCopyBufferInfo2KHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     uint64_t cgen_var_1;
@@ -5967,38 +7534,50 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->regionCount; ++i)
         {
-            count_VkBufferCopy2KHR(featureBits, (const VkBufferCopy2KHR*)(toCount->pRegions + i), count);
+            count_VkBufferCopy2KHR(featureBits, rootType, (const VkBufferCopy2KHR*)(toCount->pRegions + i), count);
         }
     }
 }
 
 void count_VkImageCopy2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageCopy2KHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkImageSubresourceLayers(featureBits, (VkImageSubresourceLayers*)(&toCount->srcSubresource), count);
-    count_VkOffset3D(featureBits, (VkOffset3D*)(&toCount->srcOffset), count);
-    count_VkImageSubresourceLayers(featureBits, (VkImageSubresourceLayers*)(&toCount->dstSubresource), count);
-    count_VkOffset3D(featureBits, (VkOffset3D*)(&toCount->dstOffset), count);
-    count_VkExtent3D(featureBits, (VkExtent3D*)(&toCount->extent), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkImageSubresourceLayers(featureBits, rootType, (VkImageSubresourceLayers*)(&toCount->srcSubresource), count);
+    count_VkOffset3D(featureBits, rootType, (VkOffset3D*)(&toCount->srcOffset), count);
+    count_VkImageSubresourceLayers(featureBits, rootType, (VkImageSubresourceLayers*)(&toCount->dstSubresource), count);
+    count_VkOffset3D(featureBits, rootType, (VkOffset3D*)(&toCount->dstOffset), count);
+    count_VkExtent3D(featureBits, rootType, (VkExtent3D*)(&toCount->extent), count);
 }
 
 void count_VkCopyImageInfo2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCopyImageInfo2KHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(VkImageLayout);
@@ -6010,39 +7589,51 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->regionCount; ++i)
         {
-            count_VkImageCopy2KHR(featureBits, (const VkImageCopy2KHR*)(toCount->pRegions + i), count);
+            count_VkImageCopy2KHR(featureBits, rootType, (const VkImageCopy2KHR*)(toCount->pRegions + i), count);
         }
     }
 }
 
 void count_VkBufferImageCopy2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBufferImageCopy2KHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDeviceSize);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
-    count_VkImageSubresourceLayers(featureBits, (VkImageSubresourceLayers*)(&toCount->imageSubresource), count);
-    count_VkOffset3D(featureBits, (VkOffset3D*)(&toCount->imageOffset), count);
-    count_VkExtent3D(featureBits, (VkExtent3D*)(&toCount->imageExtent), count);
+    count_VkImageSubresourceLayers(featureBits, rootType, (VkImageSubresourceLayers*)(&toCount->imageSubresource), count);
+    count_VkOffset3D(featureBits, rootType, (VkOffset3D*)(&toCount->imageOffset), count);
+    count_VkExtent3D(featureBits, rootType, (VkExtent3D*)(&toCount->imageExtent), count);
 }
 
 void count_VkCopyBufferToImageInfo2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCopyBufferToImageInfo2KHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     uint64_t cgen_var_1;
@@ -6053,21 +7644,27 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->regionCount; ++i)
         {
-            count_VkBufferImageCopy2KHR(featureBits, (const VkBufferImageCopy2KHR*)(toCount->pRegions + i), count);
+            count_VkBufferImageCopy2KHR(featureBits, rootType, (const VkBufferImageCopy2KHR*)(toCount->pRegions + i), count);
         }
     }
 }
 
 void count_VkCopyImageToBufferInfo2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCopyImageToBufferInfo2KHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(VkImageLayout);
@@ -6078,43 +7675,55 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->regionCount; ++i)
         {
-            count_VkBufferImageCopy2KHR(featureBits, (const VkBufferImageCopy2KHR*)(toCount->pRegions + i), count);
+            count_VkBufferImageCopy2KHR(featureBits, rootType, (const VkBufferImageCopy2KHR*)(toCount->pRegions + i), count);
         }
     }
 }
 
 void count_VkImageBlit2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageBlit2KHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkImageSubresourceLayers(featureBits, (VkImageSubresourceLayers*)(&toCount->srcSubresource), count);
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
     {
-        count_VkOffset3D(featureBits, (VkOffset3D*)(toCount->srcOffsets + i), count);
+        rootType = toCount->sType;
     }
-    count_VkImageSubresourceLayers(featureBits, (VkImageSubresourceLayers*)(&toCount->dstSubresource), count);
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkImageSubresourceLayers(featureBits, rootType, (VkImageSubresourceLayers*)(&toCount->srcSubresource), count);
     for (uint32_t i = 0; i < (uint32_t)2; ++i)
     {
-        count_VkOffset3D(featureBits, (VkOffset3D*)(toCount->dstOffsets + i), count);
+        count_VkOffset3D(featureBits, rootType, (VkOffset3D*)(toCount->srcOffsets + i), count);
+    }
+    count_VkImageSubresourceLayers(featureBits, rootType, (VkImageSubresourceLayers*)(&toCount->dstSubresource), count);
+    for (uint32_t i = 0; i < (uint32_t)2; ++i)
+    {
+        count_VkOffset3D(featureBits, rootType, (VkOffset3D*)(toCount->dstOffsets + i), count);
     }
 }
 
 void count_VkBlitImageInfo2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBlitImageInfo2KHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(VkImageLayout);
@@ -6126,7 +7735,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->regionCount; ++i)
         {
-            count_VkImageBlit2KHR(featureBits, (const VkImageBlit2KHR*)(toCount->pRegions + i), count);
+            count_VkImageBlit2KHR(featureBits, rootType, (const VkImageBlit2KHR*)(toCount->pRegions + i), count);
         }
     }
     *count += sizeof(VkFilter);
@@ -6134,31 +7743,43 @@
 
 void count_VkImageResolve2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageResolve2KHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkImageSubresourceLayers(featureBits, (VkImageSubresourceLayers*)(&toCount->srcSubresource), count);
-    count_VkOffset3D(featureBits, (VkOffset3D*)(&toCount->srcOffset), count);
-    count_VkImageSubresourceLayers(featureBits, (VkImageSubresourceLayers*)(&toCount->dstSubresource), count);
-    count_VkOffset3D(featureBits, (VkOffset3D*)(&toCount->dstOffset), count);
-    count_VkExtent3D(featureBits, (VkExtent3D*)(&toCount->extent), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkImageSubresourceLayers(featureBits, rootType, (VkImageSubresourceLayers*)(&toCount->srcSubresource), count);
+    count_VkOffset3D(featureBits, rootType, (VkOffset3D*)(&toCount->srcOffset), count);
+    count_VkImageSubresourceLayers(featureBits, rootType, (VkImageSubresourceLayers*)(&toCount->dstSubresource), count);
+    count_VkOffset3D(featureBits, rootType, (VkOffset3D*)(&toCount->dstOffset), count);
+    count_VkExtent3D(featureBits, rootType, (VkExtent3D*)(&toCount->extent), count);
 }
 
 void count_VkResolveImageInfo2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkResolveImageInfo2KHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(VkImageLayout);
@@ -6170,7 +7791,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->regionCount; ++i)
         {
-            count_VkImageResolve2KHR(featureBits, (const VkImageResolve2KHR*)(toCount->pRegions + i), count);
+            count_VkImageResolve2KHR(featureBits, rootType, (const VkImageResolve2KHR*)(toCount->pRegions + i), count);
         }
     }
 }
@@ -6179,14 +7800,20 @@
 #ifdef VK_ANDROID_native_buffer
 void count_VkNativeBufferANDROID(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkNativeBufferANDROID* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     // WARNING PTR CHECK
     *count += 8;
     if (toCount->handle)
@@ -6204,14 +7831,20 @@
 #ifdef VK_EXT_debug_report
 void count_VkDebugReportCallbackCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDebugReportCallbackCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDebugReportFlagsEXT);
     *count += 8;
     // WARNING PTR CHECK
@@ -6232,14 +7865,20 @@
 #ifdef VK_AMD_rasterization_order
 void count_VkPipelineRasterizationStateRasterizationOrderAMD(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineRasterizationStateRasterizationOrderAMD* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkRasterizationOrderAMD);
 }
 
@@ -6251,14 +7890,20 @@
 #ifdef VK_EXT_debug_marker
 void count_VkDebugMarkerObjectNameInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDebugMarkerObjectNameInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDebugReportObjectTypeEXT);
     *count += sizeof(uint64_t);
     *count += sizeof(uint32_t) + (toCount->pObjectName ? strlen(toCount->pObjectName) : 0);
@@ -6266,14 +7911,20 @@
 
 void count_VkDebugMarkerObjectTagInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDebugMarkerObjectTagInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDebugReportObjectTypeEXT);
     *count += sizeof(uint64_t);
     *count += sizeof(uint64_t);
@@ -6286,14 +7937,20 @@
 
 void count_VkDebugMarkerMarkerInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDebugMarkerMarkerInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t) + (toCount->pMarkerName ? strlen(toCount->pMarkerName) : 0);
     *count += 4 * sizeof(float);
 }
@@ -6304,40 +7961,58 @@
 #ifdef VK_NV_dedicated_allocation
 void count_VkDedicatedAllocationImageCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDedicatedAllocationImageCreateInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkDedicatedAllocationBufferCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDedicatedAllocationBufferCreateInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkDedicatedAllocationMemoryAllocateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDedicatedAllocationMemoryAllocateInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     uint64_t cgen_var_1;
@@ -6348,28 +8023,40 @@
 #ifdef VK_EXT_transform_feedback
 void count_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceTransformFeedbackFeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
 }
 
 void count_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceTransformFeedbackPropertiesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
     *count += sizeof(VkDeviceSize);
@@ -6384,14 +8071,20 @@
 
 void count_VkPipelineRasterizationStateStreamCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineRasterizationStateStreamCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineRasterizationStateStreamCreateFlagsEXT);
     *count += sizeof(uint32_t);
 }
@@ -6400,14 +8093,20 @@
 #ifdef VK_NVX_image_view_handle
 void count_VkImageViewHandleInfoNVX(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageViewHandleInfoNVX* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(VkDescriptorType);
@@ -6417,14 +8116,20 @@
 
 void count_VkImageViewAddressPropertiesNVX(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageViewAddressPropertiesNVX* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDeviceAddress);
     *count += sizeof(VkDeviceSize);
 }
@@ -6441,14 +8146,20 @@
 #ifdef VK_AMD_texture_gather_bias_lod
 void count_VkTextureLODGatherFormatPropertiesAMD(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkTextureLODGatherFormatPropertiesAMD* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
@@ -6456,10 +8167,12 @@
 #ifdef VK_AMD_shader_info
 void count_VkShaderResourceUsageAMD(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkShaderResourceUsageAMD* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -6471,14 +8184,16 @@
 
 void count_VkShaderStatisticsInfoAMD(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkShaderStatisticsInfoAMD* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkShaderStageFlags);
-    count_VkShaderResourceUsageAMD(featureBits, (VkShaderResourceUsageAMD*)(&toCount->resourceUsage), count);
+    count_VkShaderResourceUsageAMD(featureBits, rootType, (VkShaderResourceUsageAMD*)(&toCount->resourceUsage), count);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
@@ -6492,14 +8207,20 @@
 #ifdef VK_GGP_stream_descriptor_surface
 void count_VkStreamDescriptorSurfaceCreateInfoGGP(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkStreamDescriptorSurfaceCreateInfoGGP* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkStreamDescriptorSurfaceCreateFlagsGGP);
     *count += sizeof(GgpStreamDescriptor);
 }
@@ -6508,14 +8229,20 @@
 #ifdef VK_NV_corner_sampled_image
 void count_VkPhysicalDeviceCornerSampledImageFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceCornerSampledImageFeaturesNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
@@ -6525,13 +8252,15 @@
 #ifdef VK_NV_external_memory_capabilities
 void count_VkExternalImageFormatPropertiesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExternalImageFormatPropertiesNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
-    count_VkImageFormatProperties(featureBits, (VkImageFormatProperties*)(&toCount->imageFormatProperties), count);
+    count_VkImageFormatProperties(featureBits, rootType, (VkImageFormatProperties*)(&toCount->imageFormatProperties), count);
     *count += sizeof(VkExternalMemoryFeatureFlagsNV);
     *count += sizeof(VkExternalMemoryHandleTypeFlagsNV);
     *count += sizeof(VkExternalMemoryHandleTypeFlagsNV);
@@ -6541,27 +8270,39 @@
 #ifdef VK_NV_external_memory
 void count_VkExternalMemoryImageCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExternalMemoryImageCreateInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkExternalMemoryHandleTypeFlagsNV);
 }
 
 void count_VkExportMemoryAllocateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExportMemoryAllocateInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkExternalMemoryHandleTypeFlagsNV);
 }
 
@@ -6569,28 +8310,40 @@
 #ifdef VK_NV_external_memory_win32
 void count_VkImportMemoryWin32HandleInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImportMemoryWin32HandleInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkExternalMemoryHandleTypeFlagsNV);
     *count += sizeof(HANDLE);
 }
 
 void count_VkExportMemoryWin32HandleInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExportMemoryWin32HandleInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     // WARNING PTR CHECK
     *count += 8;
     if (toCount->pAttributes)
@@ -6604,14 +8357,20 @@
 #ifdef VK_NV_win32_keyed_mutex
 void count_VkWin32KeyedMutexAcquireReleaseInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkWin32KeyedMutexAcquireReleaseInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     if (toCount->acquireCount)
     {
@@ -6640,14 +8399,20 @@
 #ifdef VK_EXT_validation_flags
 void count_VkValidationFlagsEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkValidationFlagsEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     if (toCount)
     {
@@ -6659,14 +8424,20 @@
 #ifdef VK_NN_vi_surface
 void count_VkViSurfaceCreateInfoNN(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkViSurfaceCreateInfoNN* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkViSurfaceCreateFlagsNN);
     // WARNING PTR CHECK
     *count += 8;
@@ -6684,14 +8455,20 @@
 #ifdef VK_EXT_texture_compression_astc_hdr
 void count_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
@@ -6699,27 +8476,39 @@
 #ifdef VK_EXT_astc_decode_mode
 void count_VkImageViewASTCDecodeModeEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageViewASTCDecodeModeEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkFormat);
 }
 
 void count_VkPhysicalDeviceASTCDecodeFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceASTCDecodeFeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
@@ -6727,14 +8516,20 @@
 #ifdef VK_EXT_conditional_rendering
 void count_VkConditionalRenderingBeginInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkConditionalRenderingBeginInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(VkDeviceSize);
@@ -6743,28 +8538,40 @@
 
 void count_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceConditionalRenderingFeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
 }
 
 void count_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCommandBufferInheritanceConditionalRenderingInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
@@ -6772,10 +8579,12 @@
 #ifdef VK_NV_clip_space_w_scaling
 void count_VkViewportWScalingNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkViewportWScalingNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(float);
@@ -6784,14 +8593,20 @@
 
 void count_VkPipelineViewportWScalingStateCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineViewportWScalingStateCreateInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(uint32_t);
     // WARNING PTR CHECK
@@ -6802,7 +8617,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)toCount->viewportCount; ++i)
             {
-                count_VkViewportWScalingNV(featureBits, (const VkViewportWScalingNV*)(toCount->pViewportWScalings + i), count);
+                count_VkViewportWScalingNV(featureBits, rootType, (const VkViewportWScalingNV*)(toCount->pViewportWScalings + i), count);
             }
         }
     }
@@ -6816,19 +8631,25 @@
 #ifdef VK_EXT_display_surface_counter
 void count_VkSurfaceCapabilities2EXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSurfaceCapabilities2EXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->currentExtent), count);
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->minImageExtent), count);
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->maxImageExtent), count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->currentExtent), count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->minImageExtent), count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->maxImageExtent), count);
     *count += sizeof(uint32_t);
     *count += sizeof(VkSurfaceTransformFlagsKHR);
     *count += sizeof(VkSurfaceTransformFlagBitsKHR);
@@ -6841,53 +8662,77 @@
 #ifdef VK_EXT_display_control
 void count_VkDisplayPowerInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayPowerInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDisplayPowerStateEXT);
 }
 
 void count_VkDeviceEventInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceEventInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDeviceEventTypeEXT);
 }
 
 void count_VkDisplayEventInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayEventInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDisplayEventTypeEXT);
 }
 
 void count_VkSwapchainCounterCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSwapchainCounterCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkSurfaceCounterFlagsEXT);
 }
 
@@ -6895,10 +8740,12 @@
 #ifdef VK_GOOGLE_display_timing
 void count_VkRefreshCycleDurationGOOGLE(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRefreshCycleDurationGOOGLE* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint64_t);
@@ -6906,10 +8753,12 @@
 
 void count_VkPastPresentationTimingGOOGLE(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPastPresentationTimingGOOGLE* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -6921,10 +8770,12 @@
 
 void count_VkPresentTimeGOOGLE(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPresentTimeGOOGLE* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -6933,14 +8784,20 @@
 
 void count_VkPresentTimesInfoGOOGLE(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPresentTimesInfoGOOGLE* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     // WARNING PTR CHECK
     *count += 8;
@@ -6950,7 +8807,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)toCount->swapchainCount; ++i)
             {
-                count_VkPresentTimeGOOGLE(featureBits, (const VkPresentTimeGOOGLE*)(toCount->pTimes + i), count);
+                count_VkPresentTimeGOOGLE(featureBits, rootType, (const VkPresentTimeGOOGLE*)(toCount->pTimes + i), count);
             }
         }
     }
@@ -6966,14 +8823,20 @@
 #ifdef VK_NVX_multiview_per_view_attributes
 void count_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
@@ -6981,10 +8844,12 @@
 #ifdef VK_NV_viewport_swizzle
 void count_VkViewportSwizzleNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkViewportSwizzleNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkViewportCoordinateSwizzleNV);
@@ -6995,14 +8860,20 @@
 
 void count_VkPipelineViewportSwizzleStateCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineViewportSwizzleStateCreateInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineViewportSwizzleStateCreateFlagsNV);
     *count += sizeof(uint32_t);
     // WARNING PTR CHECK
@@ -7013,7 +8884,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)toCount->viewportCount; ++i)
             {
-                count_VkViewportSwizzleNV(featureBits, (const VkViewportSwizzleNV*)(toCount->pViewportSwizzles + i), count);
+                count_VkViewportSwizzleNV(featureBits, rootType, (const VkViewportSwizzleNV*)(toCount->pViewportSwizzles + i), count);
             }
         }
     }
@@ -7023,27 +8894,39 @@
 #ifdef VK_EXT_discard_rectangles
 void count_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceDiscardRectanglePropertiesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
 }
 
 void count_VkPipelineDiscardRectangleStateCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineDiscardRectangleStateCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineDiscardRectangleStateCreateFlagsEXT);
     *count += sizeof(VkDiscardRectangleModeEXT);
     *count += sizeof(uint32_t);
@@ -7055,7 +8938,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)toCount->discardRectangleCount; ++i)
             {
-                count_VkRect2D(featureBits, (const VkRect2D*)(toCount->pDiscardRectangles + i), count);
+                count_VkRect2D(featureBits, rootType, (const VkRect2D*)(toCount->pDiscardRectangles + i), count);
             }
         }
     }
@@ -7065,14 +8948,20 @@
 #ifdef VK_EXT_conservative_rasterization
 void count_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceConservativeRasterizationPropertiesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(float);
     *count += sizeof(float);
     *count += sizeof(float);
@@ -7086,14 +8975,20 @@
 
 void count_VkPipelineRasterizationConservativeStateCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineRasterizationConservativeStateCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineRasterizationConservativeStateCreateFlagsEXT);
     *count += sizeof(VkConservativeRasterizationModeEXT);
     *count += sizeof(float);
@@ -7103,27 +8998,39 @@
 #ifdef VK_EXT_depth_clip_enable
 void count_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceDepthClipEnableFeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineRasterizationDepthClipStateCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineRasterizationDepthClipStateCreateFlagsEXT);
     *count += sizeof(VkBool32);
 }
@@ -7134,10 +9041,12 @@
 #ifdef VK_EXT_hdr_metadata
 void count_VkXYColorEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkXYColorEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(float);
@@ -7146,18 +9055,24 @@
 
 void count_VkHdrMetadataEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkHdrMetadataEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkXYColorEXT(featureBits, (VkXYColorEXT*)(&toCount->displayPrimaryRed), count);
-    count_VkXYColorEXT(featureBits, (VkXYColorEXT*)(&toCount->displayPrimaryGreen), count);
-    count_VkXYColorEXT(featureBits, (VkXYColorEXT*)(&toCount->displayPrimaryBlue), count);
-    count_VkXYColorEXT(featureBits, (VkXYColorEXT*)(&toCount->whitePoint), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkXYColorEXT(featureBits, rootType, (VkXYColorEXT*)(&toCount->displayPrimaryRed), count);
+    count_VkXYColorEXT(featureBits, rootType, (VkXYColorEXT*)(&toCount->displayPrimaryGreen), count);
+    count_VkXYColorEXT(featureBits, rootType, (VkXYColorEXT*)(&toCount->displayPrimaryBlue), count);
+    count_VkXYColorEXT(featureBits, rootType, (VkXYColorEXT*)(&toCount->whitePoint), count);
     *count += sizeof(float);
     *count += sizeof(float);
     *count += sizeof(float);
@@ -7168,14 +9083,20 @@
 #ifdef VK_MVK_ios_surface
 void count_VkIOSSurfaceCreateInfoMVK(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkIOSSurfaceCreateInfoMVK* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkIOSSurfaceCreateFlagsMVK);
     // WARNING PTR CHECK
     *count += 8;
@@ -7189,14 +9110,20 @@
 #ifdef VK_MVK_macos_surface
 void count_VkMacOSSurfaceCreateInfoMVK(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMacOSSurfaceCreateInfoMVK* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkMacOSSurfaceCreateFlagsMVK);
     // WARNING PTR CHECK
     *count += 8;
@@ -7216,28 +9143,40 @@
 #ifdef VK_EXT_debug_utils
 void count_VkDebugUtilsLabelEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDebugUtilsLabelEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t) + (toCount->pLabelName ? strlen(toCount->pLabelName) : 0);
     *count += 4 * sizeof(float);
 }
 
 void count_VkDebugUtilsObjectNameInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDebugUtilsObjectNameInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkObjectType);
     *count += sizeof(uint64_t);
     if (featureBits & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
@@ -7257,14 +9196,20 @@
 
 void count_VkDebugUtilsMessengerCallbackDataEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDebugUtilsMessengerCallbackDataEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDebugUtilsMessengerCallbackDataFlagsEXT);
     if (featureBits & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
     {
@@ -7290,7 +9235,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)toCount->queueLabelCount; ++i)
             {
-                count_VkDebugUtilsLabelEXT(featureBits, (VkDebugUtilsLabelEXT*)(toCount->pQueueLabels + i), count);
+                count_VkDebugUtilsLabelEXT(featureBits, rootType, (VkDebugUtilsLabelEXT*)(toCount->pQueueLabels + i), count);
             }
         }
     }
@@ -7303,7 +9248,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)toCount->cmdBufLabelCount; ++i)
             {
-                count_VkDebugUtilsLabelEXT(featureBits, (VkDebugUtilsLabelEXT*)(toCount->pCmdBufLabels + i), count);
+                count_VkDebugUtilsLabelEXT(featureBits, rootType, (VkDebugUtilsLabelEXT*)(toCount->pCmdBufLabels + i), count);
             }
         }
     }
@@ -7316,7 +9261,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)toCount->objectCount; ++i)
             {
-                count_VkDebugUtilsObjectNameInfoEXT(featureBits, (VkDebugUtilsObjectNameInfoEXT*)(toCount->pObjects + i), count);
+                count_VkDebugUtilsObjectNameInfoEXT(featureBits, rootType, (VkDebugUtilsObjectNameInfoEXT*)(toCount->pObjects + i), count);
             }
         }
     }
@@ -7324,14 +9269,20 @@
 
 void count_VkDebugUtilsMessengerCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDebugUtilsMessengerCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDebugUtilsMessengerCreateFlagsEXT);
     *count += sizeof(VkDebugUtilsMessageSeverityFlagsEXT);
     *count += sizeof(VkDebugUtilsMessageTypeFlagsEXT);
@@ -7346,14 +9297,20 @@
 
 void count_VkDebugUtilsObjectTagInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDebugUtilsObjectTagInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkObjectType);
     *count += sizeof(uint64_t);
     *count += sizeof(uint64_t);
@@ -7368,45 +9325,63 @@
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
 void count_VkAndroidHardwareBufferUsageANDROID(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAndroidHardwareBufferUsageANDROID* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint64_t);
 }
 
 void count_VkAndroidHardwareBufferPropertiesANDROID(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAndroidHardwareBufferPropertiesANDROID* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDeviceSize);
     *count += sizeof(uint32_t);
 }
 
 void count_VkAndroidHardwareBufferFormatPropertiesANDROID(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAndroidHardwareBufferFormatPropertiesANDROID* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkFormat);
     *count += sizeof(uint64_t);
     *count += sizeof(VkFormatFeatureFlags);
-    count_VkComponentMapping(featureBits, (VkComponentMapping*)(&toCount->samplerYcbcrConversionComponents), count);
+    count_VkComponentMapping(featureBits, rootType, (VkComponentMapping*)(&toCount->samplerYcbcrConversionComponents), count);
     *count += sizeof(VkSamplerYcbcrModelConversion);
     *count += sizeof(VkSamplerYcbcrRange);
     *count += sizeof(VkChromaLocation);
@@ -7415,41 +9390,59 @@
 
 void count_VkImportAndroidHardwareBufferInfoANDROID(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImportAndroidHardwareBufferInfoANDROID* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(AHardwareBuffer);
 }
 
 void count_VkMemoryGetAndroidHardwareBufferInfoANDROID(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryGetAndroidHardwareBufferInfoANDROID* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
 }
 
 void count_VkExternalFormatANDROID(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExternalFormatANDROID* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint64_t);
 }
 
@@ -7465,28 +9458,40 @@
 #ifdef VK_EXT_inline_uniform_block
 void count_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceInlineUniformBlockFeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
 }
 
 void count_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceInlineUniformBlockPropertiesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
@@ -7496,14 +9501,20 @@
 
 void count_VkWriteDescriptorSetInlineUniformBlockEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkWriteDescriptorSetInlineUniformBlockEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     if (toCount)
     {
@@ -7513,14 +9524,20 @@
 
 void count_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorPoolInlineUniformBlockCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
 }
 
@@ -7530,10 +9547,12 @@
 #ifdef VK_EXT_sample_locations
 void count_VkSampleLocationEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSampleLocationEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(float);
@@ -7542,66 +9561,82 @@
 
 void count_VkSampleLocationsInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSampleLocationsInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkSampleCountFlagBits);
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->sampleLocationGridSize), count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->sampleLocationGridSize), count);
     *count += sizeof(uint32_t);
     if (toCount)
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->sampleLocationsCount; ++i)
         {
-            count_VkSampleLocationEXT(featureBits, (const VkSampleLocationEXT*)(toCount->pSampleLocations + i), count);
+            count_VkSampleLocationEXT(featureBits, rootType, (const VkSampleLocationEXT*)(toCount->pSampleLocations + i), count);
         }
     }
 }
 
 void count_VkAttachmentSampleLocationsEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAttachmentSampleLocationsEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
-    count_VkSampleLocationsInfoEXT(featureBits, (VkSampleLocationsInfoEXT*)(&toCount->sampleLocationsInfo), count);
+    count_VkSampleLocationsInfoEXT(featureBits, rootType, (VkSampleLocationsInfoEXT*)(&toCount->sampleLocationsInfo), count);
 }
 
 void count_VkSubpassSampleLocationsEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSubpassSampleLocationsEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
-    count_VkSampleLocationsInfoEXT(featureBits, (VkSampleLocationsInfoEXT*)(&toCount->sampleLocationsInfo), count);
+    count_VkSampleLocationsInfoEXT(featureBits, rootType, (VkSampleLocationsInfoEXT*)(&toCount->sampleLocationsInfo), count);
 }
 
 void count_VkRenderPassSampleLocationsBeginInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRenderPassSampleLocationsBeginInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     if (toCount)
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->attachmentInitialSampleLocationsCount; ++i)
         {
-            count_VkAttachmentSampleLocationsEXT(featureBits, (const VkAttachmentSampleLocationsEXT*)(toCount->pAttachmentInitialSampleLocations + i), count);
+            count_VkAttachmentSampleLocationsEXT(featureBits, rootType, (const VkAttachmentSampleLocationsEXT*)(toCount->pAttachmentInitialSampleLocations + i), count);
         }
     }
     *count += sizeof(uint32_t);
@@ -7609,37 +9644,49 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->postSubpassSampleLocationsCount; ++i)
         {
-            count_VkSubpassSampleLocationsEXT(featureBits, (const VkSubpassSampleLocationsEXT*)(toCount->pPostSubpassSampleLocations + i), count);
+            count_VkSubpassSampleLocationsEXT(featureBits, rootType, (const VkSubpassSampleLocationsEXT*)(toCount->pPostSubpassSampleLocations + i), count);
         }
     }
 }
 
 void count_VkPipelineSampleLocationsStateCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineSampleLocationsStateCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
-    count_VkSampleLocationsInfoEXT(featureBits, (VkSampleLocationsInfoEXT*)(&toCount->sampleLocationsInfo), count);
+    count_VkSampleLocationsInfoEXT(featureBits, rootType, (VkSampleLocationsInfoEXT*)(&toCount->sampleLocationsInfo), count);
 }
 
 void count_VkPhysicalDeviceSampleLocationsPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceSampleLocationsPropertiesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkSampleCountFlags);
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->maxSampleLocationGridSize), count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->maxSampleLocationGridSize), count);
     *count += 2 * sizeof(float);
     *count += sizeof(uint32_t);
     *count += sizeof(VkBool32);
@@ -7647,42 +9694,60 @@
 
 void count_VkMultisamplePropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMultisamplePropertiesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->maxSampleLocationGridSize), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->maxSampleLocationGridSize), count);
 }
 
 #endif
 #ifdef VK_EXT_blend_operation_advanced
 void count_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
@@ -7693,14 +9758,20 @@
 
 void count_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineColorBlendAdvancedStateCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBlendOverlapEXT);
@@ -7710,14 +9781,20 @@
 #ifdef VK_NV_fragment_coverage_to_color
 void count_VkPipelineCoverageToColorStateCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineCoverageToColorStateCreateInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineCoverageToColorStateCreateFlagsNV);
     *count += sizeof(VkBool32);
     *count += sizeof(uint32_t);
@@ -7727,14 +9804,20 @@
 #ifdef VK_NV_framebuffer_mixed_samples
 void count_VkPipelineCoverageModulationStateCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineCoverageModulationStateCreateInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineCoverageModulationStateCreateFlagsNV);
     *count += sizeof(VkCoverageModulationModeNV);
     *count += sizeof(VkBool32);
@@ -7756,28 +9839,40 @@
 #ifdef VK_NV_shader_sm_builtins
 void count_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
 }
 
 void count_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
@@ -7787,10 +9882,12 @@
 #ifdef VK_EXT_image_drm_format_modifier
 void count_VkDrmFormatModifierPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDrmFormatModifierPropertiesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint64_t);
@@ -7800,14 +9897,20 @@
 
 void count_VkDrmFormatModifierPropertiesListEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDrmFormatModifierPropertiesListEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     // WARNING PTR CHECK
     *count += 8;
@@ -7817,7 +9920,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)toCount->drmFormatModifierCount; ++i)
             {
-                count_VkDrmFormatModifierPropertiesEXT(featureBits, (VkDrmFormatModifierPropertiesEXT*)(toCount->pDrmFormatModifierProperties + i), count);
+                count_VkDrmFormatModifierPropertiesEXT(featureBits, rootType, (VkDrmFormatModifierPropertiesEXT*)(toCount->pDrmFormatModifierProperties + i), count);
             }
         }
     }
@@ -7825,14 +9928,20 @@
 
 void count_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageDrmFormatModifierInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint64_t);
     *count += sizeof(VkSharingMode);
     *count += sizeof(uint32_t);
@@ -7849,14 +9958,20 @@
 
 void count_VkImageDrmFormatModifierListCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageDrmFormatModifierListCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     if (toCount)
     {
@@ -7866,35 +9981,47 @@
 
 void count_VkImageDrmFormatModifierExplicitCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageDrmFormatModifierExplicitCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint64_t);
     *count += sizeof(uint32_t);
     if (toCount)
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->drmFormatModifierPlaneCount; ++i)
         {
-            count_VkSubresourceLayout(featureBits, (const VkSubresourceLayout*)(toCount->pPlaneLayouts + i), count);
+            count_VkSubresourceLayout(featureBits, rootType, (const VkSubresourceLayout*)(toCount->pPlaneLayouts + i), count);
         }
     }
 }
 
 void count_VkImageDrmFormatModifierPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageDrmFormatModifierPropertiesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint64_t);
 }
 
@@ -7902,14 +10029,20 @@
 #ifdef VK_EXT_validation_cache
 void count_VkValidationCacheCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkValidationCacheCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkValidationCacheCreateFlagsEXT);
     *count += 8;
     if (toCount)
@@ -7920,14 +10053,20 @@
 
 void count_VkShaderModuleValidationCacheCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkShaderModuleValidationCacheCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
 }
@@ -7940,10 +10079,12 @@
 #ifdef VK_NV_shading_rate_image
 void count_VkShadingRatePaletteNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkShadingRatePaletteNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -7955,14 +10096,20 @@
 
 void count_VkPipelineViewportShadingRateImageStateCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineViewportShadingRateImageStateCreateInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(uint32_t);
     // WARNING PTR CHECK
@@ -7973,7 +10120,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)toCount->viewportCount; ++i)
             {
-                count_VkShadingRatePaletteNV(featureBits, (const VkShadingRatePaletteNV*)(toCount->pShadingRatePalettes + i), count);
+                count_VkShadingRatePaletteNV(featureBits, rootType, (const VkShadingRatePaletteNV*)(toCount->pShadingRatePalettes + i), count);
             }
         }
     }
@@ -7981,39 +10128,53 @@
 
 void count_VkPhysicalDeviceShadingRateImageFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShadingRateImageFeaturesNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
 }
 
 void count_VkPhysicalDeviceShadingRateImagePropertiesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShadingRateImagePropertiesNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->shadingRateTexelSize), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->shadingRateTexelSize), count);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
 }
 
 void count_VkCoarseSampleLocationNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCoarseSampleLocationNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -8023,10 +10184,12 @@
 
 void count_VkCoarseSampleOrderCustomNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCoarseSampleOrderCustomNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkShadingRatePaletteEntryNV);
@@ -8036,28 +10199,34 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->sampleLocationCount; ++i)
         {
-            count_VkCoarseSampleLocationNV(featureBits, (const VkCoarseSampleLocationNV*)(toCount->pSampleLocations + i), count);
+            count_VkCoarseSampleLocationNV(featureBits, rootType, (const VkCoarseSampleLocationNV*)(toCount->pSampleLocations + i), count);
         }
     }
 }
 
 void count_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkCoarseSampleOrderTypeNV);
     *count += sizeof(uint32_t);
     if (toCount)
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->customSampleOrderCount; ++i)
         {
-            count_VkCoarseSampleOrderCustomNV(featureBits, (const VkCoarseSampleOrderCustomNV*)(toCount->pCustomSampleOrders + i), count);
+            count_VkCoarseSampleOrderCustomNV(featureBits, rootType, (const VkCoarseSampleOrderCustomNV*)(toCount->pCustomSampleOrders + i), count);
         }
     }
 }
@@ -8066,14 +10235,20 @@
 #ifdef VK_NV_ray_tracing
 void count_VkRayTracingShaderGroupCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRayTracingShaderGroupCreateInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkRayTracingShaderGroupTypeKHR);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
@@ -8083,21 +10258,27 @@
 
 void count_VkRayTracingPipelineCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRayTracingPipelineCreateInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineCreateFlags);
     *count += sizeof(uint32_t);
     if (toCount)
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->stageCount; ++i)
         {
-            count_VkPipelineShaderStageCreateInfo(featureBits, (const VkPipelineShaderStageCreateInfo*)(toCount->pStages + i), count);
+            count_VkPipelineShaderStageCreateInfo(featureBits, rootType, (const VkPipelineShaderStageCreateInfo*)(toCount->pStages + i), count);
         }
     }
     *count += sizeof(uint32_t);
@@ -8105,7 +10286,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->groupCount; ++i)
         {
-            count_VkRayTracingShaderGroupCreateInfoNV(featureBits, (const VkRayTracingShaderGroupCreateInfoNV*)(toCount->pGroups + i), count);
+            count_VkRayTracingShaderGroupCreateInfoNV(featureBits, rootType, (const VkRayTracingShaderGroupCreateInfoNV*)(toCount->pGroups + i), count);
         }
     }
     *count += sizeof(uint32_t);
@@ -8118,14 +10299,20 @@
 
 void count_VkGeometryTrianglesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkGeometryTrianglesNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(VkDeviceSize);
@@ -8144,14 +10331,20 @@
 
 void count_VkGeometryAABBNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkGeometryAABBNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(uint32_t);
@@ -8161,41 +10354,55 @@
 
 void count_VkGeometryDataNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkGeometryDataNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
-    count_VkGeometryTrianglesNV(featureBits, (VkGeometryTrianglesNV*)(&toCount->triangles), count);
-    count_VkGeometryAABBNV(featureBits, (VkGeometryAABBNV*)(&toCount->aabbs), count);
+    count_VkGeometryTrianglesNV(featureBits, rootType, (VkGeometryTrianglesNV*)(&toCount->triangles), count);
+    count_VkGeometryAABBNV(featureBits, rootType, (VkGeometryAABBNV*)(&toCount->aabbs), count);
 }
 
 void count_VkGeometryNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkGeometryNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkGeometryTypeKHR);
-    count_VkGeometryDataNV(featureBits, (VkGeometryDataNV*)(&toCount->geometry), count);
+    count_VkGeometryDataNV(featureBits, rootType, (VkGeometryDataNV*)(&toCount->geometry), count);
     *count += sizeof(VkGeometryFlagsKHR);
 }
 
 void count_VkAccelerationStructureInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkAccelerationStructureTypeNV);
     *count += sizeof(VkBuildAccelerationStructureFlagsNV);
     *count += sizeof(uint32_t);
@@ -8204,35 +10411,47 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->geometryCount; ++i)
         {
-            count_VkGeometryNV(featureBits, (const VkGeometryNV*)(toCount->pGeometries + i), count);
+            count_VkGeometryNV(featureBits, rootType, (const VkGeometryNV*)(toCount->pGeometries + i), count);
         }
     }
 }
 
 void count_VkAccelerationStructureCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureCreateInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDeviceSize);
-    count_VkAccelerationStructureInfoNV(featureBits, (VkAccelerationStructureInfoNV*)(&toCount->info), count);
+    count_VkAccelerationStructureInfoNV(featureBits, rootType, (VkAccelerationStructureInfoNV*)(&toCount->info), count);
 }
 
 void count_VkBindAccelerationStructureMemoryInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBindAccelerationStructureMemoryInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     uint64_t cgen_var_1;
@@ -8247,14 +10466,20 @@
 
 void count_VkWriteDescriptorSetAccelerationStructureNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkWriteDescriptorSetAccelerationStructureNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     // WARNING PTR CHECK
     *count += 8;
@@ -8269,14 +10494,20 @@
 
 void count_VkAccelerationStructureMemoryRequirementsInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureMemoryRequirementsInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkAccelerationStructureMemoryRequirementsTypeNV);
     uint64_t cgen_var_0;
     *count += 1 * 8;
@@ -8284,14 +10515,20 @@
 
 void count_VkPhysicalDeviceRayTracingPropertiesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPropertiesNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
@@ -8304,10 +10541,12 @@
 
 void count_VkTransformMatrixKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkTransformMatrixKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += ((3)*(4)) * sizeof(float);
@@ -8315,10 +10554,12 @@
 
 void count_VkAabbPositionsKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAabbPositionsKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(float);
@@ -8331,13 +10572,15 @@
 
 void count_VkAccelerationStructureInstanceKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureInstanceKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
-    count_VkTransformMatrixKHR(featureBits, (VkTransformMatrixKHR*)(&toCount->transform), count);
+    count_VkTransformMatrixKHR(featureBits, rootType, (VkTransformMatrixKHR*)(&toCount->transform), count);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
@@ -8349,27 +10592,39 @@
 #ifdef VK_NV_representative_fragment_test
 void count_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineRepresentativeFragmentTestStateCreateInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
@@ -8377,27 +10632,39 @@
 #ifdef VK_EXT_filter_cubic
 void count_VkPhysicalDeviceImageViewImageFormatInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageViewImageFormatInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkImageViewType);
 }
 
 void count_VkFilterCubicImageViewImageFormatPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkFilterCubicImageViewImageFormatPropertiesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
 }
@@ -8408,14 +10675,20 @@
 #ifdef VK_EXT_global_priority
 void count_VkDeviceQueueGlobalPriorityCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceQueueGlobalPriorityCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkQueueGlobalPriorityEXT);
 }
 
@@ -8423,14 +10696,20 @@
 #ifdef VK_EXT_external_memory_host
 void count_VkImportMemoryHostPointerInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImportMemoryHostPointerInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkExternalMemoryHandleTypeFlagBits);
     // WARNING PTR CHECK
     *count += 8;
@@ -8442,27 +10721,39 @@
 
 void count_VkMemoryHostPointerPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryHostPointerPropertiesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
 }
 
 void count_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalMemoryHostPropertiesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDeviceSize);
 }
 
@@ -8472,14 +10763,20 @@
 #ifdef VK_AMD_pipeline_compiler_control
 void count_VkPipelineCompilerControlCreateInfoAMD(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineCompilerControlCreateInfoAMD* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineCompilerControlFlagsAMD);
 }
 
@@ -8487,14 +10784,20 @@
 #ifdef VK_EXT_calibrated_timestamps
 void count_VkCalibratedTimestampInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCalibratedTimestampInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkTimeDomainEXT);
 }
 
@@ -8502,14 +10805,20 @@
 #ifdef VK_AMD_shader_core_properties
 void count_VkPhysicalDeviceShaderCorePropertiesAMD(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderCorePropertiesAMD* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
@@ -8530,14 +10839,20 @@
 #ifdef VK_AMD_memory_overallocation_behavior
 void count_VkDeviceMemoryOverallocationCreateInfoAMD(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceMemoryOverallocationCreateInfoAMD* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkMemoryOverallocationBehaviorAMD);
 }
 
@@ -8545,23 +10860,31 @@
 #ifdef VK_EXT_vertex_attribute_divisor
 void count_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
 }
 
 void count_VkVertexInputBindingDivisorDescriptionEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkVertexInputBindingDivisorDescriptionEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -8570,34 +10893,46 @@
 
 void count_VkPipelineVertexInputDivisorStateCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineVertexInputDivisorStateCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     if (toCount)
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->vertexBindingDivisorCount; ++i)
         {
-            count_VkVertexInputBindingDivisorDescriptionEXT(featureBits, (const VkVertexInputBindingDivisorDescriptionEXT*)(toCount->pVertexBindingDivisors + i), count);
+            count_VkVertexInputBindingDivisorDescriptionEXT(featureBits, rootType, (const VkVertexInputBindingDivisorDescriptionEXT*)(toCount->pVertexBindingDivisors + i), count);
         }
     }
 }
 
 void count_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
 }
@@ -8606,14 +10941,20 @@
 #ifdef VK_GGP_frame_token
 void count_VkPresentFrameTokenGGP(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPresentFrameTokenGGP* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(GgpFrameToken);
 }
 
@@ -8621,10 +10962,12 @@
 #ifdef VK_EXT_pipeline_creation_feedback
 void count_VkPipelineCreationFeedbackEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineCreationFeedbackEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkPipelineCreationFeedbackFlagsEXT);
@@ -8633,21 +10976,27 @@
 
 void count_VkPipelineCreationFeedbackCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineCreationFeedbackCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkPipelineCreationFeedbackEXT(featureBits, (VkPipelineCreationFeedbackEXT*)(toCount->pPipelineCreationFeedback), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkPipelineCreationFeedbackEXT(featureBits, rootType, (VkPipelineCreationFeedbackEXT*)(toCount->pPipelineCreationFeedback), count);
     *count += sizeof(uint32_t);
     if (toCount)
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->pipelineStageCreationFeedbackCount; ++i)
         {
-            count_VkPipelineCreationFeedbackEXT(featureBits, (VkPipelineCreationFeedbackEXT*)(toCount->pPipelineStageCreationFeedbacks + i), count);
+            count_VkPipelineCreationFeedbackEXT(featureBits, rootType, (VkPipelineCreationFeedbackEXT*)(toCount->pPipelineStageCreationFeedbacks + i), count);
         }
     }
 }
@@ -8658,14 +11007,20 @@
 #ifdef VK_NV_compute_shader_derivatives
 void count_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
 }
@@ -8674,28 +11029,40 @@
 #ifdef VK_NV_mesh_shader
 void count_VkPhysicalDeviceMeshShaderFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceMeshShaderFeaturesNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
 }
 
 void count_VkPhysicalDeviceMeshShaderPropertiesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceMeshShaderPropertiesNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
     *count += 3 * sizeof(uint32_t);
@@ -8713,10 +11080,12 @@
 
 void count_VkDrawMeshTasksIndirectCommandNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDrawMeshTasksIndirectCommandNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -8727,14 +11096,20 @@
 #ifdef VK_NV_fragment_shader_barycentric
 void count_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
@@ -8742,14 +11117,20 @@
 #ifdef VK_NV_shader_image_footprint
 void count_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderImageFootprintFeaturesNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
@@ -8757,14 +11138,20 @@
 #ifdef VK_NV_scissor_exclusive
 void count_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineViewportExclusiveScissorStateCreateInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     // WARNING PTR CHECK
     *count += 8;
@@ -8774,7 +11161,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)toCount->exclusiveScissorCount; ++i)
             {
-                count_VkRect2D(featureBits, (const VkRect2D*)(toCount->pExclusiveScissors + i), count);
+                count_VkRect2D(featureBits, rootType, (const VkRect2D*)(toCount->pExclusiveScissors + i), count);
             }
         }
     }
@@ -8782,14 +11169,20 @@
 
 void count_VkPhysicalDeviceExclusiveScissorFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceExclusiveScissorFeaturesNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
@@ -8797,27 +11190,39 @@
 #ifdef VK_NV_device_diagnostic_checkpoints
 void count_VkQueueFamilyCheckpointPropertiesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkQueueFamilyCheckpointPropertiesNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineStageFlags);
 }
 
 void count_VkCheckpointDataNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCheckpointDataNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineStageFlagBits);
     // WARNING PTR CHECK
     *count += 8;
@@ -8831,14 +11236,20 @@
 #ifdef VK_INTEL_shader_integer_functions2
 void count_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
@@ -8846,10 +11257,12 @@
 #ifdef VK_INTEL_performance_query
 void count_VkPerformanceValueDataINTEL(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPerformanceValueDataINTEL* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -8857,26 +11270,34 @@
 
 void count_VkPerformanceValueINTEL(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPerformanceValueINTEL* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkPerformanceValueTypeINTEL);
-    count_VkPerformanceValueDataINTEL(featureBits, (VkPerformanceValueDataINTEL*)(&toCount->data), count);
+    count_VkPerformanceValueDataINTEL(featureBits, rootType, (VkPerformanceValueDataINTEL*)(&toCount->data), count);
 }
 
 void count_VkInitializePerformanceApiInfoINTEL(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkInitializePerformanceApiInfoINTEL* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     // WARNING PTR CHECK
     *count += 8;
     if (toCount->pUserData)
@@ -8887,53 +11308,77 @@
 
 void count_VkQueryPoolPerformanceQueryCreateInfoINTEL(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkQueryPoolPerformanceQueryCreateInfoINTEL* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkQueryPoolSamplingModeINTEL);
 }
 
 void count_VkPerformanceMarkerInfoINTEL(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPerformanceMarkerInfoINTEL* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint64_t);
 }
 
 void count_VkPerformanceStreamMarkerInfoINTEL(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPerformanceStreamMarkerInfoINTEL* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
 }
 
 void count_VkPerformanceOverrideInfoINTEL(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPerformanceOverrideInfoINTEL* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPerformanceOverrideTypeINTEL);
     *count += sizeof(VkBool32);
     *count += sizeof(uint64_t);
@@ -8941,14 +11386,20 @@
 
 void count_VkPerformanceConfigurationAcquireInfoINTEL(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPerformanceConfigurationAcquireInfoINTEL* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPerformanceConfigurationTypeINTEL);
 }
 
@@ -8956,14 +11407,20 @@
 #ifdef VK_EXT_pci_bus_info
 void count_VkPhysicalDevicePCIBusInfoPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDevicePCIBusInfoPropertiesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
@@ -8974,27 +11431,39 @@
 #ifdef VK_AMD_display_native_hdr
 void count_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayNativeHdrSurfaceCapabilitiesAMD* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkSwapchainDisplayNativeHdrCreateInfoAMD(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSwapchainDisplayNativeHdrCreateInfoAMD* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
@@ -9002,14 +11471,20 @@
 #ifdef VK_FUCHSIA_imagepipe_surface
 void count_VkImagePipeSurfaceCreateInfoFUCHSIA(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImagePipeSurfaceCreateInfoFUCHSIA* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkImagePipeSurfaceCreateFlagsFUCHSIA);
     *count += sizeof(zx_handle_t);
 }
@@ -9018,14 +11493,20 @@
 #ifdef VK_EXT_metal_surface
 void count_VkMetalSurfaceCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMetalSurfaceCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkMetalSurfaceCreateFlagsEXT);
     // WARNING PTR CHECK
     *count += 8;
@@ -9036,48 +11517,66 @@
 }
 
 #endif
-#ifdef VK_GOOGLE_color_buffer
-void count_VkImportColorBufferGOOGLE(
+#ifdef VK_EXT_fragment_density_map
+void count_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
     uint32_t featureBits,
-    const VkImportColorBufferGOOGLE* toCount,
+    VkStructureType rootType,
+    const VkPhysicalDeviceFragmentDensityMapFeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    *count += sizeof(uint32_t);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
 }
 
-void count_VkImportBufferGOOGLE(
+void count_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
     uint32_t featureBits,
-    const VkImportBufferGOOGLE* toCount,
+    VkStructureType rootType,
+    const VkPhysicalDeviceFragmentDensityMapPropertiesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    *count += sizeof(uint32_t);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->minFragmentDensityTexelSize), count);
+    count_VkExtent2D(featureBits, rootType, (VkExtent2D*)(&toCount->maxFragmentDensityTexelSize), count);
+    *count += sizeof(VkBool32);
 }
 
-void count_VkImportPhysicalAddressGOOGLE(
+void count_VkRenderPassFragmentDensityMapCreateInfoEXT(
     uint32_t featureBits,
-    const VkImportPhysicalAddressGOOGLE* toCount,
+    VkStructureType rootType,
+    const VkRenderPassFragmentDensityMapCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    *count += sizeof(uint64_t);
-    *count += sizeof(VkDeviceSize);
-    *count += sizeof(VkFormat);
-    *count += sizeof(VkImageTiling);
-    *count += sizeof(uint32_t);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkAttachmentReference(featureBits, rootType, (VkAttachmentReference*)(&toCount->fragmentDensityMapAttachment), count);
 }
 
 #endif
@@ -9090,28 +11589,40 @@
 #ifdef VK_EXT_subgroup_size_control
 void count_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
 }
 
 void count_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
@@ -9120,14 +11631,20 @@
 
 void count_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
 }
 
@@ -9135,14 +11652,20 @@
 #ifdef VK_AMD_shader_core_properties2
 void count_VkPhysicalDeviceShaderCoreProperties2AMD(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderCoreProperties2AMD* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkShaderCorePropertiesFlagsAMD);
     *count += sizeof(uint32_t);
 }
@@ -9151,14 +11674,20 @@
 #ifdef VK_AMD_device_coherent_memory
 void count_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceCoherentMemoryFeaturesAMD* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
@@ -9166,14 +11695,20 @@
 #ifdef VK_EXT_shader_image_atomic_int64
 void count_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
 }
@@ -9182,14 +11717,20 @@
 #ifdef VK_EXT_memory_budget
 void count_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryBudgetPropertiesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += VK_MAX_MEMORY_HEAPS * sizeof(VkDeviceSize);
     *count += VK_MAX_MEMORY_HEAPS * sizeof(VkDeviceSize);
 }
@@ -9198,27 +11739,39 @@
 #ifdef VK_EXT_memory_priority
 void count_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryPriorityFeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkMemoryPriorityAllocateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryPriorityAllocateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(float);
 }
 
@@ -9226,14 +11779,20 @@
 #ifdef VK_NV_dedicated_allocation_image_aliasing
 void count_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
@@ -9241,14 +11800,20 @@
 #ifdef VK_EXT_buffer_device_address
 void count_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
@@ -9256,14 +11821,20 @@
 
 void count_VkBufferDeviceAddressCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBufferDeviceAddressCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDeviceAddress);
 }
 
@@ -9271,14 +11842,20 @@
 #ifdef VK_EXT_tooling_info
 void count_VkPhysicalDeviceToolPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceToolPropertiesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += VK_MAX_EXTENSION_NAME_SIZE * sizeof(char);
     *count += VK_MAX_EXTENSION_NAME_SIZE * sizeof(char);
     *count += sizeof(VkToolPurposeFlagsEXT);
@@ -9292,14 +11869,20 @@
 #ifdef VK_EXT_validation_features
 void count_VkValidationFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkValidationFeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     if (toCount)
     {
@@ -9316,14 +11899,20 @@
 #ifdef VK_NV_cooperative_matrix
 void count_VkCooperativeMatrixPropertiesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCooperativeMatrixPropertiesNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
@@ -9336,28 +11925,40 @@
 
 void count_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceCooperativeMatrixFeaturesNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
 }
 
 void count_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceCooperativeMatrixPropertiesNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkShaderStageFlags);
 }
 
@@ -9365,41 +11966,59 @@
 #ifdef VK_NV_coverage_reduction_mode
 void count_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceCoverageReductionModeFeaturesNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkPipelineCoverageReductionStateCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineCoverageReductionStateCreateInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineCoverageReductionStateCreateFlagsNV);
     *count += sizeof(VkCoverageReductionModeNV);
 }
 
 void count_VkFramebufferMixedSamplesCombinationNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkFramebufferMixedSamplesCombinationNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkCoverageReductionModeNV);
     *count += sizeof(VkSampleCountFlagBits);
     *count += sizeof(VkSampleCountFlags);
@@ -9410,14 +12029,20 @@
 #ifdef VK_EXT_fragment_shader_interlock
 void count_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
@@ -9427,14 +12052,20 @@
 #ifdef VK_EXT_ycbcr_image_arrays
 void count_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
@@ -9442,40 +12073,58 @@
 #ifdef VK_EXT_full_screen_exclusive
 void count_VkSurfaceFullScreenExclusiveInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSurfaceFullScreenExclusiveInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkFullScreenExclusiveEXT);
 }
 
 void count_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSurfaceCapabilitiesFullScreenExclusiveEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkSurfaceFullScreenExclusiveWin32InfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSurfaceFullScreenExclusiveWin32InfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(HMONITOR);
 }
 
@@ -9483,14 +12132,20 @@
 #ifdef VK_EXT_headless_surface
 void count_VkHeadlessSurfaceCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkHeadlessSurfaceCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkHeadlessSurfaceCreateFlagsEXT);
 }
 
@@ -9498,14 +12153,20 @@
 #ifdef VK_EXT_line_rasterization
 void count_VkPhysicalDeviceLineRasterizationFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceLineRasterizationFeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
@@ -9516,27 +12177,39 @@
 
 void count_VkPhysicalDeviceLineRasterizationPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceLineRasterizationPropertiesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
 }
 
 void count_VkPipelineRasterizationLineStateCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineRasterizationLineStateCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkLineRasterizationModeEXT);
     *count += sizeof(VkBool32);
     *count += sizeof(uint32_t);
@@ -9547,14 +12220,20 @@
 #ifdef VK_EXT_shader_atomic_float
 void count_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
@@ -9575,14 +12254,20 @@
 #ifdef VK_EXT_index_type_uint8
 void count_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceIndexTypeUint8FeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
@@ -9590,14 +12275,20 @@
 #ifdef VK_EXT_extended_dynamic_state
 void count_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
@@ -9605,14 +12296,20 @@
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 void count_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
@@ -9620,14 +12317,20 @@
 #ifdef VK_NV_device_generated_commands
 void count_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
@@ -9641,65 +12344,83 @@
 
 void count_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkGraphicsShaderGroupCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkGraphicsShaderGroupCreateInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     if (toCount)
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->stageCount; ++i)
         {
-            count_VkPipelineShaderStageCreateInfo(featureBits, (const VkPipelineShaderStageCreateInfo*)(toCount->pStages + i), count);
+            count_VkPipelineShaderStageCreateInfo(featureBits, rootType, (const VkPipelineShaderStageCreateInfo*)(toCount->pStages + i), count);
         }
     }
     // WARNING PTR CHECK
     *count += 8;
     if (toCount->pVertexInputState)
     {
-        count_VkPipelineVertexInputStateCreateInfo(featureBits, (const VkPipelineVertexInputStateCreateInfo*)(toCount->pVertexInputState), count);
+        count_VkPipelineVertexInputStateCreateInfo(featureBits, rootType, (const VkPipelineVertexInputStateCreateInfo*)(toCount->pVertexInputState), count);
     }
     // WARNING PTR CHECK
     *count += 8;
     if (toCount->pTessellationState)
     {
-        count_VkPipelineTessellationStateCreateInfo(featureBits, (const VkPipelineTessellationStateCreateInfo*)(toCount->pTessellationState), count);
+        count_VkPipelineTessellationStateCreateInfo(featureBits, rootType, (const VkPipelineTessellationStateCreateInfo*)(toCount->pTessellationState), count);
     }
 }
 
 void count_VkGraphicsPipelineShaderGroupsCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkGraphicsPipelineShaderGroupsCreateInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     if (toCount)
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->groupCount; ++i)
         {
-            count_VkGraphicsShaderGroupCreateInfoNV(featureBits, (const VkGraphicsShaderGroupCreateInfoNV*)(toCount->pGroups + i), count);
+            count_VkGraphicsShaderGroupCreateInfoNV(featureBits, rootType, (const VkGraphicsShaderGroupCreateInfoNV*)(toCount->pGroups + i), count);
         }
     }
     *count += sizeof(uint32_t);
@@ -9711,10 +12432,12 @@
 
 void count_VkBindShaderGroupIndirectCommandNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBindShaderGroupIndirectCommandNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -9722,10 +12445,12 @@
 
 void count_VkBindIndexBufferIndirectCommandNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBindIndexBufferIndirectCommandNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkDeviceAddress);
@@ -9735,10 +12460,12 @@
 
 void count_VkBindVertexBufferIndirectCommandNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBindVertexBufferIndirectCommandNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkDeviceAddress);
@@ -9748,10 +12475,12 @@
 
 void count_VkSetStateFlagsIndirectCommandNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSetStateFlagsIndirectCommandNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -9759,10 +12488,12 @@
 
 void count_VkIndirectCommandsStreamNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkIndirectCommandsStreamNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     uint64_t cgen_var_0;
@@ -9772,14 +12503,20 @@
 
 void count_VkIndirectCommandsLayoutTokenNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkIndirectCommandsLayoutTokenNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkIndirectCommandsTokenTypeNV);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
@@ -9804,14 +12541,20 @@
 
 void count_VkIndirectCommandsLayoutCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkIndirectCommandsLayoutCreateInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkIndirectCommandsLayoutUsageFlagsNV);
     *count += sizeof(VkPipelineBindPoint);
     *count += sizeof(uint32_t);
@@ -9819,7 +12562,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->tokenCount; ++i)
         {
-            count_VkIndirectCommandsLayoutTokenNV(featureBits, (const VkIndirectCommandsLayoutTokenNV*)(toCount->pTokens + i), count);
+            count_VkIndirectCommandsLayoutTokenNV(featureBits, rootType, (const VkIndirectCommandsLayoutTokenNV*)(toCount->pTokens + i), count);
         }
     }
     *count += sizeof(uint32_t);
@@ -9831,14 +12574,20 @@
 
 void count_VkGeneratedCommandsInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkGeneratedCommandsInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineBindPoint);
     uint64_t cgen_var_0;
     *count += 1 * 8;
@@ -9849,7 +12598,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->streamCount; ++i)
         {
-            count_VkIndirectCommandsStreamNV(featureBits, (const VkIndirectCommandsStreamNV*)(toCount->pStreams + i), count);
+            count_VkIndirectCommandsStreamNV(featureBits, rootType, (const VkIndirectCommandsStreamNV*)(toCount->pStreams + i), count);
         }
     }
     *count += sizeof(uint32_t);
@@ -9867,14 +12616,20 @@
 
 void count_VkGeneratedCommandsMemoryRequirementsInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkGeneratedCommandsMemoryRequirementsInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineBindPoint);
     uint64_t cgen_var_0;
     *count += 1 * 8;
@@ -9887,27 +12642,39 @@
 #ifdef VK_EXT_texel_buffer_alignment
 void count_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDeviceSize);
     *count += sizeof(VkBool32);
     *count += sizeof(VkDeviceSize);
@@ -9918,56 +12685,80 @@
 #ifdef VK_QCOM_render_pass_transform
 void count_VkRenderPassTransformBeginInfoQCOM(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRenderPassTransformBeginInfoQCOM* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkSurfaceTransformFlagBitsKHR);
 }
 
 void count_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCommandBufferInheritanceRenderPassTransformInfoQCOM* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkSurfaceTransformFlagBitsKHR);
-    count_VkRect2D(featureBits, (VkRect2D*)(&toCount->renderArea), count);
+    count_VkRect2D(featureBits, rootType, (VkRect2D*)(&toCount->renderArea), count);
 }
 
 #endif
 #ifdef VK_EXT_device_memory_report
 void count_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkDeviceMemoryReportCallbackDataEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceMemoryReportCallbackDataEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDeviceMemoryReportFlagsEXT);
     *count += sizeof(VkDeviceMemoryReportEventTypeEXT);
     *count += sizeof(uint64_t);
@@ -9979,14 +12770,20 @@
 
 void count_VkDeviceDeviceMemoryReportCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceDeviceMemoryReportCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDeviceMemoryReportFlagsEXT);
     *count += 8;
     *count += sizeof(uint8_t);
@@ -9996,14 +12793,20 @@
 #ifdef VK_EXT_robustness2
 void count_VkPhysicalDeviceRobustness2FeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceRobustness2FeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
@@ -10011,14 +12814,20 @@
 
 void count_VkPhysicalDeviceRobustness2PropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceRobustness2PropertiesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDeviceSize);
     *count += sizeof(VkDeviceSize);
 }
@@ -10027,41 +12836,59 @@
 #ifdef VK_EXT_custom_border_color
 void count_VkSamplerCustomBorderColorCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSamplerCustomBorderColorCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkClearColorValue(featureBits, (VkClearColorValue*)(&toCount->customBorderColor), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkClearColorValue(featureBits, rootType, (VkClearColorValue*)(&toCount->customBorderColor), count);
     *count += sizeof(VkFormat);
 }
 
 void count_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceCustomBorderColorPropertiesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
 }
 
 void count_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceCustomBorderColorFeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
 }
@@ -10072,40 +12899,58 @@
 #ifdef VK_EXT_private_data
 void count_VkPhysicalDevicePrivateDataFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDevicePrivateDataFeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkDevicePrivateDataCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDevicePrivateDataCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
 }
 
 void count_VkPrivateDataSlotCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPrivateDataSlotCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPrivateDataSlotCreateFlagsEXT);
 }
 
@@ -10113,14 +12958,20 @@
 #ifdef VK_EXT_pipeline_creation_cache_control
 void count_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
@@ -10128,27 +12979,39 @@
 #ifdef VK_NV_device_diagnostics_config
 void count_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceDiagnosticsConfigFeaturesNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkDeviceDiagnosticsConfigCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceDiagnosticsConfigCreateInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDeviceDiagnosticsConfigFlagsNV);
 }
 
@@ -10158,14 +13021,20 @@
 #ifdef VK_NV_fragment_shading_rate_enums
 void count_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
@@ -10173,27 +13042,39 @@
 
 void count_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkSampleCountFlagBits);
 }
 
 void count_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineFragmentShadingRateEnumStateCreateInfoNV* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkFragmentShadingRateTypeNV);
     *count += sizeof(VkFragmentShadingRateNV);
     *count += 2 * sizeof(VkFragmentShadingRateCombinerOpKHR);
@@ -10203,27 +13084,39 @@
 #ifdef VK_EXT_fragment_density_map2
 void count_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 void count_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
     *count += sizeof(uint32_t);
@@ -10234,14 +13127,20 @@
 #ifdef VK_QCOM_rotated_copy_commands
 void count_VkCopyCommandTransformInfoQCOM(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCopyCommandTransformInfoQCOM* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkSurfaceTransformFlagBitsKHR);
 }
 
@@ -10249,14 +13148,20 @@
 #ifdef VK_EXT_image_robustness
 void count_VkPhysicalDeviceImageRobustnessFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageRobustnessFeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
@@ -10264,14 +13169,20 @@
 #ifdef VK_EXT_4444_formats
 void count_VkPhysicalDevice4444FormatsFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDevice4444FormatsFeaturesEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
 }
@@ -10280,14 +13191,20 @@
 #ifdef VK_EXT_directfb_surface
 void count_VkDirectFBSurfaceCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDirectFBSurfaceCreateInfoEXT* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDirectFBSurfaceCreateFlagsEXT);
     // WARNING PTR CHECK
     *count += 8;
@@ -10305,14 +13222,77 @@
 
 #endif
 #ifdef VK_GOOGLE_gfxstream
+void count_VkImportColorBufferGOOGLE(
+    uint32_t featureBits,
+    VkStructureType rootType,
+    const VkImportColorBufferGOOGLE* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)rootType;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkImportBufferGOOGLE(
+    uint32_t featureBits,
+    VkStructureType rootType,
+    const VkImportBufferGOOGLE* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)rootType;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkImportPhysicalAddressGOOGLE(
+    uint32_t featureBits,
+    VkStructureType rootType,
+    const VkImportPhysicalAddressGOOGLE* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)rootType;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    *count += sizeof(uint64_t);
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(VkFormat);
+    *count += sizeof(VkImageTiling);
+    *count += sizeof(uint32_t);
+}
+
 #endif
 #ifdef VK_KHR_acceleration_structure
 void count_VkDeviceOrHostAddressKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceOrHostAddressKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkDeviceAddress);
@@ -10320,10 +13300,12 @@
 
 void count_VkDeviceOrHostAddressConstKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceOrHostAddressConstKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkDeviceAddress);
@@ -10331,10 +13313,12 @@
 
 void count_VkAccelerationStructureBuildRangeInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureBuildRangeInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -10345,87 +13329,119 @@
 
 void count_VkAccelerationStructureGeometryTrianglesDataKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryTrianglesDataKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkFormat);
-    count_VkDeviceOrHostAddressConstKHR(featureBits, (VkDeviceOrHostAddressConstKHR*)(&toCount->vertexData), count);
+    count_VkDeviceOrHostAddressConstKHR(featureBits, rootType, (VkDeviceOrHostAddressConstKHR*)(&toCount->vertexData), count);
     *count += sizeof(VkDeviceSize);
     *count += sizeof(uint32_t);
     *count += sizeof(VkIndexType);
-    count_VkDeviceOrHostAddressConstKHR(featureBits, (VkDeviceOrHostAddressConstKHR*)(&toCount->indexData), count);
-    count_VkDeviceOrHostAddressConstKHR(featureBits, (VkDeviceOrHostAddressConstKHR*)(&toCount->transformData), count);
+    count_VkDeviceOrHostAddressConstKHR(featureBits, rootType, (VkDeviceOrHostAddressConstKHR*)(&toCount->indexData), count);
+    count_VkDeviceOrHostAddressConstKHR(featureBits, rootType, (VkDeviceOrHostAddressConstKHR*)(&toCount->transformData), count);
 }
 
 void count_VkAccelerationStructureGeometryAabbsDataKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryAabbsDataKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkDeviceOrHostAddressConstKHR(featureBits, (VkDeviceOrHostAddressConstKHR*)(&toCount->data), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkDeviceOrHostAddressConstKHR(featureBits, rootType, (VkDeviceOrHostAddressConstKHR*)(&toCount->data), count);
     *count += sizeof(VkDeviceSize);
 }
 
 void count_VkAccelerationStructureGeometryInstancesDataKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryInstancesDataKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
-    count_VkDeviceOrHostAddressConstKHR(featureBits, (VkDeviceOrHostAddressConstKHR*)(&toCount->data), count);
+    count_VkDeviceOrHostAddressConstKHR(featureBits, rootType, (VkDeviceOrHostAddressConstKHR*)(&toCount->data), count);
 }
 
 void count_VkAccelerationStructureGeometryDataKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryDataKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
-    count_VkAccelerationStructureGeometryTrianglesDataKHR(featureBits, (VkAccelerationStructureGeometryTrianglesDataKHR*)(&toCount->triangles), count);
+    count_VkAccelerationStructureGeometryTrianglesDataKHR(featureBits, rootType, (VkAccelerationStructureGeometryTrianglesDataKHR*)(&toCount->triangles), count);
 }
 
 void count_VkAccelerationStructureGeometryKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkGeometryTypeKHR);
-    count_VkAccelerationStructureGeometryDataKHR(featureBits, (VkAccelerationStructureGeometryDataKHR*)(&toCount->geometry), count);
+    count_VkAccelerationStructureGeometryDataKHR(featureBits, rootType, (VkAccelerationStructureGeometryDataKHR*)(&toCount->geometry), count);
     *count += sizeof(VkGeometryFlagsKHR);
 }
 
 void count_VkAccelerationStructureBuildGeometryInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureBuildGeometryInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkAccelerationStructureTypeKHR);
     *count += sizeof(VkBuildAccelerationStructureFlagsKHR);
     *count += sizeof(VkBuildAccelerationStructureModeKHR);
@@ -10442,23 +13458,29 @@
         {
             for (uint32_t i = 0; i < (uint32_t)toCount->geometryCount; ++i)
             {
-                count_VkAccelerationStructureGeometryKHR(featureBits, (const VkAccelerationStructureGeometryKHR*)(toCount->pGeometries + i), count);
+                count_VkAccelerationStructureGeometryKHR(featureBits, rootType, (const VkAccelerationStructureGeometryKHR*)(toCount->pGeometries + i), count);
             }
         }
     }
-    count_VkDeviceOrHostAddressKHR(featureBits, (VkDeviceOrHostAddressKHR*)(&toCount->scratchData), count);
+    count_VkDeviceOrHostAddressKHR(featureBits, rootType, (VkDeviceOrHostAddressKHR*)(&toCount->scratchData), count);
 }
 
 void count_VkAccelerationStructureCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureCreateInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkAccelerationStructureCreateFlagsKHR);
     uint64_t cgen_var_0;
     *count += 1 * 8;
@@ -10470,14 +13492,20 @@
 
 void count_VkWriteDescriptorSetAccelerationStructureKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkWriteDescriptorSetAccelerationStructureKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     // WARNING PTR CHECK
     *count += 8;
@@ -10492,14 +13520,20 @@
 
 void count_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceAccelerationStructureFeaturesKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
@@ -10509,14 +13543,20 @@
 
 void count_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceAccelerationStructurePropertiesKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint64_t);
     *count += sizeof(uint64_t);
     *count += sizeof(uint64_t);
@@ -10529,28 +13569,40 @@
 
 void count_VkAccelerationStructureDeviceAddressInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureDeviceAddressInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
 }
 
 void count_VkAccelerationStructureVersionInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureVersionInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     if (toCount)
     {
         *count += 2*VK_UUID_SIZE * sizeof(const uint8_t);
@@ -10559,31 +13611,43 @@
 
 void count_VkCopyAccelerationStructureToMemoryInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCopyAccelerationStructureToMemoryInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
-    count_VkDeviceOrHostAddressKHR(featureBits, (VkDeviceOrHostAddressKHR*)(&toCount->dst), count);
+    count_VkDeviceOrHostAddressKHR(featureBits, rootType, (VkDeviceOrHostAddressKHR*)(&toCount->dst), count);
     *count += sizeof(VkCopyAccelerationStructureModeKHR);
 }
 
 void count_VkCopyMemoryToAccelerationStructureInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCopyMemoryToAccelerationStructureInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
-    count_VkDeviceOrHostAddressConstKHR(featureBits, (VkDeviceOrHostAddressConstKHR*)(&toCount->src), count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
+    count_VkDeviceOrHostAddressConstKHR(featureBits, rootType, (VkDeviceOrHostAddressConstKHR*)(&toCount->src), count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     *count += sizeof(VkCopyAccelerationStructureModeKHR);
@@ -10591,14 +13655,20 @@
 
 void count_VkCopyAccelerationStructureInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCopyAccelerationStructureInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     uint64_t cgen_var_0;
     *count += 1 * 8;
     uint64_t cgen_var_1;
@@ -10608,14 +13678,20 @@
 
 void count_VkAccelerationStructureBuildSizesInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureBuildSizesInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkDeviceSize);
     *count += sizeof(VkDeviceSize);
     *count += sizeof(VkDeviceSize);
@@ -10625,14 +13701,20 @@
 #ifdef VK_KHR_ray_tracing_pipeline
 void count_VkRayTracingShaderGroupCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRayTracingShaderGroupCreateInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkRayTracingShaderGroupTypeKHR);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
@@ -10648,35 +13730,47 @@
 
 void count_VkRayTracingPipelineInterfaceCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRayTracingPipelineInterfaceCreateInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
 }
 
 void count_VkRayTracingPipelineCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRayTracingPipelineCreateInfoKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkPipelineCreateFlags);
     *count += sizeof(uint32_t);
     if (toCount)
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->stageCount; ++i)
         {
-            count_VkPipelineShaderStageCreateInfo(featureBits, (const VkPipelineShaderStageCreateInfo*)(toCount->pStages + i), count);
+            count_VkPipelineShaderStageCreateInfo(featureBits, rootType, (const VkPipelineShaderStageCreateInfo*)(toCount->pStages + i), count);
         }
     }
     *count += sizeof(uint32_t);
@@ -10684,7 +13778,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)toCount->groupCount; ++i)
         {
-            count_VkRayTracingShaderGroupCreateInfoKHR(featureBits, (const VkRayTracingShaderGroupCreateInfoKHR*)(toCount->pGroups + i), count);
+            count_VkRayTracingShaderGroupCreateInfoKHR(featureBits, rootType, (const VkRayTracingShaderGroupCreateInfoKHR*)(toCount->pGroups + i), count);
         }
     }
     *count += sizeof(uint32_t);
@@ -10692,19 +13786,19 @@
     *count += 8;
     if (toCount->pLibraryInfo)
     {
-        count_VkPipelineLibraryCreateInfoKHR(featureBits, (const VkPipelineLibraryCreateInfoKHR*)(toCount->pLibraryInfo), count);
+        count_VkPipelineLibraryCreateInfoKHR(featureBits, rootType, (const VkPipelineLibraryCreateInfoKHR*)(toCount->pLibraryInfo), count);
     }
     // WARNING PTR CHECK
     *count += 8;
     if (toCount->pLibraryInterface)
     {
-        count_VkRayTracingPipelineInterfaceCreateInfoKHR(featureBits, (const VkRayTracingPipelineInterfaceCreateInfoKHR*)(toCount->pLibraryInterface), count);
+        count_VkRayTracingPipelineInterfaceCreateInfoKHR(featureBits, rootType, (const VkRayTracingPipelineInterfaceCreateInfoKHR*)(toCount->pLibraryInterface), count);
     }
     // WARNING PTR CHECK
     *count += 8;
     if (toCount->pDynamicState)
     {
-        count_VkPipelineDynamicStateCreateInfo(featureBits, (const VkPipelineDynamicStateCreateInfo*)(toCount->pDynamicState), count);
+        count_VkPipelineDynamicStateCreateInfo(featureBits, rootType, (const VkPipelineDynamicStateCreateInfo*)(toCount->pDynamicState), count);
     }
     uint64_t cgen_var_0;
     *count += 1 * 8;
@@ -10715,14 +13809,20 @@
 
 void count_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPipelineFeaturesKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
     *count += sizeof(VkBool32);
@@ -10732,14 +13832,20 @@
 
 void count_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPipelinePropertiesKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
     *count += sizeof(uint32_t);
@@ -10752,10 +13858,12 @@
 
 void count_VkStridedDeviceAddressRegionKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkStridedDeviceAddressRegionKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkDeviceAddress);
@@ -10765,10 +13873,12 @@
 
 void count_VkTraceRaysIndirectCommandKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkTraceRaysIndirectCommandKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(uint32_t);
@@ -10780,29 +13890,36 @@
 #ifdef VK_KHR_ray_query
 void count_VkPhysicalDeviceRayQueryFeaturesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayQueryFeaturesKHR* toCount,
     size_t* count)
 {
     (void)featureBits;
+    (void)rootType;
     (void)toCount;
     (void)count;
     *count += sizeof(VkStructureType);
-    count_extension_struct(featureBits, toCount->pNext, count);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = toCount->sType;
+    }
+    count_extension_struct(featureBits, rootType, toCount->pNext, count);
     *count += sizeof(VkBool32);
 }
 
 #endif
 void count_extension_struct(
     uint32_t featureBits,
+    VkStructureType rootType,
     const void* structExtension,
     size_t* count)
 {
     VkInstanceCreateInfo* structAccess = (VkInstanceCreateInfo*)(structExtension);
-    size_t currExtSize = goldfish_vk_extension_struct_size_with_stream_features(featureBits, structExtension);
+    size_t currExtSize = goldfish_vk_extension_struct_size_with_stream_features(featureBits, rootType, structExtension);
     if (!currExtSize && structExtension)
     {
         // unknown struct extension; skip and call on its pNext field
-        count_extension_struct(featureBits, (void*)structAccess->pNext, count);
+        count_extension_struct(featureBits, rootType, (void*)structAccess->pNext, count);
         return;
     }
     else
@@ -10826,1535 +13943,1613 @@
 #ifdef VK_VERSION_1_1
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES:
         {
-            count_VkPhysicalDeviceSubgroupProperties(featureBits, reinterpret_cast<const VkPhysicalDeviceSubgroupProperties*>(structExtension), count);
+            count_VkPhysicalDeviceSubgroupProperties(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceSubgroupProperties*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES:
         {
-            count_VkPhysicalDevice16BitStorageFeatures(featureBits, reinterpret_cast<const VkPhysicalDevice16BitStorageFeatures*>(structExtension), count);
+            count_VkPhysicalDevice16BitStorageFeatures(featureBits, rootType, reinterpret_cast<const VkPhysicalDevice16BitStorageFeatures*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS:
         {
-            count_VkMemoryDedicatedRequirements(featureBits, reinterpret_cast<const VkMemoryDedicatedRequirements*>(structExtension), count);
+            count_VkMemoryDedicatedRequirements(featureBits, rootType, reinterpret_cast<const VkMemoryDedicatedRequirements*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO:
         {
-            count_VkMemoryDedicatedAllocateInfo(featureBits, reinterpret_cast<const VkMemoryDedicatedAllocateInfo*>(structExtension), count);
+            count_VkMemoryDedicatedAllocateInfo(featureBits, rootType, reinterpret_cast<const VkMemoryDedicatedAllocateInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO:
         {
-            count_VkMemoryAllocateFlagsInfo(featureBits, reinterpret_cast<const VkMemoryAllocateFlagsInfo*>(structExtension), count);
+            count_VkMemoryAllocateFlagsInfo(featureBits, rootType, reinterpret_cast<const VkMemoryAllocateFlagsInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO:
         {
-            count_VkDeviceGroupRenderPassBeginInfo(featureBits, reinterpret_cast<const VkDeviceGroupRenderPassBeginInfo*>(structExtension), count);
+            count_VkDeviceGroupRenderPassBeginInfo(featureBits, rootType, reinterpret_cast<const VkDeviceGroupRenderPassBeginInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO:
         {
-            count_VkDeviceGroupCommandBufferBeginInfo(featureBits, reinterpret_cast<const VkDeviceGroupCommandBufferBeginInfo*>(structExtension), count);
+            count_VkDeviceGroupCommandBufferBeginInfo(featureBits, rootType, reinterpret_cast<const VkDeviceGroupCommandBufferBeginInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO:
         {
-            count_VkDeviceGroupSubmitInfo(featureBits, reinterpret_cast<const VkDeviceGroupSubmitInfo*>(structExtension), count);
+            count_VkDeviceGroupSubmitInfo(featureBits, rootType, reinterpret_cast<const VkDeviceGroupSubmitInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO:
         {
-            count_VkDeviceGroupBindSparseInfo(featureBits, reinterpret_cast<const VkDeviceGroupBindSparseInfo*>(structExtension), count);
+            count_VkDeviceGroupBindSparseInfo(featureBits, rootType, reinterpret_cast<const VkDeviceGroupBindSparseInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO:
         {
-            count_VkBindBufferMemoryDeviceGroupInfo(featureBits, reinterpret_cast<const VkBindBufferMemoryDeviceGroupInfo*>(structExtension), count);
+            count_VkBindBufferMemoryDeviceGroupInfo(featureBits, rootType, reinterpret_cast<const VkBindBufferMemoryDeviceGroupInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO:
         {
-            count_VkBindImageMemoryDeviceGroupInfo(featureBits, reinterpret_cast<const VkBindImageMemoryDeviceGroupInfo*>(structExtension), count);
+            count_VkBindImageMemoryDeviceGroupInfo(featureBits, rootType, reinterpret_cast<const VkBindImageMemoryDeviceGroupInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO:
         {
-            count_VkDeviceGroupDeviceCreateInfo(featureBits, reinterpret_cast<const VkDeviceGroupDeviceCreateInfo*>(structExtension), count);
+            count_VkDeviceGroupDeviceCreateInfo(featureBits, rootType, reinterpret_cast<const VkDeviceGroupDeviceCreateInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
         {
-            count_VkPhysicalDeviceFeatures2(featureBits, reinterpret_cast<const VkPhysicalDeviceFeatures2*>(structExtension), count);
+            count_VkPhysicalDeviceFeatures2(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceFeatures2*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES:
         {
-            count_VkPhysicalDevicePointClippingProperties(featureBits, reinterpret_cast<const VkPhysicalDevicePointClippingProperties*>(structExtension), count);
+            count_VkPhysicalDevicePointClippingProperties(featureBits, rootType, reinterpret_cast<const VkPhysicalDevicePointClippingProperties*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO:
         {
-            count_VkRenderPassInputAttachmentAspectCreateInfo(featureBits, reinterpret_cast<const VkRenderPassInputAttachmentAspectCreateInfo*>(structExtension), count);
+            count_VkRenderPassInputAttachmentAspectCreateInfo(featureBits, rootType, reinterpret_cast<const VkRenderPassInputAttachmentAspectCreateInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO:
         {
-            count_VkImageViewUsageCreateInfo(featureBits, reinterpret_cast<const VkImageViewUsageCreateInfo*>(structExtension), count);
+            count_VkImageViewUsageCreateInfo(featureBits, rootType, reinterpret_cast<const VkImageViewUsageCreateInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO:
         {
-            count_VkPipelineTessellationDomainOriginStateCreateInfo(featureBits, reinterpret_cast<const VkPipelineTessellationDomainOriginStateCreateInfo*>(structExtension), count);
+            count_VkPipelineTessellationDomainOriginStateCreateInfo(featureBits, rootType, reinterpret_cast<const VkPipelineTessellationDomainOriginStateCreateInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO:
         {
-            count_VkRenderPassMultiviewCreateInfo(featureBits, reinterpret_cast<const VkRenderPassMultiviewCreateInfo*>(structExtension), count);
+            count_VkRenderPassMultiviewCreateInfo(featureBits, rootType, reinterpret_cast<const VkRenderPassMultiviewCreateInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES:
         {
-            count_VkPhysicalDeviceMultiviewFeatures(featureBits, reinterpret_cast<const VkPhysicalDeviceMultiviewFeatures*>(structExtension), count);
+            count_VkPhysicalDeviceMultiviewFeatures(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceMultiviewFeatures*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES:
         {
-            count_VkPhysicalDeviceMultiviewProperties(featureBits, reinterpret_cast<const VkPhysicalDeviceMultiviewProperties*>(structExtension), count);
+            count_VkPhysicalDeviceMultiviewProperties(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceMultiviewProperties*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES:
         {
-            count_VkPhysicalDeviceVariablePointersFeatures(featureBits, reinterpret_cast<const VkPhysicalDeviceVariablePointersFeatures*>(structExtension), count);
+            count_VkPhysicalDeviceVariablePointersFeatures(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceVariablePointersFeatures*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES:
         {
-            count_VkPhysicalDeviceProtectedMemoryFeatures(featureBits, reinterpret_cast<const VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension), count);
+            count_VkPhysicalDeviceProtectedMemoryFeatures(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES:
         {
-            count_VkPhysicalDeviceProtectedMemoryProperties(featureBits, reinterpret_cast<const VkPhysicalDeviceProtectedMemoryProperties*>(structExtension), count);
+            count_VkPhysicalDeviceProtectedMemoryProperties(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceProtectedMemoryProperties*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO:
         {
-            count_VkProtectedSubmitInfo(featureBits, reinterpret_cast<const VkProtectedSubmitInfo*>(structExtension), count);
+            count_VkProtectedSubmitInfo(featureBits, rootType, reinterpret_cast<const VkProtectedSubmitInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO:
         {
-            count_VkSamplerYcbcrConversionInfo(featureBits, reinterpret_cast<const VkSamplerYcbcrConversionInfo*>(structExtension), count);
+            count_VkSamplerYcbcrConversionInfo(featureBits, rootType, reinterpret_cast<const VkSamplerYcbcrConversionInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO:
         {
-            count_VkBindImagePlaneMemoryInfo(featureBits, reinterpret_cast<const VkBindImagePlaneMemoryInfo*>(structExtension), count);
+            count_VkBindImagePlaneMemoryInfo(featureBits, rootType, reinterpret_cast<const VkBindImagePlaneMemoryInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO:
         {
-            count_VkImagePlaneMemoryRequirementsInfo(featureBits, reinterpret_cast<const VkImagePlaneMemoryRequirementsInfo*>(structExtension), count);
+            count_VkImagePlaneMemoryRequirementsInfo(featureBits, rootType, reinterpret_cast<const VkImagePlaneMemoryRequirementsInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES:
         {
-            count_VkPhysicalDeviceSamplerYcbcrConversionFeatures(featureBits, reinterpret_cast<const VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(structExtension), count);
+            count_VkPhysicalDeviceSamplerYcbcrConversionFeatures(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES:
         {
-            count_VkSamplerYcbcrConversionImageFormatProperties(featureBits, reinterpret_cast<const VkSamplerYcbcrConversionImageFormatProperties*>(structExtension), count);
+            count_VkSamplerYcbcrConversionImageFormatProperties(featureBits, rootType, reinterpret_cast<const VkSamplerYcbcrConversionImageFormatProperties*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO:
         {
-            count_VkPhysicalDeviceExternalImageFormatInfo(featureBits, reinterpret_cast<const VkPhysicalDeviceExternalImageFormatInfo*>(structExtension), count);
+            count_VkPhysicalDeviceExternalImageFormatInfo(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceExternalImageFormatInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES:
         {
-            count_VkExternalImageFormatProperties(featureBits, reinterpret_cast<const VkExternalImageFormatProperties*>(structExtension), count);
+            count_VkExternalImageFormatProperties(featureBits, rootType, reinterpret_cast<const VkExternalImageFormatProperties*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES:
         {
-            count_VkPhysicalDeviceIDProperties(featureBits, reinterpret_cast<const VkPhysicalDeviceIDProperties*>(structExtension), count);
+            count_VkPhysicalDeviceIDProperties(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceIDProperties*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO:
         {
-            count_VkExternalMemoryImageCreateInfo(featureBits, reinterpret_cast<const VkExternalMemoryImageCreateInfo*>(structExtension), count);
+            count_VkExternalMemoryImageCreateInfo(featureBits, rootType, reinterpret_cast<const VkExternalMemoryImageCreateInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO:
         {
-            count_VkExternalMemoryBufferCreateInfo(featureBits, reinterpret_cast<const VkExternalMemoryBufferCreateInfo*>(structExtension), count);
+            count_VkExternalMemoryBufferCreateInfo(featureBits, rootType, reinterpret_cast<const VkExternalMemoryBufferCreateInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO:
         {
-            count_VkExportMemoryAllocateInfo(featureBits, reinterpret_cast<const VkExportMemoryAllocateInfo*>(structExtension), count);
+            count_VkExportMemoryAllocateInfo(featureBits, rootType, reinterpret_cast<const VkExportMemoryAllocateInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO:
         {
-            count_VkExportFenceCreateInfo(featureBits, reinterpret_cast<const VkExportFenceCreateInfo*>(structExtension), count);
+            count_VkExportFenceCreateInfo(featureBits, rootType, reinterpret_cast<const VkExportFenceCreateInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO:
         {
-            count_VkExportSemaphoreCreateInfo(featureBits, reinterpret_cast<const VkExportSemaphoreCreateInfo*>(structExtension), count);
+            count_VkExportSemaphoreCreateInfo(featureBits, rootType, reinterpret_cast<const VkExportSemaphoreCreateInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES:
         {
-            count_VkPhysicalDeviceMaintenance3Properties(featureBits, reinterpret_cast<const VkPhysicalDeviceMaintenance3Properties*>(structExtension), count);
+            count_VkPhysicalDeviceMaintenance3Properties(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceMaintenance3Properties*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES:
         {
-            count_VkPhysicalDeviceShaderDrawParametersFeatures(featureBits, reinterpret_cast<const VkPhysicalDeviceShaderDrawParametersFeatures*>(structExtension), count);
+            count_VkPhysicalDeviceShaderDrawParametersFeatures(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceShaderDrawParametersFeatures*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_VERSION_1_2
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES:
         {
-            count_VkPhysicalDeviceVulkan11Features(featureBits, reinterpret_cast<const VkPhysicalDeviceVulkan11Features*>(structExtension), count);
+            count_VkPhysicalDeviceVulkan11Features(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceVulkan11Features*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES:
         {
-            count_VkPhysicalDeviceVulkan11Properties(featureBits, reinterpret_cast<const VkPhysicalDeviceVulkan11Properties*>(structExtension), count);
+            count_VkPhysicalDeviceVulkan11Properties(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceVulkan11Properties*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES:
         {
-            count_VkPhysicalDeviceVulkan12Features(featureBits, reinterpret_cast<const VkPhysicalDeviceVulkan12Features*>(structExtension), count);
+            count_VkPhysicalDeviceVulkan12Features(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceVulkan12Features*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES:
         {
-            count_VkPhysicalDeviceVulkan12Properties(featureBits, reinterpret_cast<const VkPhysicalDeviceVulkan12Properties*>(structExtension), count);
+            count_VkPhysicalDeviceVulkan12Properties(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceVulkan12Properties*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO:
         {
-            count_VkImageFormatListCreateInfo(featureBits, reinterpret_cast<const VkImageFormatListCreateInfo*>(structExtension), count);
+            count_VkImageFormatListCreateInfo(featureBits, rootType, reinterpret_cast<const VkImageFormatListCreateInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES:
         {
-            count_VkPhysicalDevice8BitStorageFeatures(featureBits, reinterpret_cast<const VkPhysicalDevice8BitStorageFeatures*>(structExtension), count);
+            count_VkPhysicalDevice8BitStorageFeatures(featureBits, rootType, reinterpret_cast<const VkPhysicalDevice8BitStorageFeatures*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES:
         {
-            count_VkPhysicalDeviceDriverProperties(featureBits, reinterpret_cast<const VkPhysicalDeviceDriverProperties*>(structExtension), count);
+            count_VkPhysicalDeviceDriverProperties(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceDriverProperties*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES:
         {
-            count_VkPhysicalDeviceShaderAtomicInt64Features(featureBits, reinterpret_cast<const VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension), count);
+            count_VkPhysicalDeviceShaderAtomicInt64Features(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES:
         {
-            count_VkPhysicalDeviceShaderFloat16Int8Features(featureBits, reinterpret_cast<const VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension), count);
+            count_VkPhysicalDeviceShaderFloat16Int8Features(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES:
         {
-            count_VkPhysicalDeviceFloatControlsProperties(featureBits, reinterpret_cast<const VkPhysicalDeviceFloatControlsProperties*>(structExtension), count);
+            count_VkPhysicalDeviceFloatControlsProperties(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceFloatControlsProperties*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO:
         {
-            count_VkDescriptorSetLayoutBindingFlagsCreateInfo(featureBits, reinterpret_cast<const VkDescriptorSetLayoutBindingFlagsCreateInfo*>(structExtension), count);
+            count_VkDescriptorSetLayoutBindingFlagsCreateInfo(featureBits, rootType, reinterpret_cast<const VkDescriptorSetLayoutBindingFlagsCreateInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES:
         {
-            count_VkPhysicalDeviceDescriptorIndexingFeatures(featureBits, reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension), count);
+            count_VkPhysicalDeviceDescriptorIndexingFeatures(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES:
         {
-            count_VkPhysicalDeviceDescriptorIndexingProperties(featureBits, reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingProperties*>(structExtension), count);
+            count_VkPhysicalDeviceDescriptorIndexingProperties(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingProperties*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO:
         {
-            count_VkDescriptorSetVariableDescriptorCountAllocateInfo(featureBits, reinterpret_cast<const VkDescriptorSetVariableDescriptorCountAllocateInfo*>(structExtension), count);
+            count_VkDescriptorSetVariableDescriptorCountAllocateInfo(featureBits, rootType, reinterpret_cast<const VkDescriptorSetVariableDescriptorCountAllocateInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT:
         {
-            count_VkDescriptorSetVariableDescriptorCountLayoutSupport(featureBits, reinterpret_cast<const VkDescriptorSetVariableDescriptorCountLayoutSupport*>(structExtension), count);
+            count_VkDescriptorSetVariableDescriptorCountLayoutSupport(featureBits, rootType, reinterpret_cast<const VkDescriptorSetVariableDescriptorCountLayoutSupport*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE:
         {
-            count_VkSubpassDescriptionDepthStencilResolve(featureBits, reinterpret_cast<const VkSubpassDescriptionDepthStencilResolve*>(structExtension), count);
+            count_VkSubpassDescriptionDepthStencilResolve(featureBits, rootType, reinterpret_cast<const VkSubpassDescriptionDepthStencilResolve*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES:
         {
-            count_VkPhysicalDeviceDepthStencilResolveProperties(featureBits, reinterpret_cast<const VkPhysicalDeviceDepthStencilResolveProperties*>(structExtension), count);
+            count_VkPhysicalDeviceDepthStencilResolveProperties(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceDepthStencilResolveProperties*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES:
         {
-            count_VkPhysicalDeviceScalarBlockLayoutFeatures(featureBits, reinterpret_cast<const VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension), count);
+            count_VkPhysicalDeviceScalarBlockLayoutFeatures(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO:
         {
-            count_VkImageStencilUsageCreateInfo(featureBits, reinterpret_cast<const VkImageStencilUsageCreateInfo*>(structExtension), count);
+            count_VkImageStencilUsageCreateInfo(featureBits, rootType, reinterpret_cast<const VkImageStencilUsageCreateInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO:
         {
-            count_VkSamplerReductionModeCreateInfo(featureBits, reinterpret_cast<const VkSamplerReductionModeCreateInfo*>(structExtension), count);
+            count_VkSamplerReductionModeCreateInfo(featureBits, rootType, reinterpret_cast<const VkSamplerReductionModeCreateInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES:
         {
-            count_VkPhysicalDeviceSamplerFilterMinmaxProperties(featureBits, reinterpret_cast<const VkPhysicalDeviceSamplerFilterMinmaxProperties*>(structExtension), count);
+            count_VkPhysicalDeviceSamplerFilterMinmaxProperties(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceSamplerFilterMinmaxProperties*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES:
         {
-            count_VkPhysicalDeviceVulkanMemoryModelFeatures(featureBits, reinterpret_cast<const VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension), count);
+            count_VkPhysicalDeviceVulkanMemoryModelFeatures(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES:
         {
-            count_VkPhysicalDeviceImagelessFramebufferFeatures(featureBits, reinterpret_cast<const VkPhysicalDeviceImagelessFramebufferFeatures*>(structExtension), count);
+            count_VkPhysicalDeviceImagelessFramebufferFeatures(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceImagelessFramebufferFeatures*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO:
         {
-            count_VkFramebufferAttachmentsCreateInfo(featureBits, reinterpret_cast<const VkFramebufferAttachmentsCreateInfo*>(structExtension), count);
+            count_VkFramebufferAttachmentsCreateInfo(featureBits, rootType, reinterpret_cast<const VkFramebufferAttachmentsCreateInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO:
         {
-            count_VkRenderPassAttachmentBeginInfo(featureBits, reinterpret_cast<const VkRenderPassAttachmentBeginInfo*>(structExtension), count);
+            count_VkRenderPassAttachmentBeginInfo(featureBits, rootType, reinterpret_cast<const VkRenderPassAttachmentBeginInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES:
         {
-            count_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(featureBits, reinterpret_cast<const VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(structExtension), count);
+            count_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES:
         {
-            count_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(featureBits, reinterpret_cast<const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(structExtension), count);
+            count_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES:
         {
-            count_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(featureBits, reinterpret_cast<const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(structExtension), count);
+            count_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT:
         {
-            count_VkAttachmentReferenceStencilLayout(featureBits, reinterpret_cast<const VkAttachmentReferenceStencilLayout*>(structExtension), count);
+            count_VkAttachmentReferenceStencilLayout(featureBits, rootType, reinterpret_cast<const VkAttachmentReferenceStencilLayout*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT:
         {
-            count_VkAttachmentDescriptionStencilLayout(featureBits, reinterpret_cast<const VkAttachmentDescriptionStencilLayout*>(structExtension), count);
+            count_VkAttachmentDescriptionStencilLayout(featureBits, rootType, reinterpret_cast<const VkAttachmentDescriptionStencilLayout*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES:
         {
-            count_VkPhysicalDeviceHostQueryResetFeatures(featureBits, reinterpret_cast<const VkPhysicalDeviceHostQueryResetFeatures*>(structExtension), count);
+            count_VkPhysicalDeviceHostQueryResetFeatures(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceHostQueryResetFeatures*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES:
         {
-            count_VkPhysicalDeviceTimelineSemaphoreFeatures(featureBits, reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension), count);
+            count_VkPhysicalDeviceTimelineSemaphoreFeatures(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES:
         {
-            count_VkPhysicalDeviceTimelineSemaphoreProperties(featureBits, reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreProperties*>(structExtension), count);
+            count_VkPhysicalDeviceTimelineSemaphoreProperties(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreProperties*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO:
         {
-            count_VkSemaphoreTypeCreateInfo(featureBits, reinterpret_cast<const VkSemaphoreTypeCreateInfo*>(structExtension), count);
+            count_VkSemaphoreTypeCreateInfo(featureBits, rootType, reinterpret_cast<const VkSemaphoreTypeCreateInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO:
         {
-            count_VkTimelineSemaphoreSubmitInfo(featureBits, reinterpret_cast<const VkTimelineSemaphoreSubmitInfo*>(structExtension), count);
+            count_VkTimelineSemaphoreSubmitInfo(featureBits, rootType, reinterpret_cast<const VkTimelineSemaphoreSubmitInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES:
         {
-            count_VkPhysicalDeviceBufferDeviceAddressFeatures(featureBits, reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeatures*>(structExtension), count);
+            count_VkPhysicalDeviceBufferDeviceAddressFeatures(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeatures*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO:
         {
-            count_VkBufferOpaqueCaptureAddressCreateInfo(featureBits, reinterpret_cast<const VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension), count);
+            count_VkBufferOpaqueCaptureAddressCreateInfo(featureBits, rootType, reinterpret_cast<const VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO:
         {
-            count_VkMemoryOpaqueCaptureAddressAllocateInfo(featureBits, reinterpret_cast<const VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension), count);
+            count_VkMemoryOpaqueCaptureAddressAllocateInfo(featureBits, rootType, reinterpret_cast<const VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_KHR_swapchain
         case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR:
         {
-            count_VkImageSwapchainCreateInfoKHR(featureBits, reinterpret_cast<const VkImageSwapchainCreateInfoKHR*>(structExtension), count);
+            count_VkImageSwapchainCreateInfoKHR(featureBits, rootType, reinterpret_cast<const VkImageSwapchainCreateInfoKHR*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR:
         {
-            count_VkBindImageMemorySwapchainInfoKHR(featureBits, reinterpret_cast<const VkBindImageMemorySwapchainInfoKHR*>(structExtension), count);
+            count_VkBindImageMemorySwapchainInfoKHR(featureBits, rootType, reinterpret_cast<const VkBindImageMemorySwapchainInfoKHR*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR:
         {
-            count_VkDeviceGroupPresentInfoKHR(featureBits, reinterpret_cast<const VkDeviceGroupPresentInfoKHR*>(structExtension), count);
+            count_VkDeviceGroupPresentInfoKHR(featureBits, rootType, reinterpret_cast<const VkDeviceGroupPresentInfoKHR*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR:
         {
-            count_VkDeviceGroupSwapchainCreateInfoKHR(featureBits, reinterpret_cast<const VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension), count);
+            count_VkDeviceGroupSwapchainCreateInfoKHR(featureBits, rootType, reinterpret_cast<const VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_KHR_display_swapchain
         case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR:
         {
-            count_VkDisplayPresentInfoKHR(featureBits, reinterpret_cast<const VkDisplayPresentInfoKHR*>(structExtension), count);
+            count_VkDisplayPresentInfoKHR(featureBits, rootType, reinterpret_cast<const VkDisplayPresentInfoKHR*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_KHR_external_memory_win32
         case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
         {
-            count_VkImportMemoryWin32HandleInfoKHR(featureBits, reinterpret_cast<const VkImportMemoryWin32HandleInfoKHR*>(structExtension), count);
+            count_VkImportMemoryWin32HandleInfoKHR(featureBits, rootType, reinterpret_cast<const VkImportMemoryWin32HandleInfoKHR*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
         {
-            count_VkExportMemoryWin32HandleInfoKHR(featureBits, reinterpret_cast<const VkExportMemoryWin32HandleInfoKHR*>(structExtension), count);
+            count_VkExportMemoryWin32HandleInfoKHR(featureBits, rootType, reinterpret_cast<const VkExportMemoryWin32HandleInfoKHR*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_KHR_external_memory_fd
         case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR:
         {
-            count_VkImportMemoryFdInfoKHR(featureBits, reinterpret_cast<const VkImportMemoryFdInfoKHR*>(structExtension), count);
+            count_VkImportMemoryFdInfoKHR(featureBits, rootType, reinterpret_cast<const VkImportMemoryFdInfoKHR*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
         case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR:
         {
-            count_VkWin32KeyedMutexAcquireReleaseInfoKHR(featureBits, reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension), count);
+            count_VkWin32KeyedMutexAcquireReleaseInfoKHR(featureBits, rootType, reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_KHR_external_semaphore_win32
         case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR:
         {
-            count_VkExportSemaphoreWin32HandleInfoKHR(featureBits, reinterpret_cast<const VkExportSemaphoreWin32HandleInfoKHR*>(structExtension), count);
+            count_VkExportSemaphoreWin32HandleInfoKHR(featureBits, rootType, reinterpret_cast<const VkExportSemaphoreWin32HandleInfoKHR*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR:
         {
-            count_VkD3D12FenceSubmitInfoKHR(featureBits, reinterpret_cast<const VkD3D12FenceSubmitInfoKHR*>(structExtension), count);
+            count_VkD3D12FenceSubmitInfoKHR(featureBits, rootType, reinterpret_cast<const VkD3D12FenceSubmitInfoKHR*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_KHR_push_descriptor
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR:
         {
-            count_VkPhysicalDevicePushDescriptorPropertiesKHR(featureBits, reinterpret_cast<const VkPhysicalDevicePushDescriptorPropertiesKHR*>(structExtension), count);
+            count_VkPhysicalDevicePushDescriptorPropertiesKHR(featureBits, rootType, reinterpret_cast<const VkPhysicalDevicePushDescriptorPropertiesKHR*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_KHR_incremental_present
         case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR:
         {
-            count_VkPresentRegionsKHR(featureBits, reinterpret_cast<const VkPresentRegionsKHR*>(structExtension), count);
+            count_VkPresentRegionsKHR(featureBits, rootType, reinterpret_cast<const VkPresentRegionsKHR*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_KHR_shared_presentable_image
         case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR:
         {
-            count_VkSharedPresentSurfaceCapabilitiesKHR(featureBits, reinterpret_cast<const VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension), count);
+            count_VkSharedPresentSurfaceCapabilitiesKHR(featureBits, rootType, reinterpret_cast<const VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_KHR_external_fence_win32
         case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR:
         {
-            count_VkExportFenceWin32HandleInfoKHR(featureBits, reinterpret_cast<const VkExportFenceWin32HandleInfoKHR*>(structExtension), count);
+            count_VkExportFenceWin32HandleInfoKHR(featureBits, rootType, reinterpret_cast<const VkExportFenceWin32HandleInfoKHR*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_KHR_performance_query
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR:
         {
-            count_VkPhysicalDevicePerformanceQueryFeaturesKHR(featureBits, reinterpret_cast<const VkPhysicalDevicePerformanceQueryFeaturesKHR*>(structExtension), count);
+            count_VkPhysicalDevicePerformanceQueryFeaturesKHR(featureBits, rootType, reinterpret_cast<const VkPhysicalDevicePerformanceQueryFeaturesKHR*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR:
         {
-            count_VkPhysicalDevicePerformanceQueryPropertiesKHR(featureBits, reinterpret_cast<const VkPhysicalDevicePerformanceQueryPropertiesKHR*>(structExtension), count);
+            count_VkPhysicalDevicePerformanceQueryPropertiesKHR(featureBits, rootType, reinterpret_cast<const VkPhysicalDevicePerformanceQueryPropertiesKHR*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR:
         {
-            count_VkQueryPoolPerformanceCreateInfoKHR(featureBits, reinterpret_cast<const VkQueryPoolPerformanceCreateInfoKHR*>(structExtension), count);
+            count_VkQueryPoolPerformanceCreateInfoKHR(featureBits, rootType, reinterpret_cast<const VkQueryPoolPerformanceCreateInfoKHR*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR:
         {
-            count_VkPerformanceQuerySubmitInfoKHR(featureBits, reinterpret_cast<const VkPerformanceQuerySubmitInfoKHR*>(structExtension), count);
+            count_VkPerformanceQuerySubmitInfoKHR(featureBits, rootType, reinterpret_cast<const VkPerformanceQuerySubmitInfoKHR*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_KHR_portability_subset
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR:
         {
-            count_VkPhysicalDevicePortabilitySubsetFeaturesKHR(featureBits, reinterpret_cast<const VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(structExtension), count);
+            count_VkPhysicalDevicePortabilitySubsetFeaturesKHR(featureBits, rootType, reinterpret_cast<const VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR:
         {
-            count_VkPhysicalDevicePortabilitySubsetPropertiesKHR(featureBits, reinterpret_cast<const VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(structExtension), count);
+            count_VkPhysicalDevicePortabilitySubsetPropertiesKHR(featureBits, rootType, reinterpret_cast<const VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_KHR_shader_clock
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR:
         {
-            count_VkPhysicalDeviceShaderClockFeaturesKHR(featureBits, reinterpret_cast<const VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension), count);
+            count_VkPhysicalDeviceShaderClockFeaturesKHR(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_KHR_shader_terminate_invocation
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR:
         {
-            count_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(featureBits, reinterpret_cast<const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(structExtension), count);
+            count_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_KHR_fragment_shading_rate
         case VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR:
         {
-            count_VkFragmentShadingRateAttachmentInfoKHR(featureBits, reinterpret_cast<const VkFragmentShadingRateAttachmentInfoKHR*>(structExtension), count);
+            count_VkFragmentShadingRateAttachmentInfoKHR(featureBits, rootType, reinterpret_cast<const VkFragmentShadingRateAttachmentInfoKHR*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR:
         {
-            count_VkPipelineFragmentShadingRateStateCreateInfoKHR(featureBits, reinterpret_cast<const VkPipelineFragmentShadingRateStateCreateInfoKHR*>(structExtension), count);
+            count_VkPipelineFragmentShadingRateStateCreateInfoKHR(featureBits, rootType, reinterpret_cast<const VkPipelineFragmentShadingRateStateCreateInfoKHR*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR:
         {
-            count_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(featureBits, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(structExtension), count);
+            count_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR:
         {
-            count_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(featureBits, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(structExtension), count);
+            count_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_KHR_surface_protected_capabilities
         case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR:
         {
-            count_VkSurfaceProtectedCapabilitiesKHR(featureBits, reinterpret_cast<const VkSurfaceProtectedCapabilitiesKHR*>(structExtension), count);
+            count_VkSurfaceProtectedCapabilitiesKHR(featureBits, rootType, reinterpret_cast<const VkSurfaceProtectedCapabilitiesKHR*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR:
         {
-            count_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(featureBits, reinterpret_cast<const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(structExtension), count);
+            count_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(featureBits, rootType, reinterpret_cast<const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_ANDROID_native_buffer
         case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID:
         {
-            count_VkNativeBufferANDROID(featureBits, reinterpret_cast<const VkNativeBufferANDROID*>(structExtension), count);
+            count_VkNativeBufferANDROID(featureBits, rootType, reinterpret_cast<const VkNativeBufferANDROID*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_debug_report
         case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT:
         {
-            count_VkDebugReportCallbackCreateInfoEXT(featureBits, reinterpret_cast<const VkDebugReportCallbackCreateInfoEXT*>(structExtension), count);
+            count_VkDebugReportCallbackCreateInfoEXT(featureBits, rootType, reinterpret_cast<const VkDebugReportCallbackCreateInfoEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_AMD_rasterization_order
         case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD:
         {
-            count_VkPipelineRasterizationStateRasterizationOrderAMD(featureBits, reinterpret_cast<const VkPipelineRasterizationStateRasterizationOrderAMD*>(structExtension), count);
+            count_VkPipelineRasterizationStateRasterizationOrderAMD(featureBits, rootType, reinterpret_cast<const VkPipelineRasterizationStateRasterizationOrderAMD*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_NV_dedicated_allocation
         case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV:
         {
-            count_VkDedicatedAllocationImageCreateInfoNV(featureBits, reinterpret_cast<const VkDedicatedAllocationImageCreateInfoNV*>(structExtension), count);
+            count_VkDedicatedAllocationImageCreateInfoNV(featureBits, rootType, reinterpret_cast<const VkDedicatedAllocationImageCreateInfoNV*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV:
         {
-            count_VkDedicatedAllocationBufferCreateInfoNV(featureBits, reinterpret_cast<const VkDedicatedAllocationBufferCreateInfoNV*>(structExtension), count);
+            count_VkDedicatedAllocationBufferCreateInfoNV(featureBits, rootType, reinterpret_cast<const VkDedicatedAllocationBufferCreateInfoNV*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV:
         {
-            count_VkDedicatedAllocationMemoryAllocateInfoNV(featureBits, reinterpret_cast<const VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension), count);
+            count_VkDedicatedAllocationMemoryAllocateInfoNV(featureBits, rootType, reinterpret_cast<const VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_transform_feedback
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT:
         {
-            count_VkPhysicalDeviceTransformFeedbackFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceTransformFeedbackFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT:
         {
-            count_VkPhysicalDeviceTransformFeedbackPropertiesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceTransformFeedbackPropertiesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT:
         {
-            count_VkPipelineRasterizationStateStreamCreateInfoEXT(featureBits, reinterpret_cast<const VkPipelineRasterizationStateStreamCreateInfoEXT*>(structExtension), count);
+            count_VkPipelineRasterizationStateStreamCreateInfoEXT(featureBits, rootType, reinterpret_cast<const VkPipelineRasterizationStateStreamCreateInfoEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
         case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD:
         {
-            count_VkTextureLODGatherFormatPropertiesAMD(featureBits, reinterpret_cast<const VkTextureLODGatherFormatPropertiesAMD*>(structExtension), count);
+            count_VkTextureLODGatherFormatPropertiesAMD(featureBits, rootType, reinterpret_cast<const VkTextureLODGatherFormatPropertiesAMD*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_NV_corner_sampled_image
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV:
         {
-            count_VkPhysicalDeviceCornerSampledImageFeaturesNV(featureBits, reinterpret_cast<const VkPhysicalDeviceCornerSampledImageFeaturesNV*>(structExtension), count);
+            count_VkPhysicalDeviceCornerSampledImageFeaturesNV(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceCornerSampledImageFeaturesNV*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_NV_external_memory
         case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV:
         {
-            count_VkExternalMemoryImageCreateInfoNV(featureBits, reinterpret_cast<const VkExternalMemoryImageCreateInfoNV*>(structExtension), count);
+            count_VkExternalMemoryImageCreateInfoNV(featureBits, rootType, reinterpret_cast<const VkExternalMemoryImageCreateInfoNV*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV:
         {
-            count_VkExportMemoryAllocateInfoNV(featureBits, reinterpret_cast<const VkExportMemoryAllocateInfoNV*>(structExtension), count);
+            count_VkExportMemoryAllocateInfoNV(featureBits, rootType, reinterpret_cast<const VkExportMemoryAllocateInfoNV*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_NV_external_memory_win32
         case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV:
         {
-            count_VkImportMemoryWin32HandleInfoNV(featureBits, reinterpret_cast<const VkImportMemoryWin32HandleInfoNV*>(structExtension), count);
+            count_VkImportMemoryWin32HandleInfoNV(featureBits, rootType, reinterpret_cast<const VkImportMemoryWin32HandleInfoNV*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV:
         {
-            count_VkExportMemoryWin32HandleInfoNV(featureBits, reinterpret_cast<const VkExportMemoryWin32HandleInfoNV*>(structExtension), count);
+            count_VkExportMemoryWin32HandleInfoNV(featureBits, rootType, reinterpret_cast<const VkExportMemoryWin32HandleInfoNV*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_NV_win32_keyed_mutex
         case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV:
         {
-            count_VkWin32KeyedMutexAcquireReleaseInfoNV(featureBits, reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension), count);
+            count_VkWin32KeyedMutexAcquireReleaseInfoNV(featureBits, rootType, reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_validation_flags
         case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT:
         {
-            count_VkValidationFlagsEXT(featureBits, reinterpret_cast<const VkValidationFlagsEXT*>(structExtension), count);
+            count_VkValidationFlagsEXT(featureBits, rootType, reinterpret_cast<const VkValidationFlagsEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_texture_compression_astc_hdr
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT:
         {
-            count_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_astc_decode_mode
         case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT:
         {
-            count_VkImageViewASTCDecodeModeEXT(featureBits, reinterpret_cast<const VkImageViewASTCDecodeModeEXT*>(structExtension), count);
+            count_VkImageViewASTCDecodeModeEXT(featureBits, rootType, reinterpret_cast<const VkImageViewASTCDecodeModeEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT:
         {
-            count_VkPhysicalDeviceASTCDecodeFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceASTCDecodeFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_conditional_rendering
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT:
         {
-            count_VkPhysicalDeviceConditionalRenderingFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceConditionalRenderingFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT:
         {
-            count_VkCommandBufferInheritanceConditionalRenderingInfoEXT(featureBits, reinterpret_cast<const VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(structExtension), count);
+            count_VkCommandBufferInheritanceConditionalRenderingInfoEXT(featureBits, rootType, reinterpret_cast<const VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_NV_clip_space_w_scaling
         case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV:
         {
-            count_VkPipelineViewportWScalingStateCreateInfoNV(featureBits, reinterpret_cast<const VkPipelineViewportWScalingStateCreateInfoNV*>(structExtension), count);
+            count_VkPipelineViewportWScalingStateCreateInfoNV(featureBits, rootType, reinterpret_cast<const VkPipelineViewportWScalingStateCreateInfoNV*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_display_control
         case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT:
         {
-            count_VkSwapchainCounterCreateInfoEXT(featureBits, reinterpret_cast<const VkSwapchainCounterCreateInfoEXT*>(structExtension), count);
+            count_VkSwapchainCounterCreateInfoEXT(featureBits, rootType, reinterpret_cast<const VkSwapchainCounterCreateInfoEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_GOOGLE_display_timing
         case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE:
         {
-            count_VkPresentTimesInfoGOOGLE(featureBits, reinterpret_cast<const VkPresentTimesInfoGOOGLE*>(structExtension), count);
+            count_VkPresentTimesInfoGOOGLE(featureBits, rootType, reinterpret_cast<const VkPresentTimesInfoGOOGLE*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_NVX_multiview_per_view_attributes
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX:
         {
-            count_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(featureBits, reinterpret_cast<const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(structExtension), count);
+            count_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_NV_viewport_swizzle
         case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV:
         {
-            count_VkPipelineViewportSwizzleStateCreateInfoNV(featureBits, reinterpret_cast<const VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension), count);
+            count_VkPipelineViewportSwizzleStateCreateInfoNV(featureBits, rootType, reinterpret_cast<const VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_discard_rectangles
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT:
         {
-            count_VkPhysicalDeviceDiscardRectanglePropertiesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceDiscardRectanglePropertiesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT:
         {
-            count_VkPipelineDiscardRectangleStateCreateInfoEXT(featureBits, reinterpret_cast<const VkPipelineDiscardRectangleStateCreateInfoEXT*>(structExtension), count);
+            count_VkPipelineDiscardRectangleStateCreateInfoEXT(featureBits, rootType, reinterpret_cast<const VkPipelineDiscardRectangleStateCreateInfoEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_conservative_rasterization
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT:
         {
-            count_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT:
         {
-            count_VkPipelineRasterizationConservativeStateCreateInfoEXT(featureBits, reinterpret_cast<const VkPipelineRasterizationConservativeStateCreateInfoEXT*>(structExtension), count);
+            count_VkPipelineRasterizationConservativeStateCreateInfoEXT(featureBits, rootType, reinterpret_cast<const VkPipelineRasterizationConservativeStateCreateInfoEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_depth_clip_enable
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT:
         {
-            count_VkPhysicalDeviceDepthClipEnableFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceDepthClipEnableFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT:
         {
-            count_VkPipelineRasterizationDepthClipStateCreateInfoEXT(featureBits, reinterpret_cast<const VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(structExtension), count);
+            count_VkPipelineRasterizationDepthClipStateCreateInfoEXT(featureBits, rootType, reinterpret_cast<const VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_debug_utils
         case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT:
         {
-            count_VkDebugUtilsMessengerCreateInfoEXT(featureBits, reinterpret_cast<const VkDebugUtilsMessengerCreateInfoEXT*>(structExtension), count);
+            count_VkDebugUtilsMessengerCreateInfoEXT(featureBits, rootType, reinterpret_cast<const VkDebugUtilsMessengerCreateInfoEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
         case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID:
         {
-            count_VkAndroidHardwareBufferUsageANDROID(featureBits, reinterpret_cast<const VkAndroidHardwareBufferUsageANDROID*>(structExtension), count);
+            count_VkAndroidHardwareBufferUsageANDROID(featureBits, rootType, reinterpret_cast<const VkAndroidHardwareBufferUsageANDROID*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID:
         {
-            count_VkAndroidHardwareBufferFormatPropertiesANDROID(featureBits, reinterpret_cast<const VkAndroidHardwareBufferFormatPropertiesANDROID*>(structExtension), count);
+            count_VkAndroidHardwareBufferFormatPropertiesANDROID(featureBits, rootType, reinterpret_cast<const VkAndroidHardwareBufferFormatPropertiesANDROID*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID:
         {
-            count_VkImportAndroidHardwareBufferInfoANDROID(featureBits, reinterpret_cast<const VkImportAndroidHardwareBufferInfoANDROID*>(structExtension), count);
+            count_VkImportAndroidHardwareBufferInfoANDROID(featureBits, rootType, reinterpret_cast<const VkImportAndroidHardwareBufferInfoANDROID*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID:
         {
-            count_VkExternalFormatANDROID(featureBits, reinterpret_cast<const VkExternalFormatANDROID*>(structExtension), count);
+            count_VkExternalFormatANDROID(featureBits, rootType, reinterpret_cast<const VkExternalFormatANDROID*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_inline_uniform_block
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT:
         {
-            count_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT:
         {
-            count_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT:
         {
-            count_VkWriteDescriptorSetInlineUniformBlockEXT(featureBits, reinterpret_cast<const VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension), count);
+            count_VkWriteDescriptorSetInlineUniformBlockEXT(featureBits, rootType, reinterpret_cast<const VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT:
         {
-            count_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(featureBits, reinterpret_cast<const VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(structExtension), count);
+            count_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(featureBits, rootType, reinterpret_cast<const VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_sample_locations
         case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT:
         {
-            count_VkSampleLocationsInfoEXT(featureBits, reinterpret_cast<const VkSampleLocationsInfoEXT*>(structExtension), count);
+            count_VkSampleLocationsInfoEXT(featureBits, rootType, reinterpret_cast<const VkSampleLocationsInfoEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT:
         {
-            count_VkRenderPassSampleLocationsBeginInfoEXT(featureBits, reinterpret_cast<const VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension), count);
+            count_VkRenderPassSampleLocationsBeginInfoEXT(featureBits, rootType, reinterpret_cast<const VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT:
         {
-            count_VkPipelineSampleLocationsStateCreateInfoEXT(featureBits, reinterpret_cast<const VkPipelineSampleLocationsStateCreateInfoEXT*>(structExtension), count);
+            count_VkPipelineSampleLocationsStateCreateInfoEXT(featureBits, rootType, reinterpret_cast<const VkPipelineSampleLocationsStateCreateInfoEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT:
         {
-            count_VkPhysicalDeviceSampleLocationsPropertiesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceSampleLocationsPropertiesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceSampleLocationsPropertiesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceSampleLocationsPropertiesEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_blend_operation_advanced
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT:
         {
-            count_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT:
         {
-            count_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT:
         {
-            count_VkPipelineColorBlendAdvancedStateCreateInfoEXT(featureBits, reinterpret_cast<const VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(structExtension), count);
+            count_VkPipelineColorBlendAdvancedStateCreateInfoEXT(featureBits, rootType, reinterpret_cast<const VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_NV_fragment_coverage_to_color
         case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV:
         {
-            count_VkPipelineCoverageToColorStateCreateInfoNV(featureBits, reinterpret_cast<const VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension), count);
+            count_VkPipelineCoverageToColorStateCreateInfoNV(featureBits, rootType, reinterpret_cast<const VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_NV_framebuffer_mixed_samples
         case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV:
         {
-            count_VkPipelineCoverageModulationStateCreateInfoNV(featureBits, reinterpret_cast<const VkPipelineCoverageModulationStateCreateInfoNV*>(structExtension), count);
+            count_VkPipelineCoverageModulationStateCreateInfoNV(featureBits, rootType, reinterpret_cast<const VkPipelineCoverageModulationStateCreateInfoNV*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_NV_shader_sm_builtins
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV:
         {
-            count_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(featureBits, reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(structExtension), count);
+            count_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV:
         {
-            count_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(featureBits, reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(structExtension), count);
+            count_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
         case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT:
         {
-            count_VkDrmFormatModifierPropertiesListEXT(featureBits, reinterpret_cast<const VkDrmFormatModifierPropertiesListEXT*>(structExtension), count);
+            count_VkDrmFormatModifierPropertiesListEXT(featureBits, rootType, reinterpret_cast<const VkDrmFormatModifierPropertiesListEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT:
         {
-            count_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(structExtension), count);
+            count_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT:
         {
-            count_VkImageDrmFormatModifierListCreateInfoEXT(featureBits, reinterpret_cast<const VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension), count);
+            count_VkImageDrmFormatModifierListCreateInfoEXT(featureBits, rootType, reinterpret_cast<const VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT:
         {
-            count_VkImageDrmFormatModifierExplicitCreateInfoEXT(featureBits, reinterpret_cast<const VkImageDrmFormatModifierExplicitCreateInfoEXT*>(structExtension), count);
+            count_VkImageDrmFormatModifierExplicitCreateInfoEXT(featureBits, rootType, reinterpret_cast<const VkImageDrmFormatModifierExplicitCreateInfoEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_validation_cache
         case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT:
         {
-            count_VkShaderModuleValidationCacheCreateInfoEXT(featureBits, reinterpret_cast<const VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension), count);
+            count_VkShaderModuleValidationCacheCreateInfoEXT(featureBits, rootType, reinterpret_cast<const VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_NV_shading_rate_image
         case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV:
         {
-            count_VkPipelineViewportShadingRateImageStateCreateInfoNV(featureBits, reinterpret_cast<const VkPipelineViewportShadingRateImageStateCreateInfoNV*>(structExtension), count);
+            count_VkPipelineViewportShadingRateImageStateCreateInfoNV(featureBits, rootType, reinterpret_cast<const VkPipelineViewportShadingRateImageStateCreateInfoNV*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV:
         {
-            count_VkPhysicalDeviceShadingRateImageFeaturesNV(featureBits, reinterpret_cast<const VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension), count);
+            count_VkPhysicalDeviceShadingRateImageFeaturesNV(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV:
         {
-            count_VkPhysicalDeviceShadingRateImagePropertiesNV(featureBits, reinterpret_cast<const VkPhysicalDeviceShadingRateImagePropertiesNV*>(structExtension), count);
+            count_VkPhysicalDeviceShadingRateImagePropertiesNV(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceShadingRateImagePropertiesNV*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV:
         {
-            count_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(featureBits, reinterpret_cast<const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(structExtension), count);
+            count_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(featureBits, rootType, reinterpret_cast<const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_NV_ray_tracing
         case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV:
         {
-            count_VkWriteDescriptorSetAccelerationStructureNV(featureBits, reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureNV*>(structExtension), count);
+            count_VkWriteDescriptorSetAccelerationStructureNV(featureBits, rootType, reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureNV*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV:
         {
-            count_VkPhysicalDeviceRayTracingPropertiesNV(featureBits, reinterpret_cast<const VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension), count);
+            count_VkPhysicalDeviceRayTracingPropertiesNV(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_NV_representative_fragment_test
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV:
         {
-            count_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(featureBits, reinterpret_cast<const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(structExtension), count);
+            count_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV:
         {
-            count_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(featureBits, reinterpret_cast<const VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(structExtension), count);
+            count_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(featureBits, rootType, reinterpret_cast<const VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_filter_cubic
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT:
         {
-            count_VkPhysicalDeviceImageViewImageFormatInfoEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceImageViewImageFormatInfoEXT*>(structExtension), count);
+            count_VkPhysicalDeviceImageViewImageFormatInfoEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceImageViewImageFormatInfoEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT:
         {
-            count_VkFilterCubicImageViewImageFormatPropertiesEXT(featureBits, reinterpret_cast<const VkFilterCubicImageViewImageFormatPropertiesEXT*>(structExtension), count);
+            count_VkFilterCubicImageViewImageFormatPropertiesEXT(featureBits, rootType, reinterpret_cast<const VkFilterCubicImageViewImageFormatPropertiesEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_global_priority
         case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT:
         {
-            count_VkDeviceQueueGlobalPriorityCreateInfoEXT(featureBits, reinterpret_cast<const VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension), count);
+            count_VkDeviceQueueGlobalPriorityCreateInfoEXT(featureBits, rootType, reinterpret_cast<const VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_external_memory_host
         case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT:
         {
-            count_VkImportMemoryHostPointerInfoEXT(featureBits, reinterpret_cast<const VkImportMemoryHostPointerInfoEXT*>(structExtension), count);
+            count_VkImportMemoryHostPointerInfoEXT(featureBits, rootType, reinterpret_cast<const VkImportMemoryHostPointerInfoEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT:
         {
-            count_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
         case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD:
         {
-            count_VkPipelineCompilerControlCreateInfoAMD(featureBits, reinterpret_cast<const VkPipelineCompilerControlCreateInfoAMD*>(structExtension), count);
+            count_VkPipelineCompilerControlCreateInfoAMD(featureBits, rootType, reinterpret_cast<const VkPipelineCompilerControlCreateInfoAMD*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_AMD_shader_core_properties
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD:
         {
-            count_VkPhysicalDeviceShaderCorePropertiesAMD(featureBits, reinterpret_cast<const VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension), count);
+            count_VkPhysicalDeviceShaderCorePropertiesAMD(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
         case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD:
         {
-            count_VkDeviceMemoryOverallocationCreateInfoAMD(featureBits, reinterpret_cast<const VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension), count);
+            count_VkDeviceMemoryOverallocationCreateInfoAMD(featureBits, rootType, reinterpret_cast<const VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_vertex_attribute_divisor
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT:
         {
-            count_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT:
         {
-            count_VkPipelineVertexInputDivisorStateCreateInfoEXT(featureBits, reinterpret_cast<const VkPipelineVertexInputDivisorStateCreateInfoEXT*>(structExtension), count);
+            count_VkPipelineVertexInputDivisorStateCreateInfoEXT(featureBits, rootType, reinterpret_cast<const VkPipelineVertexInputDivisorStateCreateInfoEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT:
         {
-            count_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_GGP_frame_token
         case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP:
         {
-            count_VkPresentFrameTokenGGP(featureBits, reinterpret_cast<const VkPresentFrameTokenGGP*>(structExtension), count);
+            count_VkPresentFrameTokenGGP(featureBits, rootType, reinterpret_cast<const VkPresentFrameTokenGGP*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
         case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT:
         {
-            count_VkPipelineCreationFeedbackCreateInfoEXT(featureBits, reinterpret_cast<const VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension), count);
+            count_VkPipelineCreationFeedbackCreateInfoEXT(featureBits, rootType, reinterpret_cast<const VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_NV_compute_shader_derivatives
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV:
         {
-            count_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(featureBits, reinterpret_cast<const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(structExtension), count);
+            count_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_NV_mesh_shader
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV:
         {
-            count_VkPhysicalDeviceMeshShaderFeaturesNV(featureBits, reinterpret_cast<const VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension), count);
+            count_VkPhysicalDeviceMeshShaderFeaturesNV(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV:
         {
-            count_VkPhysicalDeviceMeshShaderPropertiesNV(featureBits, reinterpret_cast<const VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension), count);
+            count_VkPhysicalDeviceMeshShaderPropertiesNV(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV:
         {
-            count_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(featureBits, reinterpret_cast<const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(structExtension), count);
+            count_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_NV_shader_image_footprint
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV:
         {
-            count_VkPhysicalDeviceShaderImageFootprintFeaturesNV(featureBits, reinterpret_cast<const VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(structExtension), count);
+            count_VkPhysicalDeviceShaderImageFootprintFeaturesNV(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_NV_scissor_exclusive
         case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV:
         {
-            count_VkPipelineViewportExclusiveScissorStateCreateInfoNV(featureBits, reinterpret_cast<const VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(structExtension), count);
+            count_VkPipelineViewportExclusiveScissorStateCreateInfoNV(featureBits, rootType, reinterpret_cast<const VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV:
         {
-            count_VkPhysicalDeviceExclusiveScissorFeaturesNV(featureBits, reinterpret_cast<const VkPhysicalDeviceExclusiveScissorFeaturesNV*>(structExtension), count);
+            count_VkPhysicalDeviceExclusiveScissorFeaturesNV(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceExclusiveScissorFeaturesNV*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
         case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV:
         {
-            count_VkQueueFamilyCheckpointPropertiesNV(featureBits, reinterpret_cast<const VkQueueFamilyCheckpointPropertiesNV*>(structExtension), count);
+            count_VkQueueFamilyCheckpointPropertiesNV(featureBits, rootType, reinterpret_cast<const VkQueueFamilyCheckpointPropertiesNV*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL:
         {
-            count_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(featureBits, reinterpret_cast<const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(structExtension), count);
+            count_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_INTEL_performance_query
         case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL:
         {
-            count_VkQueryPoolPerformanceQueryCreateInfoINTEL(featureBits, reinterpret_cast<const VkQueryPoolPerformanceQueryCreateInfoINTEL*>(structExtension), count);
+            count_VkQueryPoolPerformanceQueryCreateInfoINTEL(featureBits, rootType, reinterpret_cast<const VkQueryPoolPerformanceQueryCreateInfoINTEL*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_pci_bus_info
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT:
         {
-            count_VkPhysicalDevicePCIBusInfoPropertiesEXT(featureBits, reinterpret_cast<const VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension), count);
+            count_VkPhysicalDevicePCIBusInfoPropertiesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_AMD_display_native_hdr
         case VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD:
         {
-            count_VkDisplayNativeHdrSurfaceCapabilitiesAMD(featureBits, reinterpret_cast<const VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension), count);
+            count_VkDisplayNativeHdrSurfaceCapabilitiesAMD(featureBits, rootType, reinterpret_cast<const VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD:
         {
-            count_VkSwapchainDisplayNativeHdrCreateInfoAMD(featureBits, reinterpret_cast<const VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension), count);
+            count_VkSwapchainDisplayNativeHdrCreateInfoAMD(featureBits, rootType, reinterpret_cast<const VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension), count);
             break;
         }
 #endif
-#ifdef VK_GOOGLE_color_buffer
-        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE:
+#ifdef VK_EXT_fragment_density_map
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT:
         {
-            count_VkImportColorBufferGOOGLE(featureBits, reinterpret_cast<const VkImportColorBufferGOOGLE*>(structExtension), count);
+            switch(rootType)
+            {
+                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
+                {
+                    count_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension), count);
+                    break;
+                }
+                case VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO:
+                {
+                    count_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension), count);
+                    break;
+                }
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
+                {
+                    count_VkImportColorBufferGOOGLE(featureBits, rootType, reinterpret_cast<const VkImportColorBufferGOOGLE*>(structExtension), count);
+                    break;
+                }
+                default:
+                {
+                    count_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension), count);
+                    break;
+                }
+            }
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE:
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT:
         {
-            count_VkImportBufferGOOGLE(featureBits, reinterpret_cast<const VkImportBufferGOOGLE*>(structExtension), count);
+            switch(rootType)
+            {
+                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2:
+                {
+                    count_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension), count);
+                    break;
+                }
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
+                {
+                    count_VkImportPhysicalAddressGOOGLE(featureBits, rootType, reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension), count);
+                    break;
+                }
+                default:
+                {
+                    count_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension), count);
+                    break;
+                }
+            }
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
+        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT:
         {
-            count_VkImportPhysicalAddressGOOGLE(featureBits, reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension), count);
+            switch(rootType)
+            {
+                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO:
+                {
+                    count_VkRenderPassFragmentDensityMapCreateInfoEXT(featureBits, rootType, reinterpret_cast<const VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension), count);
+                    break;
+                }
+                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2:
+                {
+                    count_VkRenderPassFragmentDensityMapCreateInfoEXT(featureBits, rootType, reinterpret_cast<const VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension), count);
+                    break;
+                }
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
+                {
+                    count_VkImportBufferGOOGLE(featureBits, rootType, reinterpret_cast<const VkImportBufferGOOGLE*>(structExtension), count);
+                    break;
+                }
+                default:
+                {
+                    count_VkRenderPassFragmentDensityMapCreateInfoEXT(featureBits, rootType, reinterpret_cast<const VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension), count);
+                    break;
+                }
+            }
             break;
         }
 #endif
 #ifdef VK_EXT_subgroup_size_control
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT:
         {
-            count_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT:
         {
-            count_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT:
         {
-            count_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(featureBits, reinterpret_cast<const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(structExtension), count);
+            count_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(featureBits, rootType, reinterpret_cast<const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_AMD_shader_core_properties2
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD:
         {
-            count_VkPhysicalDeviceShaderCoreProperties2AMD(featureBits, reinterpret_cast<const VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension), count);
+            count_VkPhysicalDeviceShaderCoreProperties2AMD(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_AMD_device_coherent_memory
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD:
         {
-            count_VkPhysicalDeviceCoherentMemoryFeaturesAMD(featureBits, reinterpret_cast<const VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension), count);
+            count_VkPhysicalDeviceCoherentMemoryFeaturesAMD(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_shader_image_atomic_int64
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT:
         {
-            count_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_memory_budget
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT:
         {
-            count_VkPhysicalDeviceMemoryBudgetPropertiesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceMemoryBudgetPropertiesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_memory_priority
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT:
         {
-            count_VkPhysicalDeviceMemoryPriorityFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceMemoryPriorityFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT:
         {
-            count_VkMemoryPriorityAllocateInfoEXT(featureBits, reinterpret_cast<const VkMemoryPriorityAllocateInfoEXT*>(structExtension), count);
+            count_VkMemoryPriorityAllocateInfoEXT(featureBits, rootType, reinterpret_cast<const VkMemoryPriorityAllocateInfoEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_NV_dedicated_allocation_image_aliasing
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV:
         {
-            count_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(featureBits, reinterpret_cast<const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(structExtension), count);
+            count_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_buffer_device_address
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT:
         {
-            count_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT:
         {
-            count_VkBufferDeviceAddressCreateInfoEXT(featureBits, reinterpret_cast<const VkBufferDeviceAddressCreateInfoEXT*>(structExtension), count);
+            count_VkBufferDeviceAddressCreateInfoEXT(featureBits, rootType, reinterpret_cast<const VkBufferDeviceAddressCreateInfoEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_validation_features
         case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT:
         {
-            count_VkValidationFeaturesEXT(featureBits, reinterpret_cast<const VkValidationFeaturesEXT*>(structExtension), count);
+            count_VkValidationFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkValidationFeaturesEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_NV_cooperative_matrix
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV:
         {
-            count_VkPhysicalDeviceCooperativeMatrixFeaturesNV(featureBits, reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(structExtension), count);
+            count_VkPhysicalDeviceCooperativeMatrixFeaturesNV(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV:
         {
-            count_VkPhysicalDeviceCooperativeMatrixPropertiesNV(featureBits, reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(structExtension), count);
+            count_VkPhysicalDeviceCooperativeMatrixPropertiesNV(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_NV_coverage_reduction_mode
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV:
         {
-            count_VkPhysicalDeviceCoverageReductionModeFeaturesNV(featureBits, reinterpret_cast<const VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(structExtension), count);
+            count_VkPhysicalDeviceCoverageReductionModeFeaturesNV(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV:
         {
-            count_VkPipelineCoverageReductionStateCreateInfoNV(featureBits, reinterpret_cast<const VkPipelineCoverageReductionStateCreateInfoNV*>(structExtension), count);
+            count_VkPipelineCoverageReductionStateCreateInfoNV(featureBits, rootType, reinterpret_cast<const VkPipelineCoverageReductionStateCreateInfoNV*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT:
         {
-            count_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_ycbcr_image_arrays
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT:
         {
-            count_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_full_screen_exclusive
         case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT:
         {
-            count_VkSurfaceFullScreenExclusiveInfoEXT(featureBits, reinterpret_cast<const VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension), count);
+            count_VkSurfaceFullScreenExclusiveInfoEXT(featureBits, rootType, reinterpret_cast<const VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT:
         {
-            count_VkSurfaceCapabilitiesFullScreenExclusiveEXT(featureBits, reinterpret_cast<const VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(structExtension), count);
+            count_VkSurfaceCapabilitiesFullScreenExclusiveEXT(featureBits, rootType, reinterpret_cast<const VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT:
         {
-            count_VkSurfaceFullScreenExclusiveWin32InfoEXT(featureBits, reinterpret_cast<const VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension), count);
+            count_VkSurfaceFullScreenExclusiveWin32InfoEXT(featureBits, rootType, reinterpret_cast<const VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_line_rasterization
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT:
         {
-            count_VkPhysicalDeviceLineRasterizationFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceLineRasterizationFeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceLineRasterizationFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceLineRasterizationFeaturesEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT:
         {
-            count_VkPhysicalDeviceLineRasterizationPropertiesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceLineRasterizationPropertiesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceLineRasterizationPropertiesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceLineRasterizationPropertiesEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT:
         {
-            count_VkPipelineRasterizationLineStateCreateInfoEXT(featureBits, reinterpret_cast<const VkPipelineRasterizationLineStateCreateInfoEXT*>(structExtension), count);
+            count_VkPipelineRasterizationLineStateCreateInfoEXT(featureBits, rootType, reinterpret_cast<const VkPipelineRasterizationLineStateCreateInfoEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_shader_atomic_float
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT:
         {
-            count_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_index_type_uint8
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT:
         {
-            count_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT:
         {
-            count_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT:
         {
-            count_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_NV_device_generated_commands
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV:
         {
-            count_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(featureBits, reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(structExtension), count);
+            count_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV:
         {
-            count_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(featureBits, reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(structExtension), count);
+            count_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV:
         {
-            count_VkGraphicsPipelineShaderGroupsCreateInfoNV(featureBits, reinterpret_cast<const VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension), count);
+            count_VkGraphicsPipelineShaderGroupsCreateInfoNV(featureBits, rootType, reinterpret_cast<const VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_texel_buffer_alignment
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT:
         {
-            count_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT:
         {
-            count_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_QCOM_render_pass_transform
         case VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM:
         {
-            count_VkRenderPassTransformBeginInfoQCOM(featureBits, reinterpret_cast<const VkRenderPassTransformBeginInfoQCOM*>(structExtension), count);
+            count_VkRenderPassTransformBeginInfoQCOM(featureBits, rootType, reinterpret_cast<const VkRenderPassTransformBeginInfoQCOM*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM:
         {
-            count_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(featureBits, reinterpret_cast<const VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(structExtension), count);
+            count_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(featureBits, rootType, reinterpret_cast<const VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_device_memory_report
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT:
         {
-            count_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT:
         {
-            count_VkDeviceDeviceMemoryReportCreateInfoEXT(featureBits, reinterpret_cast<const VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension), count);
+            count_VkDeviceDeviceMemoryReportCreateInfoEXT(featureBits, rootType, reinterpret_cast<const VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_robustness2
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT:
         {
-            count_VkPhysicalDeviceRobustness2FeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceRobustness2FeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT:
         {
-            count_VkPhysicalDeviceRobustness2PropertiesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceRobustness2PropertiesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_custom_border_color
         case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT:
         {
-            count_VkSamplerCustomBorderColorCreateInfoEXT(featureBits, reinterpret_cast<const VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension), count);
+            count_VkSamplerCustomBorderColorCreateInfoEXT(featureBits, rootType, reinterpret_cast<const VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT:
         {
-            count_VkPhysicalDeviceCustomBorderColorPropertiesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceCustomBorderColorPropertiesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT:
         {
-            count_VkPhysicalDeviceCustomBorderColorFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceCustomBorderColorFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_private_data
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT:
         {
-            count_VkPhysicalDevicePrivateDataFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDevicePrivateDataFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT:
         {
-            count_VkDevicePrivateDataCreateInfoEXT(featureBits, reinterpret_cast<const VkDevicePrivateDataCreateInfoEXT*>(structExtension), count);
+            count_VkDevicePrivateDataCreateInfoEXT(featureBits, rootType, reinterpret_cast<const VkDevicePrivateDataCreateInfoEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT:
         {
-            count_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_NV_device_diagnostics_config
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV:
         {
-            count_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(featureBits, reinterpret_cast<const VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(structExtension), count);
+            count_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV:
         {
-            count_VkDeviceDiagnosticsConfigCreateInfoNV(featureBits, reinterpret_cast<const VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension), count);
+            count_VkDeviceDiagnosticsConfigCreateInfoNV(featureBits, rootType, reinterpret_cast<const VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV:
         {
-            count_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(featureBits, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(structExtension), count);
+            count_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV:
         {
-            count_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(featureBits, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(structExtension), count);
+            count_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV:
         {
-            count_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(featureBits, reinterpret_cast<const VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(structExtension), count);
+            count_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(featureBits, rootType, reinterpret_cast<const VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_density_map2
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT:
         {
-            count_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT:
         {
-            count_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
         case VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM:
         {
-            count_VkCopyCommandTransformInfoQCOM(featureBits, reinterpret_cast<const VkCopyCommandTransformInfoQCOM*>(structExtension), count);
+            count_VkCopyCommandTransformInfoQCOM(featureBits, rootType, reinterpret_cast<const VkCopyCommandTransformInfoQCOM*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_image_robustness
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT:
         {
-            count_VkPhysicalDeviceImageRobustnessFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceImageRobustnessFeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDeviceImageRobustnessFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceImageRobustnessFeaturesEXT*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_EXT_4444_formats
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT:
         {
-            count_VkPhysicalDevice4444FormatsFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension), count);
+            count_VkPhysicalDevice4444FormatsFeaturesEXT(featureBits, rootType, reinterpret_cast<const VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_GOOGLE_gfxstream
+        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE:
+        {
+            count_VkImportColorBufferGOOGLE(featureBits, rootType, reinterpret_cast<const VkImportColorBufferGOOGLE*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE:
+        {
+            count_VkImportBufferGOOGLE(featureBits, rootType, reinterpret_cast<const VkImportBufferGOOGLE*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
+        {
+            count_VkImportPhysicalAddressGOOGLE(featureBits, rootType, reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
         case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR:
         {
-            count_VkWriteDescriptorSetAccelerationStructureKHR(featureBits, reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureKHR*>(structExtension), count);
+            count_VkWriteDescriptorSetAccelerationStructureKHR(featureBits, rootType, reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureKHR*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR:
         {
-            count_VkPhysicalDeviceAccelerationStructureFeaturesKHR(featureBits, reinterpret_cast<const VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(structExtension), count);
+            count_VkPhysicalDeviceAccelerationStructureFeaturesKHR(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR:
         {
-            count_VkPhysicalDeviceAccelerationStructurePropertiesKHR(featureBits, reinterpret_cast<const VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(structExtension), count);
+            count_VkPhysicalDeviceAccelerationStructurePropertiesKHR(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR:
         {
-            count_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(featureBits, reinterpret_cast<const VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(structExtension), count);
+            count_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(structExtension), count);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR:
         {
-            count_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(featureBits, reinterpret_cast<const VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(structExtension), count);
+            count_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(structExtension), count);
             break;
         }
 #endif
 #ifdef VK_KHR_ray_query
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR:
         {
-            count_VkPhysicalDeviceRayQueryFeaturesKHR(featureBits, reinterpret_cast<const VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension), count);
+            count_VkPhysicalDeviceRayQueryFeaturesKHR(featureBits, rootType, reinterpret_cast<const VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension), count);
             break;
         }
 #endif
diff --git a/system/vulkan_enc/goldfish_vk_counting_guest.h b/system/vulkan_enc/goldfish_vk_counting_guest.h
index f31e021..6f4d3a7 100644
--- a/system/vulkan_enc/goldfish_vk_counting_guest.h
+++ b/system/vulkan_enc/goldfish_vk_counting_guest.h
@@ -36,546 +36,655 @@
 #ifdef VK_VERSION_1_0
 void count_VkExtent2D(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExtent2D* toCount,
     size_t* count);
 
 void count_VkExtent3D(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExtent3D* toCount,
     size_t* count);
 
 void count_VkOffset2D(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkOffset2D* toCount,
     size_t* count);
 
 void count_VkOffset3D(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkOffset3D* toCount,
     size_t* count);
 
 void count_VkRect2D(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRect2D* toCount,
     size_t* count);
 
 void count_VkBaseInStructure(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBaseInStructure* toCount,
     size_t* count);
 
 void count_VkBaseOutStructure(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBaseOutStructure* toCount,
     size_t* count);
 
 void count_VkBufferMemoryBarrier(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBufferMemoryBarrier* toCount,
     size_t* count);
 
 void count_VkDispatchIndirectCommand(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDispatchIndirectCommand* toCount,
     size_t* count);
 
 void count_VkDrawIndexedIndirectCommand(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDrawIndexedIndirectCommand* toCount,
     size_t* count);
 
 void count_VkDrawIndirectCommand(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDrawIndirectCommand* toCount,
     size_t* count);
 
 void count_VkImageSubresourceRange(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageSubresourceRange* toCount,
     size_t* count);
 
 void count_VkImageMemoryBarrier(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageMemoryBarrier* toCount,
     size_t* count);
 
 void count_VkMemoryBarrier(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryBarrier* toCount,
     size_t* count);
 
 void count_VkAllocationCallbacks(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAllocationCallbacks* toCount,
     size_t* count);
 
 void count_VkApplicationInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkApplicationInfo* toCount,
     size_t* count);
 
 void count_VkFormatProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkFormatProperties* toCount,
     size_t* count);
 
 void count_VkImageFormatProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageFormatProperties* toCount,
     size_t* count);
 
 void count_VkInstanceCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkInstanceCreateInfo* toCount,
     size_t* count);
 
 void count_VkMemoryHeap(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryHeap* toCount,
     size_t* count);
 
 void count_VkMemoryType(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryType* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceFeatures* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceLimits(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceLimits* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceMemoryProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryProperties* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceSparseProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceSparseProperties* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceProperties* toCount,
     size_t* count);
 
 void count_VkQueueFamilyProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkQueueFamilyProperties* toCount,
     size_t* count);
 
 void count_VkDeviceQueueCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceQueueCreateInfo* toCount,
     size_t* count);
 
 void count_VkDeviceCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceCreateInfo* toCount,
     size_t* count);
 
 void count_VkExtensionProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExtensionProperties* toCount,
     size_t* count);
 
 void count_VkLayerProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkLayerProperties* toCount,
     size_t* count);
 
 void count_VkSubmitInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSubmitInfo* toCount,
     size_t* count);
 
 void count_VkMappedMemoryRange(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMappedMemoryRange* toCount,
     size_t* count);
 
 void count_VkMemoryAllocateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryAllocateInfo* toCount,
     size_t* count);
 
 void count_VkMemoryRequirements(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryRequirements* toCount,
     size_t* count);
 
 void count_VkSparseMemoryBind(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSparseMemoryBind* toCount,
     size_t* count);
 
 void count_VkSparseBufferMemoryBindInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSparseBufferMemoryBindInfo* toCount,
     size_t* count);
 
 void count_VkSparseImageOpaqueMemoryBindInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSparseImageOpaqueMemoryBindInfo* toCount,
     size_t* count);
 
 void count_VkImageSubresource(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageSubresource* toCount,
     size_t* count);
 
 void count_VkSparseImageMemoryBind(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSparseImageMemoryBind* toCount,
     size_t* count);
 
 void count_VkSparseImageMemoryBindInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSparseImageMemoryBindInfo* toCount,
     size_t* count);
 
 void count_VkBindSparseInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBindSparseInfo* toCount,
     size_t* count);
 
 void count_VkSparseImageFormatProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSparseImageFormatProperties* toCount,
     size_t* count);
 
 void count_VkSparseImageMemoryRequirements(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSparseImageMemoryRequirements* toCount,
     size_t* count);
 
 void count_VkFenceCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkFenceCreateInfo* toCount,
     size_t* count);
 
 void count_VkSemaphoreCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSemaphoreCreateInfo* toCount,
     size_t* count);
 
 void count_VkEventCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkEventCreateInfo* toCount,
     size_t* count);
 
 void count_VkQueryPoolCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkQueryPoolCreateInfo* toCount,
     size_t* count);
 
 void count_VkBufferCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBufferCreateInfo* toCount,
     size_t* count);
 
 void count_VkBufferViewCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBufferViewCreateInfo* toCount,
     size_t* count);
 
 void count_VkImageCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageCreateInfo* toCount,
     size_t* count);
 
 void count_VkSubresourceLayout(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSubresourceLayout* toCount,
     size_t* count);
 
 void count_VkComponentMapping(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkComponentMapping* toCount,
     size_t* count);
 
 void count_VkImageViewCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageViewCreateInfo* toCount,
     size_t* count);
 
 void count_VkShaderModuleCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkShaderModuleCreateInfo* toCount,
     size_t* count);
 
 void count_VkPipelineCacheCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineCacheCreateInfo* toCount,
     size_t* count);
 
 void count_VkSpecializationMapEntry(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSpecializationMapEntry* toCount,
     size_t* count);
 
 void count_VkSpecializationInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSpecializationInfo* toCount,
     size_t* count);
 
 void count_VkPipelineShaderStageCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineShaderStageCreateInfo* toCount,
     size_t* count);
 
 void count_VkComputePipelineCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkComputePipelineCreateInfo* toCount,
     size_t* count);
 
 void count_VkVertexInputBindingDescription(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkVertexInputBindingDescription* toCount,
     size_t* count);
 
 void count_VkVertexInputAttributeDescription(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkVertexInputAttributeDescription* toCount,
     size_t* count);
 
 void count_VkPipelineVertexInputStateCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineVertexInputStateCreateInfo* toCount,
     size_t* count);
 
 void count_VkPipelineInputAssemblyStateCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineInputAssemblyStateCreateInfo* toCount,
     size_t* count);
 
 void count_VkPipelineTessellationStateCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineTessellationStateCreateInfo* toCount,
     size_t* count);
 
 void count_VkViewport(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkViewport* toCount,
     size_t* count);
 
 void count_VkPipelineViewportStateCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineViewportStateCreateInfo* toCount,
     size_t* count);
 
 void count_VkPipelineRasterizationStateCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineRasterizationStateCreateInfo* toCount,
     size_t* count);
 
 void count_VkPipelineMultisampleStateCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineMultisampleStateCreateInfo* toCount,
     size_t* count);
 
 void count_VkStencilOpState(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkStencilOpState* toCount,
     size_t* count);
 
 void count_VkPipelineDepthStencilStateCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineDepthStencilStateCreateInfo* toCount,
     size_t* count);
 
 void count_VkPipelineColorBlendAttachmentState(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineColorBlendAttachmentState* toCount,
     size_t* count);
 
 void count_VkPipelineColorBlendStateCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineColorBlendStateCreateInfo* toCount,
     size_t* count);
 
 void count_VkPipelineDynamicStateCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineDynamicStateCreateInfo* toCount,
     size_t* count);
 
 void count_VkGraphicsPipelineCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkGraphicsPipelineCreateInfo* toCount,
     size_t* count);
 
 void count_VkPushConstantRange(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPushConstantRange* toCount,
     size_t* count);
 
 void count_VkPipelineLayoutCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineLayoutCreateInfo* toCount,
     size_t* count);
 
 void count_VkSamplerCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSamplerCreateInfo* toCount,
     size_t* count);
 
 void count_VkCopyDescriptorSet(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCopyDescriptorSet* toCount,
     size_t* count);
 
 void count_VkDescriptorBufferInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorBufferInfo* toCount,
     size_t* count);
 
 void count_VkDescriptorImageInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorImageInfo* toCount,
     size_t* count);
 
 void count_VkDescriptorPoolSize(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorPoolSize* toCount,
     size_t* count);
 
 void count_VkDescriptorPoolCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorPoolCreateInfo* toCount,
     size_t* count);
 
 void count_VkDescriptorSetAllocateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorSetAllocateInfo* toCount,
     size_t* count);
 
 void count_VkDescriptorSetLayoutBinding(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutBinding* toCount,
     size_t* count);
 
 void count_VkDescriptorSetLayoutCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutCreateInfo* toCount,
     size_t* count);
 
 void count_VkWriteDescriptorSet(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkWriteDescriptorSet* toCount,
     size_t* count);
 
 void count_VkAttachmentDescription(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAttachmentDescription* toCount,
     size_t* count);
 
 void count_VkAttachmentReference(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAttachmentReference* toCount,
     size_t* count);
 
 void count_VkFramebufferCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkFramebufferCreateInfo* toCount,
     size_t* count);
 
 void count_VkSubpassDescription(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSubpassDescription* toCount,
     size_t* count);
 
 void count_VkSubpassDependency(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSubpassDependency* toCount,
     size_t* count);
 
 void count_VkRenderPassCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRenderPassCreateInfo* toCount,
     size_t* count);
 
 void count_VkCommandPoolCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCommandPoolCreateInfo* toCount,
     size_t* count);
 
 void count_VkCommandBufferAllocateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCommandBufferAllocateInfo* toCount,
     size_t* count);
 
 void count_VkCommandBufferInheritanceInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCommandBufferInheritanceInfo* toCount,
     size_t* count);
 
 void count_VkCommandBufferBeginInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCommandBufferBeginInfo* toCount,
     size_t* count);
 
 void count_VkBufferCopy(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBufferCopy* toCount,
     size_t* count);
 
 void count_VkImageSubresourceLayers(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageSubresourceLayers* toCount,
     size_t* count);
 
 void count_VkBufferImageCopy(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBufferImageCopy* toCount,
     size_t* count);
 
 void count_VkClearColorValue(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkClearColorValue* toCount,
     size_t* count);
 
 void count_VkClearDepthStencilValue(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkClearDepthStencilValue* toCount,
     size_t* count);
 
 void count_VkClearValue(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkClearValue* toCount,
     size_t* count);
 
 void count_VkClearAttachment(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkClearAttachment* toCount,
     size_t* count);
 
 void count_VkClearRect(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkClearRect* toCount,
     size_t* count);
 
 void count_VkImageBlit(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageBlit* toCount,
     size_t* count);
 
 void count_VkImageCopy(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageCopy* toCount,
     size_t* count);
 
 void count_VkImageResolve(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageResolve* toCount,
     size_t* count);
 
 void count_VkRenderPassBeginInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRenderPassBeginInfo* toCount,
     size_t* count);
 
@@ -583,191 +692,229 @@
 #ifdef VK_VERSION_1_1
 void count_VkPhysicalDeviceSubgroupProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceSubgroupProperties* toCount,
     size_t* count);
 
 void count_VkBindBufferMemoryInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBindBufferMemoryInfo* toCount,
     size_t* count);
 
 void count_VkBindImageMemoryInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBindImageMemoryInfo* toCount,
     size_t* count);
 
 void count_VkPhysicalDevice16BitStorageFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDevice16BitStorageFeatures* toCount,
     size_t* count);
 
 void count_VkMemoryDedicatedRequirements(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryDedicatedRequirements* toCount,
     size_t* count);
 
 void count_VkMemoryDedicatedAllocateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryDedicatedAllocateInfo* toCount,
     size_t* count);
 
 void count_VkMemoryAllocateFlagsInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryAllocateFlagsInfo* toCount,
     size_t* count);
 
 void count_VkDeviceGroupRenderPassBeginInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceGroupRenderPassBeginInfo* toCount,
     size_t* count);
 
 void count_VkDeviceGroupCommandBufferBeginInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceGroupCommandBufferBeginInfo* toCount,
     size_t* count);
 
 void count_VkDeviceGroupSubmitInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceGroupSubmitInfo* toCount,
     size_t* count);
 
 void count_VkDeviceGroupBindSparseInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceGroupBindSparseInfo* toCount,
     size_t* count);
 
 void count_VkBindBufferMemoryDeviceGroupInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBindBufferMemoryDeviceGroupInfo* toCount,
     size_t* count);
 
 void count_VkBindImageMemoryDeviceGroupInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBindImageMemoryDeviceGroupInfo* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceGroupProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceGroupProperties* toCount,
     size_t* count);
 
 void count_VkDeviceGroupDeviceCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceGroupDeviceCreateInfo* toCount,
     size_t* count);
 
 void count_VkBufferMemoryRequirementsInfo2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBufferMemoryRequirementsInfo2* toCount,
     size_t* count);
 
 void count_VkImageMemoryRequirementsInfo2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageMemoryRequirementsInfo2* toCount,
     size_t* count);
 
 void count_VkImageSparseMemoryRequirementsInfo2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageSparseMemoryRequirementsInfo2* toCount,
     size_t* count);
 
 void count_VkMemoryRequirements2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryRequirements2* toCount,
     size_t* count);
 
 void count_VkSparseImageMemoryRequirements2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSparseImageMemoryRequirements2* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceFeatures2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceFeatures2* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceProperties2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceProperties2* toCount,
     size_t* count);
 
 void count_VkFormatProperties2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkFormatProperties2* toCount,
     size_t* count);
 
 void count_VkImageFormatProperties2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageFormatProperties2* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceImageFormatInfo2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageFormatInfo2* toCount,
     size_t* count);
 
 void count_VkQueueFamilyProperties2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkQueueFamilyProperties2* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceMemoryProperties2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryProperties2* toCount,
     size_t* count);
 
 void count_VkSparseImageFormatProperties2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSparseImageFormatProperties2* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceSparseImageFormatInfo2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceSparseImageFormatInfo2* toCount,
     size_t* count);
 
 void count_VkPhysicalDevicePointClippingProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDevicePointClippingProperties* toCount,
     size_t* count);
 
 void count_VkInputAttachmentAspectReference(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkInputAttachmentAspectReference* toCount,
     size_t* count);
 
 void count_VkRenderPassInputAttachmentAspectCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRenderPassInputAttachmentAspectCreateInfo* toCount,
     size_t* count);
 
 void count_VkImageViewUsageCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageViewUsageCreateInfo* toCount,
     size_t* count);
 
 void count_VkPipelineTessellationDomainOriginStateCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineTessellationDomainOriginStateCreateInfo* toCount,
     size_t* count);
 
 void count_VkRenderPassMultiviewCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRenderPassMultiviewCreateInfo* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceMultiviewFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceMultiviewFeatures* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceMultiviewProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceMultiviewProperties* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceVariablePointersFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceVariablePointersFeatures* toCount,
     size_t* count);
 
@@ -775,151 +922,181 @@
 
 void count_VkPhysicalDeviceProtectedMemoryFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceProtectedMemoryFeatures* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceProtectedMemoryProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceProtectedMemoryProperties* toCount,
     size_t* count);
 
 void count_VkDeviceQueueInfo2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceQueueInfo2* toCount,
     size_t* count);
 
 void count_VkProtectedSubmitInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkProtectedSubmitInfo* toCount,
     size_t* count);
 
 void count_VkSamplerYcbcrConversionCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSamplerYcbcrConversionCreateInfo* toCount,
     size_t* count);
 
 void count_VkSamplerYcbcrConversionInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSamplerYcbcrConversionInfo* toCount,
     size_t* count);
 
 void count_VkBindImagePlaneMemoryInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBindImagePlaneMemoryInfo* toCount,
     size_t* count);
 
 void count_VkImagePlaneMemoryRequirementsInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImagePlaneMemoryRequirementsInfo* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceSamplerYcbcrConversionFeatures* toCount,
     size_t* count);
 
 void count_VkSamplerYcbcrConversionImageFormatProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSamplerYcbcrConversionImageFormatProperties* toCount,
     size_t* count);
 
 void count_VkDescriptorUpdateTemplateEntry(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorUpdateTemplateEntry* toCount,
     size_t* count);
 
 void count_VkDescriptorUpdateTemplateCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorUpdateTemplateCreateInfo* toCount,
     size_t* count);
 
 void count_VkExternalMemoryProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExternalMemoryProperties* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceExternalImageFormatInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalImageFormatInfo* toCount,
     size_t* count);
 
 void count_VkExternalImageFormatProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExternalImageFormatProperties* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceExternalBufferInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalBufferInfo* toCount,
     size_t* count);
 
 void count_VkExternalBufferProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExternalBufferProperties* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceIDProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceIDProperties* toCount,
     size_t* count);
 
 void count_VkExternalMemoryImageCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExternalMemoryImageCreateInfo* toCount,
     size_t* count);
 
 void count_VkExternalMemoryBufferCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExternalMemoryBufferCreateInfo* toCount,
     size_t* count);
 
 void count_VkExportMemoryAllocateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExportMemoryAllocateInfo* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceExternalFenceInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalFenceInfo* toCount,
     size_t* count);
 
 void count_VkExternalFenceProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExternalFenceProperties* toCount,
     size_t* count);
 
 void count_VkExportFenceCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExportFenceCreateInfo* toCount,
     size_t* count);
 
 void count_VkExportSemaphoreCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExportSemaphoreCreateInfo* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceExternalSemaphoreInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalSemaphoreInfo* toCount,
     size_t* count);
 
 void count_VkExternalSemaphoreProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExternalSemaphoreProperties* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceMaintenance3Properties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceMaintenance3Properties* toCount,
     size_t* count);
 
 void count_VkDescriptorSetLayoutSupport(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutSupport* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceShaderDrawParametersFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderDrawParametersFeatures* toCount,
     size_t* count);
 
@@ -929,256 +1106,307 @@
 #ifdef VK_VERSION_1_2
 void count_VkPhysicalDeviceVulkan11Features(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan11Features* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceVulkan11Properties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan11Properties* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceVulkan12Features(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan12Features* toCount,
     size_t* count);
 
 void count_VkConformanceVersion(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkConformanceVersion* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceVulkan12Properties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan12Properties* toCount,
     size_t* count);
 
 void count_VkImageFormatListCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageFormatListCreateInfo* toCount,
     size_t* count);
 
 void count_VkAttachmentDescription2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAttachmentDescription2* toCount,
     size_t* count);
 
 void count_VkAttachmentReference2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAttachmentReference2* toCount,
     size_t* count);
 
 void count_VkSubpassDescription2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSubpassDescription2* toCount,
     size_t* count);
 
 void count_VkSubpassDependency2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSubpassDependency2* toCount,
     size_t* count);
 
 void count_VkRenderPassCreateInfo2(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRenderPassCreateInfo2* toCount,
     size_t* count);
 
 void count_VkSubpassBeginInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSubpassBeginInfo* toCount,
     size_t* count);
 
 void count_VkSubpassEndInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSubpassEndInfo* toCount,
     size_t* count);
 
 void count_VkPhysicalDevice8BitStorageFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDevice8BitStorageFeatures* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceDriverProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceDriverProperties* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceShaderAtomicInt64Features(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderAtomicInt64Features* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceShaderFloat16Int8Features(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderFloat16Int8Features* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceFloatControlsProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceFloatControlsProperties* toCount,
     size_t* count);
 
 void count_VkDescriptorSetLayoutBindingFlagsCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutBindingFlagsCreateInfo* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceDescriptorIndexingFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceDescriptorIndexingFeatures* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceDescriptorIndexingProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceDescriptorIndexingProperties* toCount,
     size_t* count);
 
 void count_VkDescriptorSetVariableDescriptorCountAllocateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorSetVariableDescriptorCountAllocateInfo* toCount,
     size_t* count);
 
 void count_VkDescriptorSetVariableDescriptorCountLayoutSupport(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorSetVariableDescriptorCountLayoutSupport* toCount,
     size_t* count);
 
 void count_VkSubpassDescriptionDepthStencilResolve(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSubpassDescriptionDepthStencilResolve* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceDepthStencilResolveProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceDepthStencilResolveProperties* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceScalarBlockLayoutFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceScalarBlockLayoutFeatures* toCount,
     size_t* count);
 
 void count_VkImageStencilUsageCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageStencilUsageCreateInfo* toCount,
     size_t* count);
 
 void count_VkSamplerReductionModeCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSamplerReductionModeCreateInfo* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceSamplerFilterMinmaxProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceSamplerFilterMinmaxProperties* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceVulkanMemoryModelFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkanMemoryModelFeatures* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceImagelessFramebufferFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceImagelessFramebufferFeatures* toCount,
     size_t* count);
 
 void count_VkFramebufferAttachmentImageInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkFramebufferAttachmentImageInfo* toCount,
     size_t* count);
 
 void count_VkFramebufferAttachmentsCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkFramebufferAttachmentsCreateInfo* toCount,
     size_t* count);
 
 void count_VkRenderPassAttachmentBeginInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRenderPassAttachmentBeginInfo* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceUniformBufferStandardLayoutFeatures* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* toCount,
     size_t* count);
 
 void count_VkAttachmentReferenceStencilLayout(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAttachmentReferenceStencilLayout* toCount,
     size_t* count);
 
 void count_VkAttachmentDescriptionStencilLayout(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAttachmentDescriptionStencilLayout* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceHostQueryResetFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceHostQueryResetFeatures* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceTimelineSemaphoreFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceTimelineSemaphoreFeatures* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceTimelineSemaphoreProperties(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceTimelineSemaphoreProperties* toCount,
     size_t* count);
 
 void count_VkSemaphoreTypeCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSemaphoreTypeCreateInfo* toCount,
     size_t* count);
 
 void count_VkTimelineSemaphoreSubmitInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkTimelineSemaphoreSubmitInfo* toCount,
     size_t* count);
 
 void count_VkSemaphoreWaitInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSemaphoreWaitInfo* toCount,
     size_t* count);
 
 void count_VkSemaphoreSignalInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSemaphoreSignalInfo* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceBufferDeviceAddressFeatures(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceBufferDeviceAddressFeatures* toCount,
     size_t* count);
 
 void count_VkBufferDeviceAddressInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBufferDeviceAddressInfo* toCount,
     size_t* count);
 
 void count_VkBufferOpaqueCaptureAddressCreateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBufferOpaqueCaptureAddressCreateInfo* toCount,
     size_t* count);
 
 void count_VkMemoryOpaqueCaptureAddressAllocateInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryOpaqueCaptureAddressAllocateInfo* toCount,
     size_t* count);
 
 void count_VkDeviceMemoryOpaqueCaptureAddressInfo(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceMemoryOpaqueCaptureAddressInfo* toCount,
     size_t* count);
 
@@ -1186,11 +1414,13 @@
 #ifdef VK_KHR_surface
 void count_VkSurfaceCapabilitiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSurfaceCapabilitiesKHR* toCount,
     size_t* count);
 
 void count_VkSurfaceFormatKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSurfaceFormatKHR* toCount,
     size_t* count);
 
@@ -1198,41 +1428,49 @@
 #ifdef VK_KHR_swapchain
 void count_VkSwapchainCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSwapchainCreateInfoKHR* toCount,
     size_t* count);
 
 void count_VkPresentInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPresentInfoKHR* toCount,
     size_t* count);
 
 void count_VkImageSwapchainCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageSwapchainCreateInfoKHR* toCount,
     size_t* count);
 
 void count_VkBindImageMemorySwapchainInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBindImageMemorySwapchainInfoKHR* toCount,
     size_t* count);
 
 void count_VkAcquireNextImageInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAcquireNextImageInfoKHR* toCount,
     size_t* count);
 
 void count_VkDeviceGroupPresentCapabilitiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceGroupPresentCapabilitiesKHR* toCount,
     size_t* count);
 
 void count_VkDeviceGroupPresentInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceGroupPresentInfoKHR* toCount,
     size_t* count);
 
 void count_VkDeviceGroupSwapchainCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceGroupSwapchainCreateInfoKHR* toCount,
     size_t* count);
 
@@ -1240,36 +1478,43 @@
 #ifdef VK_KHR_display
 void count_VkDisplayModeParametersKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayModeParametersKHR* toCount,
     size_t* count);
 
 void count_VkDisplayModeCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayModeCreateInfoKHR* toCount,
     size_t* count);
 
 void count_VkDisplayModePropertiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayModePropertiesKHR* toCount,
     size_t* count);
 
 void count_VkDisplayPlaneCapabilitiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayPlaneCapabilitiesKHR* toCount,
     size_t* count);
 
 void count_VkDisplayPlanePropertiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayPlanePropertiesKHR* toCount,
     size_t* count);
 
 void count_VkDisplayPropertiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayPropertiesKHR* toCount,
     size_t* count);
 
 void count_VkDisplaySurfaceCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplaySurfaceCreateInfoKHR* toCount,
     size_t* count);
 
@@ -1277,6 +1522,7 @@
 #ifdef VK_KHR_display_swapchain
 void count_VkDisplayPresentInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayPresentInfoKHR* toCount,
     size_t* count);
 
@@ -1284,6 +1530,7 @@
 #ifdef VK_KHR_xlib_surface
 void count_VkXlibSurfaceCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkXlibSurfaceCreateInfoKHR* toCount,
     size_t* count);
 
@@ -1291,6 +1538,7 @@
 #ifdef VK_KHR_xcb_surface
 void count_VkXcbSurfaceCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkXcbSurfaceCreateInfoKHR* toCount,
     size_t* count);
 
@@ -1298,6 +1546,7 @@
 #ifdef VK_KHR_wayland_surface
 void count_VkWaylandSurfaceCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkWaylandSurfaceCreateInfoKHR* toCount,
     size_t* count);
 
@@ -1305,6 +1554,7 @@
 #ifdef VK_KHR_android_surface
 void count_VkAndroidSurfaceCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAndroidSurfaceCreateInfoKHR* toCount,
     size_t* count);
 
@@ -1312,6 +1562,7 @@
 #ifdef VK_KHR_win32_surface
 void count_VkWin32SurfaceCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkWin32SurfaceCreateInfoKHR* toCount,
     size_t* count);
 
@@ -1397,21 +1648,25 @@
 #ifdef VK_KHR_external_memory_win32
 void count_VkImportMemoryWin32HandleInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImportMemoryWin32HandleInfoKHR* toCount,
     size_t* count);
 
 void count_VkExportMemoryWin32HandleInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExportMemoryWin32HandleInfoKHR* toCount,
     size_t* count);
 
 void count_VkMemoryWin32HandlePropertiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryWin32HandlePropertiesKHR* toCount,
     size_t* count);
 
 void count_VkMemoryGetWin32HandleInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryGetWin32HandleInfoKHR* toCount,
     size_t* count);
 
@@ -1419,16 +1674,19 @@
 #ifdef VK_KHR_external_memory_fd
 void count_VkImportMemoryFdInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImportMemoryFdInfoKHR* toCount,
     size_t* count);
 
 void count_VkMemoryFdPropertiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryFdPropertiesKHR* toCount,
     size_t* count);
 
 void count_VkMemoryGetFdInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryGetFdInfoKHR* toCount,
     size_t* count);
 
@@ -1436,6 +1694,7 @@
 #ifdef VK_KHR_win32_keyed_mutex
 void count_VkWin32KeyedMutexAcquireReleaseInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkWin32KeyedMutexAcquireReleaseInfoKHR* toCount,
     size_t* count);
 
@@ -1453,21 +1712,25 @@
 #ifdef VK_KHR_external_semaphore_win32
 void count_VkImportSemaphoreWin32HandleInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImportSemaphoreWin32HandleInfoKHR* toCount,
     size_t* count);
 
 void count_VkExportSemaphoreWin32HandleInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExportSemaphoreWin32HandleInfoKHR* toCount,
     size_t* count);
 
 void count_VkD3D12FenceSubmitInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkD3D12FenceSubmitInfoKHR* toCount,
     size_t* count);
 
 void count_VkSemaphoreGetWin32HandleInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSemaphoreGetWin32HandleInfoKHR* toCount,
     size_t* count);
 
@@ -1475,11 +1738,13 @@
 #ifdef VK_KHR_external_semaphore_fd
 void count_VkImportSemaphoreFdInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImportSemaphoreFdInfoKHR* toCount,
     size_t* count);
 
 void count_VkSemaphoreGetFdInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSemaphoreGetFdInfoKHR* toCount,
     size_t* count);
 
@@ -1487,6 +1752,7 @@
 #ifdef VK_KHR_push_descriptor
 void count_VkPhysicalDevicePushDescriptorPropertiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDevicePushDescriptorPropertiesKHR* toCount,
     size_t* count);
 
@@ -1504,16 +1770,19 @@
 #ifdef VK_KHR_incremental_present
 void count_VkRectLayerKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRectLayerKHR* toCount,
     size_t* count);
 
 void count_VkPresentRegionKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPresentRegionKHR* toCount,
     size_t* count);
 
 void count_VkPresentRegionsKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPresentRegionsKHR* toCount,
     size_t* count);
 
@@ -1553,6 +1822,7 @@
 #ifdef VK_KHR_shared_presentable_image
 void count_VkSharedPresentSurfaceCapabilitiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSharedPresentSurfaceCapabilitiesKHR* toCount,
     size_t* count);
 
@@ -1570,16 +1840,19 @@
 #ifdef VK_KHR_external_fence_win32
 void count_VkImportFenceWin32HandleInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImportFenceWin32HandleInfoKHR* toCount,
     size_t* count);
 
 void count_VkExportFenceWin32HandleInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExportFenceWin32HandleInfoKHR* toCount,
     size_t* count);
 
 void count_VkFenceGetWin32HandleInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkFenceGetWin32HandleInfoKHR* toCount,
     size_t* count);
 
@@ -1587,11 +1860,13 @@
 #ifdef VK_KHR_external_fence_fd
 void count_VkImportFenceFdInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImportFenceFdInfoKHR* toCount,
     size_t* count);
 
 void count_VkFenceGetFdInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkFenceGetFdInfoKHR* toCount,
     size_t* count);
 
@@ -1599,41 +1874,49 @@
 #ifdef VK_KHR_performance_query
 void count_VkPhysicalDevicePerformanceQueryFeaturesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDevicePerformanceQueryFeaturesKHR* toCount,
     size_t* count);
 
 void count_VkPhysicalDevicePerformanceQueryPropertiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDevicePerformanceQueryPropertiesKHR* toCount,
     size_t* count);
 
 void count_VkPerformanceCounterKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPerformanceCounterKHR* toCount,
     size_t* count);
 
 void count_VkPerformanceCounterDescriptionKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPerformanceCounterDescriptionKHR* toCount,
     size_t* count);
 
 void count_VkQueryPoolPerformanceCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkQueryPoolPerformanceCreateInfoKHR* toCount,
     size_t* count);
 
 void count_VkPerformanceCounterResultKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPerformanceCounterResultKHR* toCount,
     size_t* count);
 
 void count_VkAcquireProfilingLockInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAcquireProfilingLockInfoKHR* toCount,
     size_t* count);
 
 void count_VkPerformanceQuerySubmitInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPerformanceQuerySubmitInfoKHR* toCount,
     size_t* count);
 
@@ -1653,16 +1936,19 @@
 #ifdef VK_KHR_get_surface_capabilities2
 void count_VkPhysicalDeviceSurfaceInfo2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceSurfaceInfo2KHR* toCount,
     size_t* count);
 
 void count_VkSurfaceCapabilities2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSurfaceCapabilities2KHR* toCount,
     size_t* count);
 
 void count_VkSurfaceFormat2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSurfaceFormat2KHR* toCount,
     size_t* count);
 
@@ -1676,26 +1962,31 @@
 #ifdef VK_KHR_get_display_properties2
 void count_VkDisplayProperties2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayProperties2KHR* toCount,
     size_t* count);
 
 void count_VkDisplayPlaneProperties2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayPlaneProperties2KHR* toCount,
     size_t* count);
 
 void count_VkDisplayModeProperties2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayModeProperties2KHR* toCount,
     size_t* count);
 
 void count_VkDisplayPlaneInfo2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayPlaneInfo2KHR* toCount,
     size_t* count);
 
 void count_VkDisplayPlaneCapabilities2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayPlaneCapabilities2KHR* toCount,
     size_t* count);
 
@@ -1749,11 +2040,13 @@
 #ifdef VK_KHR_portability_subset
 void count_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDevicePortabilitySubsetFeaturesKHR* toCount,
     size_t* count);
 
 void count_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDevicePortabilitySubsetPropertiesKHR* toCount,
     size_t* count);
 
@@ -1781,6 +2074,7 @@
 #ifdef VK_KHR_shader_clock
 void count_VkPhysicalDeviceShaderClockFeaturesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderClockFeaturesKHR* toCount,
     size_t* count);
 
@@ -1824,6 +2118,7 @@
 #ifdef VK_KHR_shader_terminate_invocation
 void count_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* toCount,
     size_t* count);
 
@@ -1831,26 +2126,31 @@
 #ifdef VK_KHR_fragment_shading_rate
 void count_VkFragmentShadingRateAttachmentInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkFragmentShadingRateAttachmentInfoKHR* toCount,
     size_t* count);
 
 void count_VkPipelineFragmentShadingRateStateCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineFragmentShadingRateStateCreateInfoKHR* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateFeaturesKHR* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRatePropertiesKHR* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceFragmentShadingRateKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateKHR* toCount,
     size_t* count);
 
@@ -1860,6 +2160,7 @@
 #ifdef VK_KHR_surface_protected_capabilities
 void count_VkSurfaceProtectedCapabilitiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSurfaceProtectedCapabilitiesKHR* toCount,
     size_t* count);
 
@@ -1893,36 +2194,43 @@
 #ifdef VK_KHR_pipeline_executable_properties
 void count_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* toCount,
     size_t* count);
 
 void count_VkPipelineInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineInfoKHR* toCount,
     size_t* count);
 
 void count_VkPipelineExecutablePropertiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineExecutablePropertiesKHR* toCount,
     size_t* count);
 
 void count_VkPipelineExecutableInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineExecutableInfoKHR* toCount,
     size_t* count);
 
 void count_VkPipelineExecutableStatisticValueKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineExecutableStatisticValueKHR* toCount,
     size_t* count);
 
 void count_VkPipelineExecutableStatisticKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineExecutableStatisticKHR* toCount,
     size_t* count);
 
 void count_VkPipelineExecutableInternalRepresentationKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineExecutableInternalRepresentationKHR* toCount,
     size_t* count);
 
@@ -1930,6 +2238,7 @@
 #ifdef VK_KHR_pipeline_library
 void count_VkPipelineLibraryCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineLibraryCreateInfoKHR* toCount,
     size_t* count);
 
@@ -1939,56 +2248,67 @@
 #ifdef VK_KHR_copy_commands2
 void count_VkBufferCopy2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBufferCopy2KHR* toCount,
     size_t* count);
 
 void count_VkCopyBufferInfo2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCopyBufferInfo2KHR* toCount,
     size_t* count);
 
 void count_VkImageCopy2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageCopy2KHR* toCount,
     size_t* count);
 
 void count_VkCopyImageInfo2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCopyImageInfo2KHR* toCount,
     size_t* count);
 
 void count_VkBufferImageCopy2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBufferImageCopy2KHR* toCount,
     size_t* count);
 
 void count_VkCopyBufferToImageInfo2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCopyBufferToImageInfo2KHR* toCount,
     size_t* count);
 
 void count_VkCopyImageToBufferInfo2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCopyImageToBufferInfo2KHR* toCount,
     size_t* count);
 
 void count_VkImageBlit2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageBlit2KHR* toCount,
     size_t* count);
 
 void count_VkBlitImageInfo2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBlitImageInfo2KHR* toCount,
     size_t* count);
 
 void count_VkImageResolve2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageResolve2KHR* toCount,
     size_t* count);
 
 void count_VkResolveImageInfo2KHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkResolveImageInfo2KHR* toCount,
     size_t* count);
 
@@ -1996,6 +2316,7 @@
 #ifdef VK_ANDROID_native_buffer
 void count_VkNativeBufferANDROID(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkNativeBufferANDROID* toCount,
     size_t* count);
 
@@ -2003,6 +2324,7 @@
 #ifdef VK_EXT_debug_report
 void count_VkDebugReportCallbackCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDebugReportCallbackCreateInfoEXT* toCount,
     size_t* count);
 
@@ -2016,6 +2338,7 @@
 #ifdef VK_AMD_rasterization_order
 void count_VkPipelineRasterizationStateRasterizationOrderAMD(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineRasterizationStateRasterizationOrderAMD* toCount,
     size_t* count);
 
@@ -2027,16 +2350,19 @@
 #ifdef VK_EXT_debug_marker
 void count_VkDebugMarkerObjectNameInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDebugMarkerObjectNameInfoEXT* toCount,
     size_t* count);
 
 void count_VkDebugMarkerObjectTagInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDebugMarkerObjectTagInfoEXT* toCount,
     size_t* count);
 
 void count_VkDebugMarkerMarkerInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDebugMarkerMarkerInfoEXT* toCount,
     size_t* count);
 
@@ -2046,16 +2372,19 @@
 #ifdef VK_NV_dedicated_allocation
 void count_VkDedicatedAllocationImageCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDedicatedAllocationImageCreateInfoNV* toCount,
     size_t* count);
 
 void count_VkDedicatedAllocationBufferCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDedicatedAllocationBufferCreateInfoNV* toCount,
     size_t* count);
 
 void count_VkDedicatedAllocationMemoryAllocateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDedicatedAllocationMemoryAllocateInfoNV* toCount,
     size_t* count);
 
@@ -2063,16 +2392,19 @@
 #ifdef VK_EXT_transform_feedback
 void count_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceTransformFeedbackFeaturesEXT* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceTransformFeedbackPropertiesEXT* toCount,
     size_t* count);
 
 void count_VkPipelineRasterizationStateStreamCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineRasterizationStateStreamCreateInfoEXT* toCount,
     size_t* count);
 
@@ -2080,11 +2412,13 @@
 #ifdef VK_NVX_image_view_handle
 void count_VkImageViewHandleInfoNVX(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageViewHandleInfoNVX* toCount,
     size_t* count);
 
 void count_VkImageViewAddressPropertiesNVX(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageViewAddressPropertiesNVX* toCount,
     size_t* count);
 
@@ -2100,6 +2434,7 @@
 #ifdef VK_AMD_texture_gather_bias_lod
 void count_VkTextureLODGatherFormatPropertiesAMD(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkTextureLODGatherFormatPropertiesAMD* toCount,
     size_t* count);
 
@@ -2107,11 +2442,13 @@
 #ifdef VK_AMD_shader_info
 void count_VkShaderResourceUsageAMD(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkShaderResourceUsageAMD* toCount,
     size_t* count);
 
 void count_VkShaderStatisticsInfoAMD(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkShaderStatisticsInfoAMD* toCount,
     size_t* count);
 
@@ -2121,6 +2458,7 @@
 #ifdef VK_GGP_stream_descriptor_surface
 void count_VkStreamDescriptorSurfaceCreateInfoGGP(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkStreamDescriptorSurfaceCreateInfoGGP* toCount,
     size_t* count);
 
@@ -2128,6 +2466,7 @@
 #ifdef VK_NV_corner_sampled_image
 void count_VkPhysicalDeviceCornerSampledImageFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceCornerSampledImageFeaturesNV* toCount,
     size_t* count);
 
@@ -2137,6 +2476,7 @@
 #ifdef VK_NV_external_memory_capabilities
 void count_VkExternalImageFormatPropertiesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExternalImageFormatPropertiesNV* toCount,
     size_t* count);
 
@@ -2144,11 +2484,13 @@
 #ifdef VK_NV_external_memory
 void count_VkExternalMemoryImageCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExternalMemoryImageCreateInfoNV* toCount,
     size_t* count);
 
 void count_VkExportMemoryAllocateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExportMemoryAllocateInfoNV* toCount,
     size_t* count);
 
@@ -2156,11 +2498,13 @@
 #ifdef VK_NV_external_memory_win32
 void count_VkImportMemoryWin32HandleInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImportMemoryWin32HandleInfoNV* toCount,
     size_t* count);
 
 void count_VkExportMemoryWin32HandleInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExportMemoryWin32HandleInfoNV* toCount,
     size_t* count);
 
@@ -2168,6 +2512,7 @@
 #ifdef VK_NV_win32_keyed_mutex
 void count_VkWin32KeyedMutexAcquireReleaseInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkWin32KeyedMutexAcquireReleaseInfoNV* toCount,
     size_t* count);
 
@@ -2175,6 +2520,7 @@
 #ifdef VK_EXT_validation_flags
 void count_VkValidationFlagsEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkValidationFlagsEXT* toCount,
     size_t* count);
 
@@ -2182,6 +2528,7 @@
 #ifdef VK_NN_vi_surface
 void count_VkViSurfaceCreateInfoNN(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkViSurfaceCreateInfoNN* toCount,
     size_t* count);
 
@@ -2193,6 +2540,7 @@
 #ifdef VK_EXT_texture_compression_astc_hdr
 void count_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* toCount,
     size_t* count);
 
@@ -2200,11 +2548,13 @@
 #ifdef VK_EXT_astc_decode_mode
 void count_VkImageViewASTCDecodeModeEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageViewASTCDecodeModeEXT* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceASTCDecodeFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceASTCDecodeFeaturesEXT* toCount,
     size_t* count);
 
@@ -2212,16 +2562,19 @@
 #ifdef VK_EXT_conditional_rendering
 void count_VkConditionalRenderingBeginInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkConditionalRenderingBeginInfoEXT* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceConditionalRenderingFeaturesEXT* toCount,
     size_t* count);
 
 void count_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCommandBufferInheritanceConditionalRenderingInfoEXT* toCount,
     size_t* count);
 
@@ -2229,11 +2582,13 @@
 #ifdef VK_NV_clip_space_w_scaling
 void count_VkViewportWScalingNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkViewportWScalingNV* toCount,
     size_t* count);
 
 void count_VkPipelineViewportWScalingStateCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineViewportWScalingStateCreateInfoNV* toCount,
     size_t* count);
 
@@ -2245,6 +2600,7 @@
 #ifdef VK_EXT_display_surface_counter
 void count_VkSurfaceCapabilities2EXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSurfaceCapabilities2EXT* toCount,
     size_t* count);
 
@@ -2252,21 +2608,25 @@
 #ifdef VK_EXT_display_control
 void count_VkDisplayPowerInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayPowerInfoEXT* toCount,
     size_t* count);
 
 void count_VkDeviceEventInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceEventInfoEXT* toCount,
     size_t* count);
 
 void count_VkDisplayEventInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayEventInfoEXT* toCount,
     size_t* count);
 
 void count_VkSwapchainCounterCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSwapchainCounterCreateInfoEXT* toCount,
     size_t* count);
 
@@ -2274,21 +2634,25 @@
 #ifdef VK_GOOGLE_display_timing
 void count_VkRefreshCycleDurationGOOGLE(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRefreshCycleDurationGOOGLE* toCount,
     size_t* count);
 
 void count_VkPastPresentationTimingGOOGLE(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPastPresentationTimingGOOGLE* toCount,
     size_t* count);
 
 void count_VkPresentTimeGOOGLE(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPresentTimeGOOGLE* toCount,
     size_t* count);
 
 void count_VkPresentTimesInfoGOOGLE(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPresentTimesInfoGOOGLE* toCount,
     size_t* count);
 
@@ -2302,6 +2666,7 @@
 #ifdef VK_NVX_multiview_per_view_attributes
 void count_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* toCount,
     size_t* count);
 
@@ -2309,11 +2674,13 @@
 #ifdef VK_NV_viewport_swizzle
 void count_VkViewportSwizzleNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkViewportSwizzleNV* toCount,
     size_t* count);
 
 void count_VkPipelineViewportSwizzleStateCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineViewportSwizzleStateCreateInfoNV* toCount,
     size_t* count);
 
@@ -2321,11 +2688,13 @@
 #ifdef VK_EXT_discard_rectangles
 void count_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceDiscardRectanglePropertiesEXT* toCount,
     size_t* count);
 
 void count_VkPipelineDiscardRectangleStateCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineDiscardRectangleStateCreateInfoEXT* toCount,
     size_t* count);
 
@@ -2333,11 +2702,13 @@
 #ifdef VK_EXT_conservative_rasterization
 void count_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceConservativeRasterizationPropertiesEXT* toCount,
     size_t* count);
 
 void count_VkPipelineRasterizationConservativeStateCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineRasterizationConservativeStateCreateInfoEXT* toCount,
     size_t* count);
 
@@ -2345,11 +2716,13 @@
 #ifdef VK_EXT_depth_clip_enable
 void count_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceDepthClipEnableFeaturesEXT* toCount,
     size_t* count);
 
 void count_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineRasterizationDepthClipStateCreateInfoEXT* toCount,
     size_t* count);
 
@@ -2359,11 +2732,13 @@
 #ifdef VK_EXT_hdr_metadata
 void count_VkXYColorEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkXYColorEXT* toCount,
     size_t* count);
 
 void count_VkHdrMetadataEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkHdrMetadataEXT* toCount,
     size_t* count);
 
@@ -2371,6 +2746,7 @@
 #ifdef VK_MVK_ios_surface
 void count_VkIOSSurfaceCreateInfoMVK(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkIOSSurfaceCreateInfoMVK* toCount,
     size_t* count);
 
@@ -2378,6 +2754,7 @@
 #ifdef VK_MVK_macos_surface
 void count_VkMacOSSurfaceCreateInfoMVK(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMacOSSurfaceCreateInfoMVK* toCount,
     size_t* count);
 
@@ -2391,26 +2768,31 @@
 #ifdef VK_EXT_debug_utils
 void count_VkDebugUtilsLabelEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDebugUtilsLabelEXT* toCount,
     size_t* count);
 
 void count_VkDebugUtilsObjectNameInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDebugUtilsObjectNameInfoEXT* toCount,
     size_t* count);
 
 void count_VkDebugUtilsMessengerCallbackDataEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDebugUtilsMessengerCallbackDataEXT* toCount,
     size_t* count);
 
 void count_VkDebugUtilsMessengerCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDebugUtilsMessengerCreateInfoEXT* toCount,
     size_t* count);
 
 void count_VkDebugUtilsObjectTagInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDebugUtilsObjectTagInfoEXT* toCount,
     size_t* count);
 
@@ -2418,31 +2800,37 @@
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
 void count_VkAndroidHardwareBufferUsageANDROID(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAndroidHardwareBufferUsageANDROID* toCount,
     size_t* count);
 
 void count_VkAndroidHardwareBufferPropertiesANDROID(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAndroidHardwareBufferPropertiesANDROID* toCount,
     size_t* count);
 
 void count_VkAndroidHardwareBufferFormatPropertiesANDROID(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAndroidHardwareBufferFormatPropertiesANDROID* toCount,
     size_t* count);
 
 void count_VkImportAndroidHardwareBufferInfoANDROID(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImportAndroidHardwareBufferInfoANDROID* toCount,
     size_t* count);
 
 void count_VkMemoryGetAndroidHardwareBufferInfoANDROID(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryGetAndroidHardwareBufferInfoANDROID* toCount,
     size_t* count);
 
 void count_VkExternalFormatANDROID(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkExternalFormatANDROID* toCount,
     size_t* count);
 
@@ -2462,21 +2850,25 @@
 #ifdef VK_EXT_inline_uniform_block
 void count_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceInlineUniformBlockFeaturesEXT* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceInlineUniformBlockPropertiesEXT* toCount,
     size_t* count);
 
 void count_VkWriteDescriptorSetInlineUniformBlockEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkWriteDescriptorSetInlineUniformBlockEXT* toCount,
     size_t* count);
 
 void count_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDescriptorPoolInlineUniformBlockCreateInfoEXT* toCount,
     size_t* count);
 
@@ -2486,41 +2878,49 @@
 #ifdef VK_EXT_sample_locations
 void count_VkSampleLocationEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSampleLocationEXT* toCount,
     size_t* count);
 
 void count_VkSampleLocationsInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSampleLocationsInfoEXT* toCount,
     size_t* count);
 
 void count_VkAttachmentSampleLocationsEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAttachmentSampleLocationsEXT* toCount,
     size_t* count);
 
 void count_VkSubpassSampleLocationsEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSubpassSampleLocationsEXT* toCount,
     size_t* count);
 
 void count_VkRenderPassSampleLocationsBeginInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRenderPassSampleLocationsBeginInfoEXT* toCount,
     size_t* count);
 
 void count_VkPipelineSampleLocationsStateCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineSampleLocationsStateCreateInfoEXT* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceSampleLocationsPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceSampleLocationsPropertiesEXT* toCount,
     size_t* count);
 
 void count_VkMultisamplePropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMultisamplePropertiesEXT* toCount,
     size_t* count);
 
@@ -2528,16 +2928,19 @@
 #ifdef VK_EXT_blend_operation_advanced
 void count_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* toCount,
     size_t* count);
 
 void count_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineColorBlendAdvancedStateCreateInfoEXT* toCount,
     size_t* count);
 
@@ -2545,6 +2948,7 @@
 #ifdef VK_NV_fragment_coverage_to_color
 void count_VkPipelineCoverageToColorStateCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineCoverageToColorStateCreateInfoNV* toCount,
     size_t* count);
 
@@ -2552,6 +2956,7 @@
 #ifdef VK_NV_framebuffer_mixed_samples
 void count_VkPipelineCoverageModulationStateCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineCoverageModulationStateCreateInfoNV* toCount,
     size_t* count);
 
@@ -2561,11 +2966,13 @@
 #ifdef VK_NV_shader_sm_builtins
 void count_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* toCount,
     size_t* count);
 
@@ -2575,31 +2982,37 @@
 #ifdef VK_EXT_image_drm_format_modifier
 void count_VkDrmFormatModifierPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDrmFormatModifierPropertiesEXT* toCount,
     size_t* count);
 
 void count_VkDrmFormatModifierPropertiesListEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDrmFormatModifierPropertiesListEXT* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageDrmFormatModifierInfoEXT* toCount,
     size_t* count);
 
 void count_VkImageDrmFormatModifierListCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageDrmFormatModifierListCreateInfoEXT* toCount,
     size_t* count);
 
 void count_VkImageDrmFormatModifierExplicitCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageDrmFormatModifierExplicitCreateInfoEXT* toCount,
     size_t* count);
 
 void count_VkImageDrmFormatModifierPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImageDrmFormatModifierPropertiesEXT* toCount,
     size_t* count);
 
@@ -2607,11 +3020,13 @@
 #ifdef VK_EXT_validation_cache
 void count_VkValidationCacheCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkValidationCacheCreateInfoEXT* toCount,
     size_t* count);
 
 void count_VkShaderModuleValidationCacheCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkShaderModuleValidationCacheCreateInfoEXT* toCount,
     size_t* count);
 
@@ -2633,36 +3048,43 @@
 #ifdef VK_NV_shading_rate_image
 void count_VkShadingRatePaletteNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkShadingRatePaletteNV* toCount,
     size_t* count);
 
 void count_VkPipelineViewportShadingRateImageStateCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineViewportShadingRateImageStateCreateInfoNV* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceShadingRateImageFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShadingRateImageFeaturesNV* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceShadingRateImagePropertiesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShadingRateImagePropertiesNV* toCount,
     size_t* count);
 
 void count_VkCoarseSampleLocationNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCoarseSampleLocationNV* toCount,
     size_t* count);
 
 void count_VkCoarseSampleOrderCustomNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCoarseSampleOrderCustomNV* toCount,
     size_t* count);
 
 void count_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* toCount,
     size_t* count);
 
@@ -2670,66 +3092,79 @@
 #ifdef VK_NV_ray_tracing
 void count_VkRayTracingShaderGroupCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRayTracingShaderGroupCreateInfoNV* toCount,
     size_t* count);
 
 void count_VkRayTracingPipelineCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRayTracingPipelineCreateInfoNV* toCount,
     size_t* count);
 
 void count_VkGeometryTrianglesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkGeometryTrianglesNV* toCount,
     size_t* count);
 
 void count_VkGeometryAABBNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkGeometryAABBNV* toCount,
     size_t* count);
 
 void count_VkGeometryDataNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkGeometryDataNV* toCount,
     size_t* count);
 
 void count_VkGeometryNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkGeometryNV* toCount,
     size_t* count);
 
 void count_VkAccelerationStructureInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureInfoNV* toCount,
     size_t* count);
 
 void count_VkAccelerationStructureCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureCreateInfoNV* toCount,
     size_t* count);
 
 void count_VkBindAccelerationStructureMemoryInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBindAccelerationStructureMemoryInfoNV* toCount,
     size_t* count);
 
 void count_VkWriteDescriptorSetAccelerationStructureNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkWriteDescriptorSetAccelerationStructureNV* toCount,
     size_t* count);
 
 void count_VkAccelerationStructureMemoryRequirementsInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureMemoryRequirementsInfoNV* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceRayTracingPropertiesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPropertiesNV* toCount,
     size_t* count);
 
 void count_VkTransformMatrixKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkTransformMatrixKHR* toCount,
     size_t* count);
 
@@ -2737,6 +3172,7 @@
 
 void count_VkAabbPositionsKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAabbPositionsKHR* toCount,
     size_t* count);
 
@@ -2744,6 +3180,7 @@
 
 void count_VkAccelerationStructureInstanceKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureInstanceKHR* toCount,
     size_t* count);
 
@@ -2753,11 +3190,13 @@
 #ifdef VK_NV_representative_fragment_test
 void count_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* toCount,
     size_t* count);
 
 void count_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineRepresentativeFragmentTestStateCreateInfoNV* toCount,
     size_t* count);
 
@@ -2765,11 +3204,13 @@
 #ifdef VK_EXT_filter_cubic
 void count_VkPhysicalDeviceImageViewImageFormatInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageViewImageFormatInfoEXT* toCount,
     size_t* count);
 
 void count_VkFilterCubicImageViewImageFormatPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkFilterCubicImageViewImageFormatPropertiesEXT* toCount,
     size_t* count);
 
@@ -2779,6 +3220,7 @@
 #ifdef VK_EXT_global_priority
 void count_VkDeviceQueueGlobalPriorityCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceQueueGlobalPriorityCreateInfoEXT* toCount,
     size_t* count);
 
@@ -2786,16 +3228,19 @@
 #ifdef VK_EXT_external_memory_host
 void count_VkImportMemoryHostPointerInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImportMemoryHostPointerInfoEXT* toCount,
     size_t* count);
 
 void count_VkMemoryHostPointerPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryHostPointerPropertiesEXT* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalMemoryHostPropertiesEXT* toCount,
     size_t* count);
 
@@ -2805,6 +3250,7 @@
 #ifdef VK_AMD_pipeline_compiler_control
 void count_VkPipelineCompilerControlCreateInfoAMD(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineCompilerControlCreateInfoAMD* toCount,
     size_t* count);
 
@@ -2812,6 +3258,7 @@
 #ifdef VK_EXT_calibrated_timestamps
 void count_VkCalibratedTimestampInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCalibratedTimestampInfoEXT* toCount,
     size_t* count);
 
@@ -2819,6 +3266,7 @@
 #ifdef VK_AMD_shader_core_properties
 void count_VkPhysicalDeviceShaderCorePropertiesAMD(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderCorePropertiesAMD* toCount,
     size_t* count);
 
@@ -2826,6 +3274,7 @@
 #ifdef VK_AMD_memory_overallocation_behavior
 void count_VkDeviceMemoryOverallocationCreateInfoAMD(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceMemoryOverallocationCreateInfoAMD* toCount,
     size_t* count);
 
@@ -2833,21 +3282,25 @@
 #ifdef VK_EXT_vertex_attribute_divisor
 void count_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* toCount,
     size_t* count);
 
 void count_VkVertexInputBindingDivisorDescriptionEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkVertexInputBindingDivisorDescriptionEXT* toCount,
     size_t* count);
 
 void count_VkPipelineVertexInputDivisorStateCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineVertexInputDivisorStateCreateInfoEXT* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* toCount,
     size_t* count);
 
@@ -2855,6 +3308,7 @@
 #ifdef VK_GGP_frame_token
 void count_VkPresentFrameTokenGGP(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPresentFrameTokenGGP* toCount,
     size_t* count);
 
@@ -2862,11 +3316,13 @@
 #ifdef VK_EXT_pipeline_creation_feedback
 void count_VkPipelineCreationFeedbackEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineCreationFeedbackEXT* toCount,
     size_t* count);
 
 void count_VkPipelineCreationFeedbackCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineCreationFeedbackCreateInfoEXT* toCount,
     size_t* count);
 
@@ -2876,6 +3332,7 @@
 #ifdef VK_NV_compute_shader_derivatives
 void count_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* toCount,
     size_t* count);
 
@@ -2883,16 +3340,19 @@
 #ifdef VK_NV_mesh_shader
 void count_VkPhysicalDeviceMeshShaderFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceMeshShaderFeaturesNV* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceMeshShaderPropertiesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceMeshShaderPropertiesNV* toCount,
     size_t* count);
 
 void count_VkDrawMeshTasksIndirectCommandNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDrawMeshTasksIndirectCommandNV* toCount,
     size_t* count);
 
@@ -2900,6 +3360,7 @@
 #ifdef VK_NV_fragment_shader_barycentric
 void count_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* toCount,
     size_t* count);
 
@@ -2907,6 +3368,7 @@
 #ifdef VK_NV_shader_image_footprint
 void count_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderImageFootprintFeaturesNV* toCount,
     size_t* count);
 
@@ -2914,11 +3376,13 @@
 #ifdef VK_NV_scissor_exclusive
 void count_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineViewportExclusiveScissorStateCreateInfoNV* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceExclusiveScissorFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceExclusiveScissorFeaturesNV* toCount,
     size_t* count);
 
@@ -2926,11 +3390,13 @@
 #ifdef VK_NV_device_diagnostic_checkpoints
 void count_VkQueueFamilyCheckpointPropertiesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkQueueFamilyCheckpointPropertiesNV* toCount,
     size_t* count);
 
 void count_VkCheckpointDataNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCheckpointDataNV* toCount,
     size_t* count);
 
@@ -2938,6 +3404,7 @@
 #ifdef VK_INTEL_shader_integer_functions2
 void count_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* toCount,
     size_t* count);
 
@@ -2945,21 +3412,25 @@
 #ifdef VK_INTEL_performance_query
 void count_VkPerformanceValueDataINTEL(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPerformanceValueDataINTEL* toCount,
     size_t* count);
 
 void count_VkPerformanceValueINTEL(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPerformanceValueINTEL* toCount,
     size_t* count);
 
 void count_VkInitializePerformanceApiInfoINTEL(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkInitializePerformanceApiInfoINTEL* toCount,
     size_t* count);
 
 void count_VkQueryPoolPerformanceQueryCreateInfoINTEL(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkQueryPoolPerformanceQueryCreateInfoINTEL* toCount,
     size_t* count);
 
@@ -2967,21 +3438,25 @@
 
 void count_VkPerformanceMarkerInfoINTEL(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPerformanceMarkerInfoINTEL* toCount,
     size_t* count);
 
 void count_VkPerformanceStreamMarkerInfoINTEL(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPerformanceStreamMarkerInfoINTEL* toCount,
     size_t* count);
 
 void count_VkPerformanceOverrideInfoINTEL(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPerformanceOverrideInfoINTEL* toCount,
     size_t* count);
 
 void count_VkPerformanceConfigurationAcquireInfoINTEL(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPerformanceConfigurationAcquireInfoINTEL* toCount,
     size_t* count);
 
@@ -2989,6 +3464,7 @@
 #ifdef VK_EXT_pci_bus_info
 void count_VkPhysicalDevicePCIBusInfoPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDevicePCIBusInfoPropertiesEXT* toCount,
     size_t* count);
 
@@ -2996,11 +3472,13 @@
 #ifdef VK_AMD_display_native_hdr
 void count_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDisplayNativeHdrSurfaceCapabilitiesAMD* toCount,
     size_t* count);
 
 void count_VkSwapchainDisplayNativeHdrCreateInfoAMD(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSwapchainDisplayNativeHdrCreateInfoAMD* toCount,
     size_t* count);
 
@@ -3008,6 +3486,7 @@
 #ifdef VK_FUCHSIA_imagepipe_surface
 void count_VkImagePipeSurfaceCreateInfoFUCHSIA(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkImagePipeSurfaceCreateInfoFUCHSIA* toCount,
     size_t* count);
 
@@ -3015,24 +3494,28 @@
 #ifdef VK_EXT_metal_surface
 void count_VkMetalSurfaceCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMetalSurfaceCreateInfoEXT* toCount,
     size_t* count);
 
 #endif
-#ifdef VK_GOOGLE_color_buffer
-void count_VkImportColorBufferGOOGLE(
+#ifdef VK_EXT_fragment_density_map
+void count_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
     uint32_t featureBits,
-    const VkImportColorBufferGOOGLE* toCount,
+    VkStructureType rootType,
+    const VkPhysicalDeviceFragmentDensityMapFeaturesEXT* toCount,
     size_t* count);
 
-void count_VkImportBufferGOOGLE(
+void count_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
     uint32_t featureBits,
-    const VkImportBufferGOOGLE* toCount,
+    VkStructureType rootType,
+    const VkPhysicalDeviceFragmentDensityMapPropertiesEXT* toCount,
     size_t* count);
 
-void count_VkImportPhysicalAddressGOOGLE(
+void count_VkRenderPassFragmentDensityMapCreateInfoEXT(
     uint32_t featureBits,
-    const VkImportPhysicalAddressGOOGLE* toCount,
+    VkStructureType rootType,
+    const VkRenderPassFragmentDensityMapCreateInfoEXT* toCount,
     size_t* count);
 
 #endif
@@ -3047,16 +3530,19 @@
 #ifdef VK_EXT_subgroup_size_control
 void count_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* toCount,
     size_t* count);
 
 void count_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* toCount,
     size_t* count);
 
@@ -3064,6 +3550,7 @@
 #ifdef VK_AMD_shader_core_properties2
 void count_VkPhysicalDeviceShaderCoreProperties2AMD(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderCoreProperties2AMD* toCount,
     size_t* count);
 
@@ -3071,6 +3558,7 @@
 #ifdef VK_AMD_device_coherent_memory
 void count_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceCoherentMemoryFeaturesAMD* toCount,
     size_t* count);
 
@@ -3078,6 +3566,7 @@
 #ifdef VK_EXT_shader_image_atomic_int64
 void count_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* toCount,
     size_t* count);
 
@@ -3085,6 +3574,7 @@
 #ifdef VK_EXT_memory_budget
 void count_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryBudgetPropertiesEXT* toCount,
     size_t* count);
 
@@ -3092,11 +3582,13 @@
 #ifdef VK_EXT_memory_priority
 void count_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryPriorityFeaturesEXT* toCount,
     size_t* count);
 
 void count_VkMemoryPriorityAllocateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkMemoryPriorityAllocateInfoEXT* toCount,
     size_t* count);
 
@@ -3104,6 +3596,7 @@
 #ifdef VK_NV_dedicated_allocation_image_aliasing
 void count_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* toCount,
     size_t* count);
 
@@ -3111,6 +3604,7 @@
 #ifdef VK_EXT_buffer_device_address
 void count_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* toCount,
     size_t* count);
 
@@ -3120,6 +3614,7 @@
 
 void count_VkBufferDeviceAddressCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBufferDeviceAddressCreateInfoEXT* toCount,
     size_t* count);
 
@@ -3127,6 +3622,7 @@
 #ifdef VK_EXT_tooling_info
 void count_VkPhysicalDeviceToolPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceToolPropertiesEXT* toCount,
     size_t* count);
 
@@ -3138,6 +3634,7 @@
 #ifdef VK_EXT_validation_features
 void count_VkValidationFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkValidationFeaturesEXT* toCount,
     size_t* count);
 
@@ -3145,16 +3642,19 @@
 #ifdef VK_NV_cooperative_matrix
 void count_VkCooperativeMatrixPropertiesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCooperativeMatrixPropertiesNV* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceCooperativeMatrixFeaturesNV* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceCooperativeMatrixPropertiesNV* toCount,
     size_t* count);
 
@@ -3162,16 +3662,19 @@
 #ifdef VK_NV_coverage_reduction_mode
 void count_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceCoverageReductionModeFeaturesNV* toCount,
     size_t* count);
 
 void count_VkPipelineCoverageReductionStateCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineCoverageReductionStateCreateInfoNV* toCount,
     size_t* count);
 
 void count_VkFramebufferMixedSamplesCombinationNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkFramebufferMixedSamplesCombinationNV* toCount,
     size_t* count);
 
@@ -3179,6 +3682,7 @@
 #ifdef VK_EXT_fragment_shader_interlock
 void count_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* toCount,
     size_t* count);
 
@@ -3186,6 +3690,7 @@
 #ifdef VK_EXT_ycbcr_image_arrays
 void count_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* toCount,
     size_t* count);
 
@@ -3193,16 +3698,19 @@
 #ifdef VK_EXT_full_screen_exclusive
 void count_VkSurfaceFullScreenExclusiveInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSurfaceFullScreenExclusiveInfoEXT* toCount,
     size_t* count);
 
 void count_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSurfaceCapabilitiesFullScreenExclusiveEXT* toCount,
     size_t* count);
 
 void count_VkSurfaceFullScreenExclusiveWin32InfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSurfaceFullScreenExclusiveWin32InfoEXT* toCount,
     size_t* count);
 
@@ -3210,6 +3718,7 @@
 #ifdef VK_EXT_headless_surface
 void count_VkHeadlessSurfaceCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkHeadlessSurfaceCreateInfoEXT* toCount,
     size_t* count);
 
@@ -3217,16 +3726,19 @@
 #ifdef VK_EXT_line_rasterization
 void count_VkPhysicalDeviceLineRasterizationFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceLineRasterizationFeaturesEXT* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceLineRasterizationPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceLineRasterizationPropertiesEXT* toCount,
     size_t* count);
 
 void count_VkPipelineRasterizationLineStateCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineRasterizationLineStateCreateInfoEXT* toCount,
     size_t* count);
 
@@ -3234,6 +3746,7 @@
 #ifdef VK_EXT_shader_atomic_float
 void count_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* toCount,
     size_t* count);
 
@@ -3245,6 +3758,7 @@
 #ifdef VK_EXT_index_type_uint8
 void count_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceIndexTypeUint8FeaturesEXT* toCount,
     size_t* count);
 
@@ -3252,6 +3766,7 @@
 #ifdef VK_EXT_extended_dynamic_state
 void count_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* toCount,
     size_t* count);
 
@@ -3259,6 +3774,7 @@
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 void count_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* toCount,
     size_t* count);
 
@@ -3266,66 +3782,79 @@
 #ifdef VK_NV_device_generated_commands
 void count_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* toCount,
     size_t* count);
 
 void count_VkGraphicsShaderGroupCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkGraphicsShaderGroupCreateInfoNV* toCount,
     size_t* count);
 
 void count_VkGraphicsPipelineShaderGroupsCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkGraphicsPipelineShaderGroupsCreateInfoNV* toCount,
     size_t* count);
 
 void count_VkBindShaderGroupIndirectCommandNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBindShaderGroupIndirectCommandNV* toCount,
     size_t* count);
 
 void count_VkBindIndexBufferIndirectCommandNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBindIndexBufferIndirectCommandNV* toCount,
     size_t* count);
 
 void count_VkBindVertexBufferIndirectCommandNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkBindVertexBufferIndirectCommandNV* toCount,
     size_t* count);
 
 void count_VkSetStateFlagsIndirectCommandNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSetStateFlagsIndirectCommandNV* toCount,
     size_t* count);
 
 void count_VkIndirectCommandsStreamNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkIndirectCommandsStreamNV* toCount,
     size_t* count);
 
 void count_VkIndirectCommandsLayoutTokenNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkIndirectCommandsLayoutTokenNV* toCount,
     size_t* count);
 
 void count_VkIndirectCommandsLayoutCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkIndirectCommandsLayoutCreateInfoNV* toCount,
     size_t* count);
 
 void count_VkGeneratedCommandsInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkGeneratedCommandsInfoNV* toCount,
     size_t* count);
 
 void count_VkGeneratedCommandsMemoryRequirementsInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkGeneratedCommandsMemoryRequirementsInfoNV* toCount,
     size_t* count);
 
@@ -3333,11 +3862,13 @@
 #ifdef VK_EXT_texel_buffer_alignment
 void count_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* toCount,
     size_t* count);
 
@@ -3345,11 +3876,13 @@
 #ifdef VK_QCOM_render_pass_transform
 void count_VkRenderPassTransformBeginInfoQCOM(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRenderPassTransformBeginInfoQCOM* toCount,
     size_t* count);
 
 void count_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCommandBufferInheritanceRenderPassTransformInfoQCOM* toCount,
     size_t* count);
 
@@ -3357,16 +3890,19 @@
 #ifdef VK_EXT_device_memory_report
 void count_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* toCount,
     size_t* count);
 
 void count_VkDeviceMemoryReportCallbackDataEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceMemoryReportCallbackDataEXT* toCount,
     size_t* count);
 
 void count_VkDeviceDeviceMemoryReportCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceDeviceMemoryReportCreateInfoEXT* toCount,
     size_t* count);
 
@@ -3374,11 +3910,13 @@
 #ifdef VK_EXT_robustness2
 void count_VkPhysicalDeviceRobustness2FeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceRobustness2FeaturesEXT* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceRobustness2PropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceRobustness2PropertiesEXT* toCount,
     size_t* count);
 
@@ -3386,16 +3924,19 @@
 #ifdef VK_EXT_custom_border_color
 void count_VkSamplerCustomBorderColorCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkSamplerCustomBorderColorCreateInfoEXT* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceCustomBorderColorPropertiesEXT* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceCustomBorderColorFeaturesEXT* toCount,
     size_t* count);
 
@@ -3405,16 +3946,19 @@
 #ifdef VK_EXT_private_data
 void count_VkPhysicalDevicePrivateDataFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDevicePrivateDataFeaturesEXT* toCount,
     size_t* count);
 
 void count_VkDevicePrivateDataCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDevicePrivateDataCreateInfoEXT* toCount,
     size_t* count);
 
 void count_VkPrivateDataSlotCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPrivateDataSlotCreateInfoEXT* toCount,
     size_t* count);
 
@@ -3422,6 +3966,7 @@
 #ifdef VK_EXT_pipeline_creation_cache_control
 void count_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* toCount,
     size_t* count);
 
@@ -3429,11 +3974,13 @@
 #ifdef VK_NV_device_diagnostics_config
 void count_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceDiagnosticsConfigFeaturesNV* toCount,
     size_t* count);
 
 void count_VkDeviceDiagnosticsConfigCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceDiagnosticsConfigCreateInfoNV* toCount,
     size_t* count);
 
@@ -3443,16 +3990,19 @@
 #ifdef VK_NV_fragment_shading_rate_enums
 void count_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* toCount,
     size_t* count);
 
 void count_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPipelineFragmentShadingRateEnumStateCreateInfoNV* toCount,
     size_t* count);
 
@@ -3460,11 +4010,13 @@
 #ifdef VK_EXT_fragment_density_map2
 void count_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* toCount,
     size_t* count);
 
@@ -3472,6 +4024,7 @@
 #ifdef VK_QCOM_rotated_copy_commands
 void count_VkCopyCommandTransformInfoQCOM(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCopyCommandTransformInfoQCOM* toCount,
     size_t* count);
 
@@ -3479,6 +4032,7 @@
 #ifdef VK_EXT_image_robustness
 void count_VkPhysicalDeviceImageRobustnessFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageRobustnessFeaturesEXT* toCount,
     size_t* count);
 
@@ -3486,6 +4040,7 @@
 #ifdef VK_EXT_4444_formats
 void count_VkPhysicalDevice4444FormatsFeaturesEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDevice4444FormatsFeaturesEXT* toCount,
     size_t* count);
 
@@ -3493,105 +4048,143 @@
 #ifdef VK_EXT_directfb_surface
 void count_VkDirectFBSurfaceCreateInfoEXT(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDirectFBSurfaceCreateInfoEXT* toCount,
     size_t* count);
 
 #endif
 #ifdef VK_GOOGLE_gfxstream
+void count_VkImportColorBufferGOOGLE(
+    uint32_t featureBits,
+    VkStructureType rootType,
+    const VkImportColorBufferGOOGLE* toCount,
+    size_t* count);
+
+void count_VkImportBufferGOOGLE(
+    uint32_t featureBits,
+    VkStructureType rootType,
+    const VkImportBufferGOOGLE* toCount,
+    size_t* count);
+
+void count_VkImportPhysicalAddressGOOGLE(
+    uint32_t featureBits,
+    VkStructureType rootType,
+    const VkImportPhysicalAddressGOOGLE* toCount,
+    size_t* count);
+
 #endif
 #ifdef VK_KHR_acceleration_structure
 void count_VkDeviceOrHostAddressKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceOrHostAddressKHR* toCount,
     size_t* count);
 
 void count_VkDeviceOrHostAddressConstKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkDeviceOrHostAddressConstKHR* toCount,
     size_t* count);
 
 void count_VkAccelerationStructureBuildRangeInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureBuildRangeInfoKHR* toCount,
     size_t* count);
 
 void count_VkAccelerationStructureGeometryTrianglesDataKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryTrianglesDataKHR* toCount,
     size_t* count);
 
 void count_VkAccelerationStructureGeometryAabbsDataKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryAabbsDataKHR* toCount,
     size_t* count);
 
 void count_VkAccelerationStructureGeometryInstancesDataKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryInstancesDataKHR* toCount,
     size_t* count);
 
 void count_VkAccelerationStructureGeometryDataKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryDataKHR* toCount,
     size_t* count);
 
 void count_VkAccelerationStructureGeometryKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryKHR* toCount,
     size_t* count);
 
 void count_VkAccelerationStructureBuildGeometryInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureBuildGeometryInfoKHR* toCount,
     size_t* count);
 
 void count_VkAccelerationStructureCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureCreateInfoKHR* toCount,
     size_t* count);
 
 void count_VkWriteDescriptorSetAccelerationStructureKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkWriteDescriptorSetAccelerationStructureKHR* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceAccelerationStructureFeaturesKHR* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceAccelerationStructurePropertiesKHR* toCount,
     size_t* count);
 
 void count_VkAccelerationStructureDeviceAddressInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureDeviceAddressInfoKHR* toCount,
     size_t* count);
 
 void count_VkAccelerationStructureVersionInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureVersionInfoKHR* toCount,
     size_t* count);
 
 void count_VkCopyAccelerationStructureToMemoryInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCopyAccelerationStructureToMemoryInfoKHR* toCount,
     size_t* count);
 
 void count_VkCopyMemoryToAccelerationStructureInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCopyMemoryToAccelerationStructureInfoKHR* toCount,
     size_t* count);
 
 void count_VkCopyAccelerationStructureInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkCopyAccelerationStructureInfoKHR* toCount,
     size_t* count);
 
 void count_VkAccelerationStructureBuildSizesInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkAccelerationStructureBuildSizesInfoKHR* toCount,
     size_t* count);
 
@@ -3599,36 +4192,43 @@
 #ifdef VK_KHR_ray_tracing_pipeline
 void count_VkRayTracingShaderGroupCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRayTracingShaderGroupCreateInfoKHR* toCount,
     size_t* count);
 
 void count_VkRayTracingPipelineInterfaceCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRayTracingPipelineInterfaceCreateInfoKHR* toCount,
     size_t* count);
 
 void count_VkRayTracingPipelineCreateInfoKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkRayTracingPipelineCreateInfoKHR* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPipelineFeaturesKHR* toCount,
     size_t* count);
 
 void count_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPipelinePropertiesKHR* toCount,
     size_t* count);
 
 void count_VkStridedDeviceAddressRegionKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkStridedDeviceAddressRegionKHR* toCount,
     size_t* count);
 
 void count_VkTraceRaysIndirectCommandKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkTraceRaysIndirectCommandKHR* toCount,
     size_t* count);
 
@@ -3636,6 +4236,7 @@
 #ifdef VK_KHR_ray_query
 void count_VkPhysicalDeviceRayQueryFeaturesKHR(
     uint32_t featureBits,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayQueryFeaturesKHR* toCount,
     size_t* count);
 
diff --git a/system/vulkan_enc/goldfish_vk_deepcopy_guest.cpp b/system/vulkan_enc/goldfish_vk_deepcopy_guest.cpp
index ba8cc08..a1be4fb 100644
--- a/system/vulkan_enc/goldfish_vk_deepcopy_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_deepcopy_guest.cpp
@@ -34,341 +34,416 @@
 namespace goldfish_vk {
 
 void deepcopy_extension_struct(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const void* structExtension,
     void* structExtension_out);
 
 #ifdef VK_VERSION_1_0
 void deepcopy_VkExtent2D(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExtent2D* from,
     VkExtent2D* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkExtent3D(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExtent3D* from,
     VkExtent3D* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkOffset2D(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkOffset2D* from,
     VkOffset2D* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkOffset3D(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkOffset3D* from,
     VkOffset3D* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkRect2D(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRect2D* from,
     VkRect2D* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
-    deepcopy_VkOffset2D(pool, &from->offset, (VkOffset2D*)(&to->offset));
-    deepcopy_VkExtent2D(pool, &from->extent, (VkExtent2D*)(&to->extent));
+    deepcopy_VkOffset2D(alloc, rootType, &from->offset, (VkOffset2D*)(&to->offset));
+    deepcopy_VkExtent2D(alloc, rootType, &from->extent, (VkExtent2D*)(&to->extent));
 }
 
 void deepcopy_VkBaseInStructure(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBaseInStructure* from,
     VkBaseInStructure* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const VkBaseInStructure*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const VkBaseInStructure*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkBaseOutStructure(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBaseOutStructure* from,
     VkBaseOutStructure* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (VkBaseOutStructure*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (VkBaseOutStructure*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkBufferMemoryBarrier(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBufferMemoryBarrier* from,
     VkBufferMemoryBarrier* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDispatchIndirectCommand(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDispatchIndirectCommand* from,
     VkDispatchIndirectCommand* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkDrawIndexedIndirectCommand(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDrawIndexedIndirectCommand* from,
     VkDrawIndexedIndirectCommand* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkDrawIndirectCommand(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDrawIndirectCommand* from,
     VkDrawIndirectCommand* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkImageSubresourceRange(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageSubresourceRange* from,
     VkImageSubresourceRange* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkImageMemoryBarrier(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageMemoryBarrier* from,
     VkImageMemoryBarrier* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkImageSubresourceRange(pool, &from->subresourceRange, (VkImageSubresourceRange*)(&to->subresourceRange));
+    deepcopy_VkImageSubresourceRange(alloc, rootType, &from->subresourceRange, (VkImageSubresourceRange*)(&to->subresourceRange));
 }
 
 void deepcopy_VkMemoryBarrier(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryBarrier* from,
     VkMemoryBarrier* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkAllocationCallbacks(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAllocationCallbacks* from,
     VkAllocationCallbacks* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
     to->pUserData = nullptr;
     if (from->pUserData)
     {
-        to->pUserData = (void*)pool->dupArray(from->pUserData, sizeof(uint8_t));
+        to->pUserData = (void*)alloc->dupArray(from->pUserData, sizeof(uint8_t));
     }
 }
 
 void deepcopy_VkApplicationInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkApplicationInfo* from,
     VkApplicationInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pApplicationName = nullptr;
     if (from->pApplicationName)
     {
-        to->pApplicationName = pool->strDup(from->pApplicationName);
+        to->pApplicationName = alloc->strDup(from->pApplicationName);
     }
     to->pEngineName = nullptr;
     if (from->pEngineName)
     {
-        to->pEngineName = pool->strDup(from->pEngineName);
+        to->pEngineName = alloc->strDup(from->pEngineName);
     }
 }
 
 void deepcopy_VkFormatProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkFormatProperties* from,
     VkFormatProperties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkImageFormatProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageFormatProperties* from,
     VkImageFormatProperties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
-    deepcopy_VkExtent3D(pool, &from->maxExtent, (VkExtent3D*)(&to->maxExtent));
+    deepcopy_VkExtent3D(alloc, rootType, &from->maxExtent, (VkExtent3D*)(&to->maxExtent));
 }
 
 void deepcopy_VkInstanceCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkInstanceCreateInfo* from,
     VkInstanceCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pApplicationInfo = nullptr;
     if (from->pApplicationInfo)
     {
-        to->pApplicationInfo = (VkApplicationInfo*)pool->alloc(sizeof(const VkApplicationInfo));
-        deepcopy_VkApplicationInfo(pool, from->pApplicationInfo, (VkApplicationInfo*)(to->pApplicationInfo));
+        to->pApplicationInfo = (VkApplicationInfo*)alloc->alloc(sizeof(const VkApplicationInfo));
+        deepcopy_VkApplicationInfo(alloc, rootType, from->pApplicationInfo, (VkApplicationInfo*)(to->pApplicationInfo));
     }
     to->ppEnabledLayerNames = nullptr;
     if (from->ppEnabledLayerNames && from->enabledLayerCount)
     {
-        to->ppEnabledLayerNames = pool->strDupArray(from->ppEnabledLayerNames, from->enabledLayerCount);
+        to->ppEnabledLayerNames = alloc->strDupArray(from->ppEnabledLayerNames, from->enabledLayerCount);
     }
     to->ppEnabledExtensionNames = nullptr;
     if (from->ppEnabledExtensionNames && from->enabledExtensionCount)
     {
-        to->ppEnabledExtensionNames = pool->strDupArray(from->ppEnabledExtensionNames, from->enabledExtensionCount);
+        to->ppEnabledExtensionNames = alloc->strDupArray(from->ppEnabledExtensionNames, from->enabledExtensionCount);
     }
 }
 
 void deepcopy_VkMemoryHeap(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryHeap* from,
     VkMemoryHeap* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkMemoryType(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryType* from,
     VkMemoryType* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkPhysicalDeviceFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceFeatures* from,
     VkPhysicalDeviceFeatures* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkPhysicalDeviceLimits(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceLimits* from,
     VkPhysicalDeviceLimits* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
     memcpy(to->maxComputeWorkGroupCount, from->maxComputeWorkGroupCount, 3 * sizeof(uint32_t));
     memcpy(to->maxComputeWorkGroupSize, from->maxComputeWorkGroupSize, 3 * sizeof(uint32_t));
@@ -379,379 +454,441 @@
 }
 
 void deepcopy_VkPhysicalDeviceMemoryProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryProperties* from,
     VkPhysicalDeviceMemoryProperties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
     for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_TYPES; ++i)
     {
-        deepcopy_VkMemoryType(pool, from->memoryTypes + i, (VkMemoryType*)(to->memoryTypes + 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(pool, from->memoryHeaps + i, (VkMemoryHeap*)(to->memoryHeaps + i));
+        deepcopy_VkMemoryHeap(alloc, rootType, from->memoryHeaps + i, (VkMemoryHeap*)(to->memoryHeaps + i));
     }
 }
 
 void deepcopy_VkPhysicalDeviceSparseProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceSparseProperties* from,
     VkPhysicalDeviceSparseProperties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkPhysicalDeviceProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceProperties* from,
     VkPhysicalDeviceProperties* to)
 {
-    (void)pool;
+    (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(pool, &from->limits, (VkPhysicalDeviceLimits*)(&to->limits));
-    deepcopy_VkPhysicalDeviceSparseProperties(pool, &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(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkQueueFamilyProperties* from,
     VkQueueFamilyProperties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
-    deepcopy_VkExtent3D(pool, &from->minImageTransferGranularity, (VkExtent3D*)(&to->minImageTransferGranularity));
+    deepcopy_VkExtent3D(alloc, rootType, &from->minImageTransferGranularity, (VkExtent3D*)(&to->minImageTransferGranularity));
 }
 
 void deepcopy_VkDeviceQueueCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceQueueCreateInfo* from,
     VkDeviceQueueCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pQueuePriorities = nullptr;
     if (from->pQueuePriorities)
     {
-        to->pQueuePriorities = (float*)pool->dupArray(from->pQueuePriorities, from->queueCount * sizeof(const float));
+        to->pQueuePriorities = (float*)alloc->dupArray(from->pQueuePriorities, from->queueCount * sizeof(const float));
     }
 }
 
 void deepcopy_VkDeviceCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceCreateInfo* from,
     VkDeviceCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pQueueCreateInfos = nullptr;
         if (from->pQueueCreateInfos)
         {
-            to->pQueueCreateInfos = (VkDeviceQueueCreateInfo*)pool->alloc(from->queueCreateInfoCount * sizeof(const VkDeviceQueueCreateInfo));
+            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(pool, from->pQueueCreateInfos + i, (VkDeviceQueueCreateInfo*)(to->pQueueCreateInfos + i));
+                deepcopy_VkDeviceQueueCreateInfo(alloc, rootType, from->pQueueCreateInfos + i, (VkDeviceQueueCreateInfo*)(to->pQueueCreateInfos + i));
             }
         }
     }
     to->ppEnabledLayerNames = nullptr;
     if (from->ppEnabledLayerNames && from->enabledLayerCount)
     {
-        to->ppEnabledLayerNames = pool->strDupArray(from->ppEnabledLayerNames, from->enabledLayerCount);
+        to->ppEnabledLayerNames = alloc->strDupArray(from->ppEnabledLayerNames, from->enabledLayerCount);
     }
     to->ppEnabledExtensionNames = nullptr;
     if (from->ppEnabledExtensionNames && from->enabledExtensionCount)
     {
-        to->ppEnabledExtensionNames = pool->strDupArray(from->ppEnabledExtensionNames, from->enabledExtensionCount);
+        to->ppEnabledExtensionNames = alloc->strDupArray(from->ppEnabledExtensionNames, from->enabledExtensionCount);
     }
     to->pEnabledFeatures = nullptr;
     if (from->pEnabledFeatures)
     {
-        to->pEnabledFeatures = (VkPhysicalDeviceFeatures*)pool->alloc(sizeof(const VkPhysicalDeviceFeatures));
-        deepcopy_VkPhysicalDeviceFeatures(pool, from->pEnabledFeatures, (VkPhysicalDeviceFeatures*)(to->pEnabledFeatures));
+        to->pEnabledFeatures = (VkPhysicalDeviceFeatures*)alloc->alloc(sizeof(const VkPhysicalDeviceFeatures));
+        deepcopy_VkPhysicalDeviceFeatures(alloc, rootType, from->pEnabledFeatures, (VkPhysicalDeviceFeatures*)(to->pEnabledFeatures));
     }
 }
 
 void deepcopy_VkExtensionProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExtensionProperties* from,
     VkExtensionProperties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
     memcpy(to->extensionName, from->extensionName, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char));
 }
 
 void deepcopy_VkLayerProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkLayerProperties* from,
     VkLayerProperties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
     memcpy(to->layerName, from->layerName, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char));
     memcpy(to->description, from->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
 }
 
 void deepcopy_VkSubmitInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSubmitInfo* from,
     VkSubmitInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pWaitSemaphores = nullptr;
     if (from->pWaitSemaphores)
     {
-        to->pWaitSemaphores = (VkSemaphore*)pool->dupArray(from->pWaitSemaphores, from->waitSemaphoreCount * sizeof(const VkSemaphore));
+        to->pWaitSemaphores = (VkSemaphore*)alloc->dupArray(from->pWaitSemaphores, from->waitSemaphoreCount * sizeof(const VkSemaphore));
     }
     to->pWaitDstStageMask = nullptr;
     if (from->pWaitDstStageMask)
     {
-        to->pWaitDstStageMask = (VkPipelineStageFlags*)pool->dupArray(from->pWaitDstStageMask, from->waitSemaphoreCount * sizeof(const VkPipelineStageFlags));
+        to->pWaitDstStageMask = (VkPipelineStageFlags*)alloc->dupArray(from->pWaitDstStageMask, from->waitSemaphoreCount * sizeof(const VkPipelineStageFlags));
     }
     to->pCommandBuffers = nullptr;
     if (from->pCommandBuffers)
     {
-        to->pCommandBuffers = (VkCommandBuffer*)pool->dupArray(from->pCommandBuffers, from->commandBufferCount * sizeof(const VkCommandBuffer));
+        to->pCommandBuffers = (VkCommandBuffer*)alloc->dupArray(from->pCommandBuffers, from->commandBufferCount * sizeof(const VkCommandBuffer));
     }
     to->pSignalSemaphores = nullptr;
     if (from->pSignalSemaphores)
     {
-        to->pSignalSemaphores = (VkSemaphore*)pool->dupArray(from->pSignalSemaphores, from->signalSemaphoreCount * sizeof(const VkSemaphore));
+        to->pSignalSemaphores = (VkSemaphore*)alloc->dupArray(from->pSignalSemaphores, from->signalSemaphoreCount * sizeof(const VkSemaphore));
     }
 }
 
 void deepcopy_VkMappedMemoryRange(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMappedMemoryRange* from,
     VkMappedMemoryRange* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkMemoryAllocateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryAllocateInfo* from,
     VkMemoryAllocateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkMemoryRequirements(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryRequirements* from,
     VkMemoryRequirements* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkSparseMemoryBind(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSparseMemoryBind* from,
     VkSparseMemoryBind* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkSparseBufferMemoryBindInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSparseBufferMemoryBindInfo* from,
     VkSparseBufferMemoryBindInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
     if (from)
     {
         to->pBinds = nullptr;
         if (from->pBinds)
         {
-            to->pBinds = (VkSparseMemoryBind*)pool->alloc(from->bindCount * sizeof(const VkSparseMemoryBind));
+            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(pool, from->pBinds + i, (VkSparseMemoryBind*)(to->pBinds + i));
+                deepcopy_VkSparseMemoryBind(alloc, rootType, from->pBinds + i, (VkSparseMemoryBind*)(to->pBinds + i));
             }
         }
     }
 }
 
 void deepcopy_VkSparseImageOpaqueMemoryBindInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSparseImageOpaqueMemoryBindInfo* from,
     VkSparseImageOpaqueMemoryBindInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
     if (from)
     {
         to->pBinds = nullptr;
         if (from->pBinds)
         {
-            to->pBinds = (VkSparseMemoryBind*)pool->alloc(from->bindCount * sizeof(const VkSparseMemoryBind));
+            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(pool, from->pBinds + i, (VkSparseMemoryBind*)(to->pBinds + i));
+                deepcopy_VkSparseMemoryBind(alloc, rootType, from->pBinds + i, (VkSparseMemoryBind*)(to->pBinds + i));
             }
         }
     }
 }
 
 void deepcopy_VkImageSubresource(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageSubresource* from,
     VkImageSubresource* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkSparseImageMemoryBind(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSparseImageMemoryBind* from,
     VkSparseImageMemoryBind* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
-    deepcopy_VkImageSubresource(pool, &from->subresource, (VkImageSubresource*)(&to->subresource));
-    deepcopy_VkOffset3D(pool, &from->offset, (VkOffset3D*)(&to->offset));
-    deepcopy_VkExtent3D(pool, &from->extent, (VkExtent3D*)(&to->extent));
+    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(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSparseImageMemoryBindInfo* from,
     VkSparseImageMemoryBindInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
     if (from)
     {
         to->pBinds = nullptr;
         if (from->pBinds)
         {
-            to->pBinds = (VkSparseImageMemoryBind*)pool->alloc(from->bindCount * sizeof(const VkSparseImageMemoryBind));
+            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(pool, from->pBinds + i, (VkSparseImageMemoryBind*)(to->pBinds + i));
+                deepcopy_VkSparseImageMemoryBind(alloc, rootType, from->pBinds + i, (VkSparseImageMemoryBind*)(to->pBinds + i));
             }
         }
     }
 }
 
 void deepcopy_VkBindSparseInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBindSparseInfo* from,
     VkBindSparseInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pWaitSemaphores = nullptr;
     if (from->pWaitSemaphores)
     {
-        to->pWaitSemaphores = (VkSemaphore*)pool->dupArray(from->pWaitSemaphores, from->waitSemaphoreCount * sizeof(const VkSemaphore));
+        to->pWaitSemaphores = (VkSemaphore*)alloc->dupArray(from->pWaitSemaphores, from->waitSemaphoreCount * sizeof(const VkSemaphore));
     }
     if (from)
     {
         to->pBufferBinds = nullptr;
         if (from->pBufferBinds)
         {
-            to->pBufferBinds = (VkSparseBufferMemoryBindInfo*)pool->alloc(from->bufferBindCount * sizeof(const VkSparseBufferMemoryBindInfo));
+            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(pool, from->pBufferBinds + i, (VkSparseBufferMemoryBindInfo*)(to->pBufferBinds + i));
+                deepcopy_VkSparseBufferMemoryBindInfo(alloc, rootType, from->pBufferBinds + i, (VkSparseBufferMemoryBindInfo*)(to->pBufferBinds + i));
             }
         }
     }
@@ -760,11 +897,11 @@
         to->pImageOpaqueBinds = nullptr;
         if (from->pImageOpaqueBinds)
         {
-            to->pImageOpaqueBinds = (VkSparseImageOpaqueMemoryBindInfo*)pool->alloc(from->imageOpaqueBindCount * sizeof(const VkSparseImageOpaqueMemoryBindInfo));
+            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(pool, from->pImageOpaqueBinds + i, (VkSparseImageOpaqueMemoryBindInfo*)(to->pImageOpaqueBinds + i));
+                deepcopy_VkSparseImageOpaqueMemoryBindInfo(alloc, rootType, from->pImageOpaqueBinds + i, (VkSparseImageOpaqueMemoryBindInfo*)(to->pImageOpaqueBinds + i));
             }
         }
     }
@@ -773,442 +910,536 @@
         to->pImageBinds = nullptr;
         if (from->pImageBinds)
         {
-            to->pImageBinds = (VkSparseImageMemoryBindInfo*)pool->alloc(from->imageBindCount * sizeof(const VkSparseImageMemoryBindInfo));
+            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(pool, from->pImageBinds + i, (VkSparseImageMemoryBindInfo*)(to->pImageBinds + i));
+                deepcopy_VkSparseImageMemoryBindInfo(alloc, rootType, from->pImageBinds + i, (VkSparseImageMemoryBindInfo*)(to->pImageBinds + i));
             }
         }
     }
     to->pSignalSemaphores = nullptr;
     if (from->pSignalSemaphores)
     {
-        to->pSignalSemaphores = (VkSemaphore*)pool->dupArray(from->pSignalSemaphores, from->signalSemaphoreCount * sizeof(const VkSemaphore));
+        to->pSignalSemaphores = (VkSemaphore*)alloc->dupArray(from->pSignalSemaphores, from->signalSemaphoreCount * sizeof(const VkSemaphore));
     }
 }
 
 void deepcopy_VkSparseImageFormatProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSparseImageFormatProperties* from,
     VkSparseImageFormatProperties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
-    deepcopy_VkExtent3D(pool, &from->imageGranularity, (VkExtent3D*)(&to->imageGranularity));
+    deepcopy_VkExtent3D(alloc, rootType, &from->imageGranularity, (VkExtent3D*)(&to->imageGranularity));
 }
 
 void deepcopy_VkSparseImageMemoryRequirements(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSparseImageMemoryRequirements* from,
     VkSparseImageMemoryRequirements* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
-    deepcopy_VkSparseImageFormatProperties(pool, &from->formatProperties, (VkSparseImageFormatProperties*)(&to->formatProperties));
+    deepcopy_VkSparseImageFormatProperties(alloc, rootType, &from->formatProperties, (VkSparseImageFormatProperties*)(&to->formatProperties));
 }
 
 void deepcopy_VkFenceCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkFenceCreateInfo* from,
     VkFenceCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkSemaphoreCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSemaphoreCreateInfo* from,
     VkSemaphoreCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkEventCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkEventCreateInfo* from,
     VkEventCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkQueryPoolCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkQueryPoolCreateInfo* from,
     VkQueryPoolCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkBufferCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBufferCreateInfo* from,
     VkBufferCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const 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*)pool->dupArray(from->pQueueFamilyIndices, from->queueFamilyIndexCount * sizeof(const uint32_t));
+        to->pQueueFamilyIndices = (uint32_t*)alloc->dupArray(from->pQueueFamilyIndices, from->queueFamilyIndexCount * sizeof(const uint32_t));
     }
 }
 
 void deepcopy_VkBufferViewCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBufferViewCreateInfo* from,
     VkBufferViewCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkImageCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageCreateInfo* from,
     VkImageCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkExtent3D(pool, &from->extent, (VkExtent3D*)(&to->extent));
+    deepcopy_VkExtent3D(alloc, rootType, &from->extent, (VkExtent3D*)(&to->extent));
     to->pQueueFamilyIndices = nullptr;
     if (from->pQueueFamilyIndices)
     {
-        to->pQueueFamilyIndices = (uint32_t*)pool->dupArray(from->pQueueFamilyIndices, from->queueFamilyIndexCount * sizeof(const uint32_t));
+        to->pQueueFamilyIndices = (uint32_t*)alloc->dupArray(from->pQueueFamilyIndices, from->queueFamilyIndexCount * sizeof(const uint32_t));
     }
 }
 
 void deepcopy_VkSubresourceLayout(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSubresourceLayout* from,
     VkSubresourceLayout* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkComponentMapping(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkComponentMapping* from,
     VkComponentMapping* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkImageViewCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageViewCreateInfo* from,
     VkImageViewCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkComponentMapping(pool, &from->components, (VkComponentMapping*)(&to->components));
-    deepcopy_VkImageSubresourceRange(pool, &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(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkShaderModuleCreateInfo* from,
     VkShaderModuleCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const 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*)pool->dupArray(from->pCode, (from->codeSize / 4) * sizeof(const uint32_t));
+        to->pCode = (uint32_t*)alloc->dupArray(from->pCode, (from->codeSize / 4) * sizeof(const uint32_t));
     }
 }
 
 void deepcopy_VkPipelineCacheCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineCacheCreateInfo* from,
     VkPipelineCacheCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pInitialData = nullptr;
     if (from->pInitialData)
     {
-        to->pInitialData = (void*)pool->dupArray(from->pInitialData, from->initialDataSize * sizeof(const uint8_t));
+        to->pInitialData = (void*)alloc->dupArray(from->pInitialData, from->initialDataSize * sizeof(const uint8_t));
     }
 }
 
 void deepcopy_VkSpecializationMapEntry(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSpecializationMapEntry* from,
     VkSpecializationMapEntry* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkSpecializationInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSpecializationInfo* from,
     VkSpecializationInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
     if (from)
     {
         to->pMapEntries = nullptr;
         if (from->pMapEntries)
         {
-            to->pMapEntries = (VkSpecializationMapEntry*)pool->alloc(from->mapEntryCount * sizeof(const VkSpecializationMapEntry));
+            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(pool, from->pMapEntries + i, (VkSpecializationMapEntry*)(to->pMapEntries + i));
+                deepcopy_VkSpecializationMapEntry(alloc, rootType, from->pMapEntries + i, (VkSpecializationMapEntry*)(to->pMapEntries + i));
             }
         }
     }
     to->pData = nullptr;
     if (from->pData)
     {
-        to->pData = (void*)pool->dupArray(from->pData, from->dataSize * sizeof(const uint8_t));
+        to->pData = (void*)alloc->dupArray(from->pData, from->dataSize * sizeof(const uint8_t));
     }
 }
 
 void deepcopy_VkPipelineShaderStageCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineShaderStageCreateInfo* from,
     VkPipelineShaderStageCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pName = nullptr;
     if (from->pName)
     {
-        to->pName = pool->strDup(from->pName);
+        to->pName = alloc->strDup(from->pName);
     }
     to->pSpecializationInfo = nullptr;
     if (from->pSpecializationInfo)
     {
-        to->pSpecializationInfo = (VkSpecializationInfo*)pool->alloc(sizeof(const VkSpecializationInfo));
-        deepcopy_VkSpecializationInfo(pool, from->pSpecializationInfo, (VkSpecializationInfo*)(to->pSpecializationInfo));
+        to->pSpecializationInfo = (VkSpecializationInfo*)alloc->alloc(sizeof(const VkSpecializationInfo));
+        deepcopy_VkSpecializationInfo(alloc, rootType, from->pSpecializationInfo, (VkSpecializationInfo*)(to->pSpecializationInfo));
     }
 }
 
 void deepcopy_VkComputePipelineCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkComputePipelineCreateInfo* from,
     VkComputePipelineCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkPipelineShaderStageCreateInfo(pool, &from->stage, (VkPipelineShaderStageCreateInfo*)(&to->stage));
+    deepcopy_VkPipelineShaderStageCreateInfo(alloc, rootType, &from->stage, (VkPipelineShaderStageCreateInfo*)(&to->stage));
 }
 
 void deepcopy_VkVertexInputBindingDescription(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkVertexInputBindingDescription* from,
     VkVertexInputBindingDescription* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkVertexInputAttributeDescription(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkVertexInputAttributeDescription* from,
     VkVertexInputAttributeDescription* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkPipelineVertexInputStateCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineVertexInputStateCreateInfo* from,
     VkPipelineVertexInputStateCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pVertexBindingDescriptions = nullptr;
         if (from->pVertexBindingDescriptions)
         {
-            to->pVertexBindingDescriptions = (VkVertexInputBindingDescription*)pool->alloc(from->vertexBindingDescriptionCount * sizeof(const VkVertexInputBindingDescription));
+            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(pool, from->pVertexBindingDescriptions + i, (VkVertexInputBindingDescription*)(to->pVertexBindingDescriptions + i));
+                deepcopy_VkVertexInputBindingDescription(alloc, rootType, from->pVertexBindingDescriptions + i, (VkVertexInputBindingDescription*)(to->pVertexBindingDescriptions + i));
             }
         }
     }
@@ -1217,99 +1448,119 @@
         to->pVertexAttributeDescriptions = nullptr;
         if (from->pVertexAttributeDescriptions)
         {
-            to->pVertexAttributeDescriptions = (VkVertexInputAttributeDescription*)pool->alloc(from->vertexAttributeDescriptionCount * sizeof(const VkVertexInputAttributeDescription));
+            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(pool, from->pVertexAttributeDescriptions + i, (VkVertexInputAttributeDescription*)(to->pVertexAttributeDescriptions + i));
+                deepcopy_VkVertexInputAttributeDescription(alloc, rootType, from->pVertexAttributeDescriptions + i, (VkVertexInputAttributeDescription*)(to->pVertexAttributeDescriptions + i));
             }
         }
     }
 }
 
 void deepcopy_VkPipelineInputAssemblyStateCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineInputAssemblyStateCreateInfo* from,
     VkPipelineInputAssemblyStateCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineTessellationStateCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineTessellationStateCreateInfo* from,
     VkPipelineTessellationStateCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkViewport(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkViewport* from,
     VkViewport* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkPipelineViewportStateCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineViewportStateCreateInfo* from,
     VkPipelineViewportStateCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pViewports = nullptr;
         if (from->pViewports)
         {
-            to->pViewports = (VkViewport*)pool->alloc(from->viewportCount * sizeof(const VkViewport));
+            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(pool, from->pViewports + i, (VkViewport*)(to->pViewports + i));
+                deepcopy_VkViewport(alloc, rootType, from->pViewports + i, (VkViewport*)(to->pViewports + i));
             }
         }
     }
@@ -1318,137 +1569,165 @@
         to->pScissors = nullptr;
         if (from->pScissors)
         {
-            to->pScissors = (VkRect2D*)pool->alloc(from->scissorCount * sizeof(const VkRect2D));
+            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(pool, from->pScissors + i, (VkRect2D*)(to->pScissors + i));
+                deepcopy_VkRect2D(alloc, rootType, from->pScissors + i, (VkRect2D*)(to->pScissors + i));
             }
         }
     }
 }
 
 void deepcopy_VkPipelineRasterizationStateCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineRasterizationStateCreateInfo* from,
     VkPipelineRasterizationStateCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineMultisampleStateCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineMultisampleStateCreateInfo* from,
     VkPipelineMultisampleStateCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pSampleMask = nullptr;
     if (from->pSampleMask)
     {
-        to->pSampleMask = (VkSampleMask*)pool->dupArray(from->pSampleMask, (((from->rasterizationSamples) + 31) / 32) * sizeof(const VkSampleMask));
+        to->pSampleMask = (VkSampleMask*)alloc->dupArray(from->pSampleMask, (((from->rasterizationSamples) + 31) / 32) * sizeof(const VkSampleMask));
     }
 }
 
 void deepcopy_VkStencilOpState(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkStencilOpState* from,
     VkStencilOpState* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkPipelineDepthStencilStateCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineDepthStencilStateCreateInfo* from,
     VkPipelineDepthStencilStateCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkStencilOpState(pool, &from->front, (VkStencilOpState*)(&to->front));
-    deepcopy_VkStencilOpState(pool, &from->back, (VkStencilOpState*)(&to->back));
+    deepcopy_VkStencilOpState(alloc, rootType, &from->front, (VkStencilOpState*)(&to->front));
+    deepcopy_VkStencilOpState(alloc, rootType, &from->back, (VkStencilOpState*)(&to->back));
 }
 
 void deepcopy_VkPipelineColorBlendAttachmentState(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineColorBlendAttachmentState* from,
     VkPipelineColorBlendAttachmentState* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkPipelineColorBlendStateCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineColorBlendStateCreateInfo* from,
     VkPipelineColorBlendStateCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pAttachments = nullptr;
         if (from->pAttachments)
         {
-            to->pAttachments = (VkPipelineColorBlendAttachmentState*)pool->alloc(from->attachmentCount * sizeof(const VkPipelineColorBlendAttachmentState));
+            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(pool, from->pAttachments + i, (VkPipelineColorBlendAttachmentState*)(to->pAttachments + i));
+                deepcopy_VkPipelineColorBlendAttachmentState(alloc, rootType, from->pAttachments + i, (VkPipelineColorBlendAttachmentState*)(to->pAttachments + i));
             }
         }
     }
@@ -1456,382 +1735,446 @@
 }
 
 void deepcopy_VkPipelineDynamicStateCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineDynamicStateCreateInfo* from,
     VkPipelineDynamicStateCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pDynamicStates = nullptr;
     if (from->pDynamicStates)
     {
-        to->pDynamicStates = (VkDynamicState*)pool->dupArray(from->pDynamicStates, from->dynamicStateCount * sizeof(const VkDynamicState));
+        to->pDynamicStates = (VkDynamicState*)alloc->dupArray(from->pDynamicStates, from->dynamicStateCount * sizeof(const VkDynamicState));
     }
 }
 
 void deepcopy_VkGraphicsPipelineCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkGraphicsPipelineCreateInfo* from,
     VkGraphicsPipelineCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pStages = nullptr;
         if (from->pStages)
         {
-            to->pStages = (VkPipelineShaderStageCreateInfo*)pool->alloc(from->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
+            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(pool, from->pStages + i, (VkPipelineShaderStageCreateInfo*)(to->pStages + i));
+                deepcopy_VkPipelineShaderStageCreateInfo(alloc, rootType, from->pStages + i, (VkPipelineShaderStageCreateInfo*)(to->pStages + i));
             }
         }
     }
     to->pVertexInputState = nullptr;
     if (from->pVertexInputState)
     {
-        to->pVertexInputState = (VkPipelineVertexInputStateCreateInfo*)pool->alloc(sizeof(const VkPipelineVertexInputStateCreateInfo));
-        deepcopy_VkPipelineVertexInputStateCreateInfo(pool, from->pVertexInputState, (VkPipelineVertexInputStateCreateInfo*)(to->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*)pool->alloc(sizeof(const VkPipelineInputAssemblyStateCreateInfo));
-        deepcopy_VkPipelineInputAssemblyStateCreateInfo(pool, from->pInputAssemblyState, (VkPipelineInputAssemblyStateCreateInfo*)(to->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*)pool->alloc(sizeof(const VkPipelineTessellationStateCreateInfo));
-        deepcopy_VkPipelineTessellationStateCreateInfo(pool, from->pTessellationState, (VkPipelineTessellationStateCreateInfo*)(to->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*)pool->alloc(sizeof(const VkPipelineViewportStateCreateInfo));
-        deepcopy_VkPipelineViewportStateCreateInfo(pool, from->pViewportState, (VkPipelineViewportStateCreateInfo*)(to->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*)pool->alloc(sizeof(const VkPipelineRasterizationStateCreateInfo));
-        deepcopy_VkPipelineRasterizationStateCreateInfo(pool, from->pRasterizationState, (VkPipelineRasterizationStateCreateInfo*)(to->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*)pool->alloc(sizeof(const VkPipelineMultisampleStateCreateInfo));
-        deepcopy_VkPipelineMultisampleStateCreateInfo(pool, from->pMultisampleState, (VkPipelineMultisampleStateCreateInfo*)(to->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*)pool->alloc(sizeof(const VkPipelineDepthStencilStateCreateInfo));
-        deepcopy_VkPipelineDepthStencilStateCreateInfo(pool, from->pDepthStencilState, (VkPipelineDepthStencilStateCreateInfo*)(to->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*)pool->alloc(sizeof(const VkPipelineColorBlendStateCreateInfo));
-        deepcopy_VkPipelineColorBlendStateCreateInfo(pool, from->pColorBlendState, (VkPipelineColorBlendStateCreateInfo*)(to->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*)pool->alloc(sizeof(const VkPipelineDynamicStateCreateInfo));
-        deepcopy_VkPipelineDynamicStateCreateInfo(pool, from->pDynamicState, (VkPipelineDynamicStateCreateInfo*)(to->pDynamicState));
+        to->pDynamicState = (VkPipelineDynamicStateCreateInfo*)alloc->alloc(sizeof(const VkPipelineDynamicStateCreateInfo));
+        deepcopy_VkPipelineDynamicStateCreateInfo(alloc, rootType, from->pDynamicState, (VkPipelineDynamicStateCreateInfo*)(to->pDynamicState));
     }
 }
 
 void deepcopy_VkPushConstantRange(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPushConstantRange* from,
     VkPushConstantRange* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkPipelineLayoutCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineLayoutCreateInfo* from,
     VkPipelineLayoutCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pSetLayouts = nullptr;
     if (from->pSetLayouts)
     {
-        to->pSetLayouts = (VkDescriptorSetLayout*)pool->dupArray(from->pSetLayouts, from->setLayoutCount * sizeof(const VkDescriptorSetLayout));
+        to->pSetLayouts = (VkDescriptorSetLayout*)alloc->dupArray(from->pSetLayouts, from->setLayoutCount * sizeof(const VkDescriptorSetLayout));
     }
     if (from)
     {
         to->pPushConstantRanges = nullptr;
         if (from->pPushConstantRanges)
         {
-            to->pPushConstantRanges = (VkPushConstantRange*)pool->alloc(from->pushConstantRangeCount * sizeof(const VkPushConstantRange));
+            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(pool, from->pPushConstantRanges + i, (VkPushConstantRange*)(to->pPushConstantRanges + i));
+                deepcopy_VkPushConstantRange(alloc, rootType, from->pPushConstantRanges + i, (VkPushConstantRange*)(to->pPushConstantRanges + i));
             }
         }
     }
 }
 
 void deepcopy_VkSamplerCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSamplerCreateInfo* from,
     VkSamplerCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkCopyDescriptorSet(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCopyDescriptorSet* from,
     VkCopyDescriptorSet* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDescriptorBufferInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorBufferInfo* from,
     VkDescriptorBufferInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkDescriptorImageInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorImageInfo* from,
     VkDescriptorImageInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkDescriptorPoolSize(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorPoolSize* from,
     VkDescriptorPoolSize* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkDescriptorPoolCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorPoolCreateInfo* from,
     VkDescriptorPoolCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pPoolSizes = nullptr;
         if (from->pPoolSizes)
         {
-            to->pPoolSizes = (VkDescriptorPoolSize*)pool->alloc(from->poolSizeCount * sizeof(const VkDescriptorPoolSize));
+            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(pool, from->pPoolSizes + i, (VkDescriptorPoolSize*)(to->pPoolSizes + i));
+                deepcopy_VkDescriptorPoolSize(alloc, rootType, from->pPoolSizes + i, (VkDescriptorPoolSize*)(to->pPoolSizes + i));
             }
         }
     }
 }
 
 void deepcopy_VkDescriptorSetAllocateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorSetAllocateInfo* from,
     VkDescriptorSetAllocateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pSetLayouts = nullptr;
     if (from->pSetLayouts)
     {
-        to->pSetLayouts = (VkDescriptorSetLayout*)pool->dupArray(from->pSetLayouts, from->descriptorSetCount * sizeof(const VkDescriptorSetLayout));
+        to->pSetLayouts = (VkDescriptorSetLayout*)alloc->dupArray(from->pSetLayouts, from->descriptorSetCount * sizeof(const VkDescriptorSetLayout));
     }
 }
 
 void deepcopy_VkDescriptorSetLayoutBinding(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutBinding* from,
     VkDescriptorSetLayoutBinding* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
     to->pImmutableSamplers = nullptr;
     if (from->pImmutableSamplers)
     {
-        to->pImmutableSamplers = (VkSampler*)pool->dupArray(from->pImmutableSamplers, from->descriptorCount * sizeof(const VkSampler));
+        to->pImmutableSamplers = (VkSampler*)alloc->dupArray(from->pImmutableSamplers, from->descriptorCount * sizeof(const VkSampler));
     }
 }
 
 void deepcopy_VkDescriptorSetLayoutCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutCreateInfo* from,
     VkDescriptorSetLayoutCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pBindings = nullptr;
         if (from->pBindings)
         {
-            to->pBindings = (VkDescriptorSetLayoutBinding*)pool->alloc(from->bindingCount * sizeof(const VkDescriptorSetLayoutBinding));
+            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(pool, from->pBindings + i, (VkDescriptorSetLayoutBinding*)(to->pBindings + i));
+                deepcopy_VkDescriptorSetLayoutBinding(alloc, rootType, from->pBindings + i, (VkDescriptorSetLayoutBinding*)(to->pBindings + i));
             }
         }
     }
 }
 
 void deepcopy_VkWriteDescriptorSet(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkWriteDescriptorSet* from,
     VkWriteDescriptorSet* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pImageInfo = nullptr;
         if (from->pImageInfo)
         {
-            to->pImageInfo = (VkDescriptorImageInfo*)pool->alloc(from->descriptorCount * sizeof(const VkDescriptorImageInfo));
+            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(pool, from->pImageInfo + i, (VkDescriptorImageInfo*)(to->pImageInfo + i));
+                deepcopy_VkDescriptorImageInfo(alloc, rootType, from->pImageInfo + i, (VkDescriptorImageInfo*)(to->pImageInfo + i));
             }
         }
     }
@@ -1840,83 +2183,95 @@
         to->pBufferInfo = nullptr;
         if (from->pBufferInfo)
         {
-            to->pBufferInfo = (VkDescriptorBufferInfo*)pool->alloc(from->descriptorCount * sizeof(const VkDescriptorBufferInfo));
+            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(pool, from->pBufferInfo + i, (VkDescriptorBufferInfo*)(to->pBufferInfo + i));
+                deepcopy_VkDescriptorBufferInfo(alloc, rootType, from->pBufferInfo + i, (VkDescriptorBufferInfo*)(to->pBufferInfo + i));
             }
         }
     }
     to->pTexelBufferView = nullptr;
     if (from->pTexelBufferView)
     {
-        to->pTexelBufferView = (VkBufferView*)pool->dupArray(from->pTexelBufferView, from->descriptorCount * sizeof(const VkBufferView));
+        to->pTexelBufferView = (VkBufferView*)alloc->dupArray(from->pTexelBufferView, from->descriptorCount * sizeof(const VkBufferView));
     }
 }
 
 void deepcopy_VkAttachmentDescription(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAttachmentDescription* from,
     VkAttachmentDescription* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkAttachmentReference(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAttachmentReference* from,
     VkAttachmentReference* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkFramebufferCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkFramebufferCreateInfo* from,
     VkFramebufferCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pAttachments = nullptr;
     if (from->pAttachments)
     {
-        to->pAttachments = (VkImageView*)pool->dupArray(from->pAttachments, from->attachmentCount * sizeof(const VkImageView));
+        to->pAttachments = (VkImageView*)alloc->dupArray(from->pAttachments, from->attachmentCount * sizeof(const VkImageView));
     }
 }
 
 void deepcopy_VkSubpassDescription(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSubpassDescription* from,
     VkSubpassDescription* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
     if (from)
     {
         to->pInputAttachments = nullptr;
         if (from->pInputAttachments)
         {
-            to->pInputAttachments = (VkAttachmentReference*)pool->alloc(from->inputAttachmentCount * sizeof(const VkAttachmentReference));
+            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(pool, from->pInputAttachments + i, (VkAttachmentReference*)(to->pInputAttachments + i));
+                deepcopy_VkAttachmentReference(alloc, rootType, from->pInputAttachments + i, (VkAttachmentReference*)(to->pInputAttachments + i));
             }
         }
     }
@@ -1925,11 +2280,11 @@
         to->pColorAttachments = nullptr;
         if (from->pColorAttachments)
         {
-            to->pColorAttachments = (VkAttachmentReference*)pool->alloc(from->colorAttachmentCount * sizeof(const VkAttachmentReference));
+            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(pool, from->pColorAttachments + i, (VkAttachmentReference*)(to->pColorAttachments + i));
+                deepcopy_VkAttachmentReference(alloc, rootType, from->pColorAttachments + i, (VkAttachmentReference*)(to->pColorAttachments + i));
             }
         }
     }
@@ -1938,66 +2293,74 @@
         to->pResolveAttachments = nullptr;
         if (from->pResolveAttachments)
         {
-            to->pResolveAttachments = (VkAttachmentReference*)pool->alloc(from->colorAttachmentCount * sizeof(const VkAttachmentReference));
+            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(pool, from->pResolveAttachments + i, (VkAttachmentReference*)(to->pResolveAttachments + i));
+                deepcopy_VkAttachmentReference(alloc, rootType, from->pResolveAttachments + i, (VkAttachmentReference*)(to->pResolveAttachments + i));
             }
         }
     }
     to->pDepthStencilAttachment = nullptr;
     if (from->pDepthStencilAttachment)
     {
-        to->pDepthStencilAttachment = (VkAttachmentReference*)pool->alloc(sizeof(const VkAttachmentReference));
-        deepcopy_VkAttachmentReference(pool, from->pDepthStencilAttachment, (VkAttachmentReference*)(to->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*)pool->dupArray(from->pPreserveAttachments, from->preserveAttachmentCount * sizeof(const uint32_t));
+        to->pPreserveAttachments = (uint32_t*)alloc->dupArray(from->pPreserveAttachments, from->preserveAttachmentCount * sizeof(const uint32_t));
     }
 }
 
 void deepcopy_VkSubpassDependency(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSubpassDependency* from,
     VkSubpassDependency* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkRenderPassCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRenderPassCreateInfo* from,
     VkRenderPassCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pAttachments = nullptr;
         if (from->pAttachments)
         {
-            to->pAttachments = (VkAttachmentDescription*)pool->alloc(from->attachmentCount * sizeof(const VkAttachmentDescription));
+            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(pool, from->pAttachments + i, (VkAttachmentDescription*)(to->pAttachments + i));
+                deepcopy_VkAttachmentDescription(alloc, rootType, from->pAttachments + i, (VkAttachmentDescription*)(to->pAttachments + i));
             }
         }
     }
@@ -2006,11 +2369,11 @@
         to->pSubpasses = nullptr;
         if (from->pSubpasses)
         {
-            to->pSubpasses = (VkSubpassDescription*)pool->alloc(from->subpassCount * sizeof(const VkSubpassDescription));
+            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(pool, from->pSubpasses + i, (VkSubpassDescription*)(to->pSubpasses + i));
+                deepcopy_VkSubpassDescription(alloc, rootType, from->pSubpasses + i, (VkSubpassDescription*)(to->pSubpasses + i));
             }
         }
     }
@@ -2019,146 +2382,178 @@
         to->pDependencies = nullptr;
         if (from->pDependencies)
         {
-            to->pDependencies = (VkSubpassDependency*)pool->alloc(from->dependencyCount * sizeof(const VkSubpassDependency));
+            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(pool, from->pDependencies + i, (VkSubpassDependency*)(to->pDependencies + i));
+                deepcopy_VkSubpassDependency(alloc, rootType, from->pDependencies + i, (VkSubpassDependency*)(to->pDependencies + i));
             }
         }
     }
 }
 
 void deepcopy_VkCommandPoolCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCommandPoolCreateInfo* from,
     VkCommandPoolCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkCommandBufferAllocateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCommandBufferAllocateInfo* from,
     VkCommandBufferAllocateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkCommandBufferInheritanceInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCommandBufferInheritanceInfo* from,
     VkCommandBufferInheritanceInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkCommandBufferBeginInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCommandBufferBeginInfo* from,
     VkCommandBufferBeginInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pInheritanceInfo = nullptr;
     if (from->pInheritanceInfo)
     {
-        to->pInheritanceInfo = (VkCommandBufferInheritanceInfo*)pool->alloc(sizeof(const VkCommandBufferInheritanceInfo));
-        deepcopy_VkCommandBufferInheritanceInfo(pool, from->pInheritanceInfo, (VkCommandBufferInheritanceInfo*)(to->pInheritanceInfo));
+        to->pInheritanceInfo = (VkCommandBufferInheritanceInfo*)alloc->alloc(sizeof(const VkCommandBufferInheritanceInfo));
+        deepcopy_VkCommandBufferInheritanceInfo(alloc, rootType, from->pInheritanceInfo, (VkCommandBufferInheritanceInfo*)(to->pInheritanceInfo));
     }
 }
 
 void deepcopy_VkBufferCopy(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBufferCopy* from,
     VkBufferCopy* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkImageSubresourceLayers(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageSubresourceLayers* from,
     VkImageSubresourceLayers* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkBufferImageCopy(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBufferImageCopy* from,
     VkBufferImageCopy* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
-    deepcopy_VkImageSubresourceLayers(pool, &from->imageSubresource, (VkImageSubresourceLayers*)(&to->imageSubresource));
-    deepcopy_VkOffset3D(pool, &from->imageOffset, (VkOffset3D*)(&to->imageOffset));
-    deepcopy_VkExtent3D(pool, &from->imageExtent, (VkExtent3D*)(&to->imageExtent));
+    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(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkClearColorValue* from,
     VkClearColorValue* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
     memcpy(to->float32, from->float32, 4 * sizeof(float));
     memcpy(to->int32, from->int32, 4 * sizeof(int32_t));
@@ -2166,123 +2561,143 @@
 }
 
 void deepcopy_VkClearDepthStencilValue(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkClearDepthStencilValue* from,
     VkClearDepthStencilValue* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkClearValue(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkClearValue* from,
     VkClearValue* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
-    deepcopy_VkClearColorValue(pool, &from->color, (VkClearColorValue*)(&to->color));
-    deepcopy_VkClearDepthStencilValue(pool, &from->depthStencil, (VkClearDepthStencilValue*)(&to->depthStencil));
+    deepcopy_VkClearColorValue(alloc, rootType, &from->color, (VkClearColorValue*)(&to->color));
+    deepcopy_VkClearDepthStencilValue(alloc, rootType, &from->depthStencil, (VkClearDepthStencilValue*)(&to->depthStencil));
 }
 
 void deepcopy_VkClearAttachment(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkClearAttachment* from,
     VkClearAttachment* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
-    deepcopy_VkClearValue(pool, &from->clearValue, (VkClearValue*)(&to->clearValue));
+    deepcopy_VkClearValue(alloc, rootType, &from->clearValue, (VkClearValue*)(&to->clearValue));
 }
 
 void deepcopy_VkClearRect(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkClearRect* from,
     VkClearRect* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
-    deepcopy_VkRect2D(pool, &from->rect, (VkRect2D*)(&to->rect));
+    deepcopy_VkRect2D(alloc, rootType, &from->rect, (VkRect2D*)(&to->rect));
 }
 
 void deepcopy_VkImageBlit(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageBlit* from,
     VkImageBlit* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
-    deepcopy_VkImageSubresourceLayers(pool, &from->srcSubresource, (VkImageSubresourceLayers*)(&to->srcSubresource));
+    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->srcSubresource, (VkImageSubresourceLayers*)(&to->srcSubresource));
     for (uint32_t i = 0; i < (uint32_t)2; ++i)
     {
-        deepcopy_VkOffset3D(pool, from->srcOffsets + i, (VkOffset3D*)(to->srcOffsets + i));
+        deepcopy_VkOffset3D(alloc, rootType, from->srcOffsets + i, (VkOffset3D*)(to->srcOffsets + i));
     }
-    deepcopy_VkImageSubresourceLayers(pool, &from->dstSubresource, (VkImageSubresourceLayers*)(&to->dstSubresource));
+    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->dstSubresource, (VkImageSubresourceLayers*)(&to->dstSubresource));
     for (uint32_t i = 0; i < (uint32_t)2; ++i)
     {
-        deepcopy_VkOffset3D(pool, from->dstOffsets + i, (VkOffset3D*)(to->dstOffsets + i));
+        deepcopy_VkOffset3D(alloc, rootType, from->dstOffsets + i, (VkOffset3D*)(to->dstOffsets + i));
     }
 }
 
 void deepcopy_VkImageCopy(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageCopy* from,
     VkImageCopy* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
-    deepcopy_VkImageSubresourceLayers(pool, &from->srcSubresource, (VkImageSubresourceLayers*)(&to->srcSubresource));
-    deepcopy_VkOffset3D(pool, &from->srcOffset, (VkOffset3D*)(&to->srcOffset));
-    deepcopy_VkImageSubresourceLayers(pool, &from->dstSubresource, (VkImageSubresourceLayers*)(&to->dstSubresource));
-    deepcopy_VkOffset3D(pool, &from->dstOffset, (VkOffset3D*)(&to->dstOffset));
-    deepcopy_VkExtent3D(pool, &from->extent, (VkExtent3D*)(&to->extent));
+    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_VkOffset3D(alloc, rootType, &from->dstOffset, (VkOffset3D*)(&to->dstOffset));
+    deepcopy_VkExtent3D(alloc, rootType, &from->extent, (VkExtent3D*)(&to->extent));
 }
 
 void deepcopy_VkImageResolve(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageResolve* from,
     VkImageResolve* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
-    deepcopy_VkImageSubresourceLayers(pool, &from->srcSubresource, (VkImageSubresourceLayers*)(&to->srcSubresource));
-    deepcopy_VkOffset3D(pool, &from->srcOffset, (VkOffset3D*)(&to->srcOffset));
-    deepcopy_VkImageSubresourceLayers(pool, &from->dstSubresource, (VkImageSubresourceLayers*)(&to->dstSubresource));
-    deepcopy_VkOffset3D(pool, &from->dstOffset, (VkOffset3D*)(&to->dstOffset));
-    deepcopy_VkExtent3D(pool, &from->extent, (VkExtent3D*)(&to->extent));
+    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_VkOffset3D(alloc, rootType, &from->dstOffset, (VkOffset3D*)(&to->dstOffset));
+    deepcopy_VkExtent3D(alloc, rootType, &from->extent, (VkExtent3D*)(&to->extent));
 }
 
 void deepcopy_VkRenderPassBeginInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRenderPassBeginInfo* from,
     VkRenderPassBeginInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkRect2D(pool, &from->renderArea, (VkRect2D*)(&to->renderArea));
+    deepcopy_VkRect2D(alloc, rootType, &from->renderArea, (VkRect2D*)(&to->renderArea));
     if (from)
     {
         to->pClearValues = nullptr;
         if (from->pClearValues)
         {
-            to->pClearValues = (VkClearValue*)pool->alloc(from->clearValueCount * sizeof(const VkClearValue));
+            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(pool, from->pClearValues + i, (VkClearValue*)(to->pClearValues + i));
+                deepcopy_VkClearValue(alloc, rootType, from->pClearValues + i, (VkClearValue*)(to->pClearValues + i));
             }
         }
     }
@@ -2291,1305 +2706,1629 @@
 #endif
 #ifdef VK_VERSION_1_1
 void deepcopy_VkPhysicalDeviceSubgroupProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceSubgroupProperties* from,
     VkPhysicalDeviceSubgroupProperties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkBindBufferMemoryInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBindBufferMemoryInfo* from,
     VkBindBufferMemoryInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkBindImageMemoryInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBindImageMemoryInfo* from,
     VkBindImageMemoryInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDevice16BitStorageFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDevice16BitStorageFeatures* from,
     VkPhysicalDevice16BitStorageFeatures* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkMemoryDedicatedRequirements(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryDedicatedRequirements* from,
     VkMemoryDedicatedRequirements* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkMemoryDedicatedAllocateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryDedicatedAllocateInfo* from,
     VkMemoryDedicatedAllocateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkMemoryAllocateFlagsInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryAllocateFlagsInfo* from,
     VkMemoryAllocateFlagsInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDeviceGroupRenderPassBeginInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceGroupRenderPassBeginInfo* from,
     VkDeviceGroupRenderPassBeginInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pDeviceRenderAreas = nullptr;
         if (from->pDeviceRenderAreas)
         {
-            to->pDeviceRenderAreas = (VkRect2D*)pool->alloc(from->deviceRenderAreaCount * sizeof(const VkRect2D));
+            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(pool, from->pDeviceRenderAreas + i, (VkRect2D*)(to->pDeviceRenderAreas + i));
+                deepcopy_VkRect2D(alloc, rootType, from->pDeviceRenderAreas + i, (VkRect2D*)(to->pDeviceRenderAreas + i));
             }
         }
     }
 }
 
 void deepcopy_VkDeviceGroupCommandBufferBeginInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceGroupCommandBufferBeginInfo* from,
     VkDeviceGroupCommandBufferBeginInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDeviceGroupSubmitInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceGroupSubmitInfo* from,
     VkDeviceGroupSubmitInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const 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*)pool->dupArray(from->pWaitSemaphoreDeviceIndices, from->waitSemaphoreCount * sizeof(const uint32_t));
+        to->pWaitSemaphoreDeviceIndices = (uint32_t*)alloc->dupArray(from->pWaitSemaphoreDeviceIndices, from->waitSemaphoreCount * sizeof(const uint32_t));
     }
     to->pCommandBufferDeviceMasks = nullptr;
     if (from->pCommandBufferDeviceMasks)
     {
-        to->pCommandBufferDeviceMasks = (uint32_t*)pool->dupArray(from->pCommandBufferDeviceMasks, from->commandBufferCount * sizeof(const uint32_t));
+        to->pCommandBufferDeviceMasks = (uint32_t*)alloc->dupArray(from->pCommandBufferDeviceMasks, from->commandBufferCount * sizeof(const uint32_t));
     }
     to->pSignalSemaphoreDeviceIndices = nullptr;
     if (from->pSignalSemaphoreDeviceIndices)
     {
-        to->pSignalSemaphoreDeviceIndices = (uint32_t*)pool->dupArray(from->pSignalSemaphoreDeviceIndices, from->signalSemaphoreCount * sizeof(const uint32_t));
+        to->pSignalSemaphoreDeviceIndices = (uint32_t*)alloc->dupArray(from->pSignalSemaphoreDeviceIndices, from->signalSemaphoreCount * sizeof(const uint32_t));
     }
 }
 
 void deepcopy_VkDeviceGroupBindSparseInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceGroupBindSparseInfo* from,
     VkDeviceGroupBindSparseInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkBindBufferMemoryDeviceGroupInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBindBufferMemoryDeviceGroupInfo* from,
     VkBindBufferMemoryDeviceGroupInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const 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*)pool->dupArray(from->pDeviceIndices, from->deviceIndexCount * sizeof(const uint32_t));
+        to->pDeviceIndices = (uint32_t*)alloc->dupArray(from->pDeviceIndices, from->deviceIndexCount * sizeof(const uint32_t));
     }
 }
 
 void deepcopy_VkBindImageMemoryDeviceGroupInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBindImageMemoryDeviceGroupInfo* from,
     VkBindImageMemoryDeviceGroupInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const 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*)pool->dupArray(from->pDeviceIndices, from->deviceIndexCount * sizeof(const uint32_t));
+        to->pDeviceIndices = (uint32_t*)alloc->dupArray(from->pDeviceIndices, from->deviceIndexCount * sizeof(const uint32_t));
     }
     if (from)
     {
         to->pSplitInstanceBindRegions = nullptr;
         if (from->pSplitInstanceBindRegions)
         {
-            to->pSplitInstanceBindRegions = (VkRect2D*)pool->alloc(from->splitInstanceBindRegionCount * sizeof(const VkRect2D));
+            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(pool, from->pSplitInstanceBindRegions + i, (VkRect2D*)(to->pSplitInstanceBindRegions + i));
+                deepcopy_VkRect2D(alloc, rootType, from->pSplitInstanceBindRegions + i, (VkRect2D*)(to->pSplitInstanceBindRegions + i));
             }
         }
     }
 }
 
 void deepcopy_VkPhysicalDeviceGroupProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceGroupProperties* from,
     VkPhysicalDeviceGroupProperties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        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));
 }
 
 void deepcopy_VkDeviceGroupDeviceCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceGroupDeviceCreateInfo* from,
     VkDeviceGroupDeviceCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pPhysicalDevices = nullptr;
     if (from->pPhysicalDevices)
     {
-        to->pPhysicalDevices = (VkPhysicalDevice*)pool->dupArray(from->pPhysicalDevices, from->physicalDeviceCount * sizeof(const VkPhysicalDevice));
+        to->pPhysicalDevices = (VkPhysicalDevice*)alloc->dupArray(from->pPhysicalDevices, from->physicalDeviceCount * sizeof(const VkPhysicalDevice));
     }
 }
 
 void deepcopy_VkBufferMemoryRequirementsInfo2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBufferMemoryRequirementsInfo2* from,
     VkBufferMemoryRequirementsInfo2* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkImageMemoryRequirementsInfo2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageMemoryRequirementsInfo2* from,
     VkImageMemoryRequirementsInfo2* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkImageSparseMemoryRequirementsInfo2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageSparseMemoryRequirementsInfo2* from,
     VkImageSparseMemoryRequirementsInfo2* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkMemoryRequirements2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryRequirements2* from,
     VkMemoryRequirements2* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkMemoryRequirements(pool, &from->memoryRequirements, (VkMemoryRequirements*)(&to->memoryRequirements));
+    deepcopy_VkMemoryRequirements(alloc, rootType, &from->memoryRequirements, (VkMemoryRequirements*)(&to->memoryRequirements));
 }
 
 void deepcopy_VkSparseImageMemoryRequirements2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSparseImageMemoryRequirements2* from,
     VkSparseImageMemoryRequirements2* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkSparseImageMemoryRequirements(pool, &from->memoryRequirements, (VkSparseImageMemoryRequirements*)(&to->memoryRequirements));
+    deepcopy_VkSparseImageMemoryRequirements(alloc, rootType, &from->memoryRequirements, (VkSparseImageMemoryRequirements*)(&to->memoryRequirements));
 }
 
 void deepcopy_VkPhysicalDeviceFeatures2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceFeatures2* from,
     VkPhysicalDeviceFeatures2* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkPhysicalDeviceFeatures(pool, &from->features, (VkPhysicalDeviceFeatures*)(&to->features));
+    deepcopy_VkPhysicalDeviceFeatures(alloc, rootType, &from->features, (VkPhysicalDeviceFeatures*)(&to->features));
 }
 
 void deepcopy_VkPhysicalDeviceProperties2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceProperties2* from,
     VkPhysicalDeviceProperties2* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkPhysicalDeviceProperties(pool, &from->properties, (VkPhysicalDeviceProperties*)(&to->properties));
+    deepcopy_VkPhysicalDeviceProperties(alloc, rootType, &from->properties, (VkPhysicalDeviceProperties*)(&to->properties));
 }
 
 void deepcopy_VkFormatProperties2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkFormatProperties2* from,
     VkFormatProperties2* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkFormatProperties(pool, &from->formatProperties, (VkFormatProperties*)(&to->formatProperties));
+    deepcopy_VkFormatProperties(alloc, rootType, &from->formatProperties, (VkFormatProperties*)(&to->formatProperties));
 }
 
 void deepcopy_VkImageFormatProperties2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageFormatProperties2* from,
     VkImageFormatProperties2* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkImageFormatProperties(pool, &from->imageFormatProperties, (VkImageFormatProperties*)(&to->imageFormatProperties));
+    deepcopy_VkImageFormatProperties(alloc, rootType, &from->imageFormatProperties, (VkImageFormatProperties*)(&to->imageFormatProperties));
 }
 
 void deepcopy_VkPhysicalDeviceImageFormatInfo2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageFormatInfo2* from,
     VkPhysicalDeviceImageFormatInfo2* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkQueueFamilyProperties2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkQueueFamilyProperties2* from,
     VkQueueFamilyProperties2* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkQueueFamilyProperties(pool, &from->queueFamilyProperties, (VkQueueFamilyProperties*)(&to->queueFamilyProperties));
+    deepcopy_VkQueueFamilyProperties(alloc, rootType, &from->queueFamilyProperties, (VkQueueFamilyProperties*)(&to->queueFamilyProperties));
 }
 
 void deepcopy_VkPhysicalDeviceMemoryProperties2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryProperties2* from,
     VkPhysicalDeviceMemoryProperties2* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkPhysicalDeviceMemoryProperties(pool, &from->memoryProperties, (VkPhysicalDeviceMemoryProperties*)(&to->memoryProperties));
+    deepcopy_VkPhysicalDeviceMemoryProperties(alloc, rootType, &from->memoryProperties, (VkPhysicalDeviceMemoryProperties*)(&to->memoryProperties));
 }
 
 void deepcopy_VkSparseImageFormatProperties2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSparseImageFormatProperties2* from,
     VkSparseImageFormatProperties2* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkSparseImageFormatProperties(pool, &from->properties, (VkSparseImageFormatProperties*)(&to->properties));
+    deepcopy_VkSparseImageFormatProperties(alloc, rootType, &from->properties, (VkSparseImageFormatProperties*)(&to->properties));
 }
 
 void deepcopy_VkPhysicalDeviceSparseImageFormatInfo2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceSparseImageFormatInfo2* from,
     VkPhysicalDeviceSparseImageFormatInfo2* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDevicePointClippingProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDevicePointClippingProperties* from,
     VkPhysicalDevicePointClippingProperties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkInputAttachmentAspectReference(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkInputAttachmentAspectReference* from,
     VkInputAttachmentAspectReference* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkRenderPassInputAttachmentAspectCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRenderPassInputAttachmentAspectCreateInfo* from,
     VkRenderPassInputAttachmentAspectCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pAspectReferences = nullptr;
         if (from->pAspectReferences)
         {
-            to->pAspectReferences = (VkInputAttachmentAspectReference*)pool->alloc(from->aspectReferenceCount * sizeof(const VkInputAttachmentAspectReference));
+            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(pool, from->pAspectReferences + i, (VkInputAttachmentAspectReference*)(to->pAspectReferences + i));
+                deepcopy_VkInputAttachmentAspectReference(alloc, rootType, from->pAspectReferences + i, (VkInputAttachmentAspectReference*)(to->pAspectReferences + i));
             }
         }
     }
 }
 
 void deepcopy_VkImageViewUsageCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageViewUsageCreateInfo* from,
     VkImageViewUsageCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineTessellationDomainOriginStateCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineTessellationDomainOriginStateCreateInfo* from,
     VkPipelineTessellationDomainOriginStateCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkRenderPassMultiviewCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRenderPassMultiviewCreateInfo* from,
     VkRenderPassMultiviewCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const 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*)pool->dupArray(from->pViewMasks, from->subpassCount * sizeof(const uint32_t));
+        to->pViewMasks = (uint32_t*)alloc->dupArray(from->pViewMasks, from->subpassCount * sizeof(const uint32_t));
     }
     to->pViewOffsets = nullptr;
     if (from->pViewOffsets)
     {
-        to->pViewOffsets = (int32_t*)pool->dupArray(from->pViewOffsets, from->dependencyCount * sizeof(const int32_t));
+        to->pViewOffsets = (int32_t*)alloc->dupArray(from->pViewOffsets, from->dependencyCount * sizeof(const int32_t));
     }
     to->pCorrelationMasks = nullptr;
     if (from->pCorrelationMasks)
     {
-        to->pCorrelationMasks = (uint32_t*)pool->dupArray(from->pCorrelationMasks, from->correlationMaskCount * sizeof(const uint32_t));
+        to->pCorrelationMasks = (uint32_t*)alloc->dupArray(from->pCorrelationMasks, from->correlationMaskCount * sizeof(const uint32_t));
     }
 }
 
 void deepcopy_VkPhysicalDeviceMultiviewFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceMultiviewFeatures* from,
     VkPhysicalDeviceMultiviewFeatures* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceMultiviewProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceMultiviewProperties* from,
     VkPhysicalDeviceMultiviewProperties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceVariablePointersFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceVariablePointersFeatures* from,
     VkPhysicalDeviceVariablePointersFeatures* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceProtectedMemoryFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceProtectedMemoryFeatures* from,
     VkPhysicalDeviceProtectedMemoryFeatures* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceProtectedMemoryProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceProtectedMemoryProperties* from,
     VkPhysicalDeviceProtectedMemoryProperties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDeviceQueueInfo2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceQueueInfo2* from,
     VkDeviceQueueInfo2* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkProtectedSubmitInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkProtectedSubmitInfo* from,
     VkProtectedSubmitInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkSamplerYcbcrConversionCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSamplerYcbcrConversionCreateInfo* from,
     VkSamplerYcbcrConversionCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkComponentMapping(pool, &from->components, (VkComponentMapping*)(&to->components));
+    deepcopy_VkComponentMapping(alloc, rootType, &from->components, (VkComponentMapping*)(&to->components));
 }
 
 void deepcopy_VkSamplerYcbcrConversionInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSamplerYcbcrConversionInfo* from,
     VkSamplerYcbcrConversionInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkBindImagePlaneMemoryInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBindImagePlaneMemoryInfo* from,
     VkBindImagePlaneMemoryInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkImagePlaneMemoryRequirementsInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImagePlaneMemoryRequirementsInfo* from,
     VkImagePlaneMemoryRequirementsInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceSamplerYcbcrConversionFeatures* from,
     VkPhysicalDeviceSamplerYcbcrConversionFeatures* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkSamplerYcbcrConversionImageFormatProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSamplerYcbcrConversionImageFormatProperties* from,
     VkSamplerYcbcrConversionImageFormatProperties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDescriptorUpdateTemplateEntry(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorUpdateTemplateEntry* from,
     VkDescriptorUpdateTemplateEntry* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkDescriptorUpdateTemplateCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorUpdateTemplateCreateInfo* from,
     VkDescriptorUpdateTemplateCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pDescriptorUpdateEntries = nullptr;
         if (from->pDescriptorUpdateEntries)
         {
-            to->pDescriptorUpdateEntries = (VkDescriptorUpdateTemplateEntry*)pool->alloc(from->descriptorUpdateEntryCount * sizeof(const VkDescriptorUpdateTemplateEntry));
+            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(pool, from->pDescriptorUpdateEntries + i, (VkDescriptorUpdateTemplateEntry*)(to->pDescriptorUpdateEntries + i));
+                deepcopy_VkDescriptorUpdateTemplateEntry(alloc, rootType, from->pDescriptorUpdateEntries + i, (VkDescriptorUpdateTemplateEntry*)(to->pDescriptorUpdateEntries + i));
             }
         }
     }
 }
 
 void deepcopy_VkExternalMemoryProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExternalMemoryProperties* from,
     VkExternalMemoryProperties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkPhysicalDeviceExternalImageFormatInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalImageFormatInfo* from,
     VkPhysicalDeviceExternalImageFormatInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkExternalImageFormatProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExternalImageFormatProperties* from,
     VkExternalImageFormatProperties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkExternalMemoryProperties(pool, &from->externalMemoryProperties, (VkExternalMemoryProperties*)(&to->externalMemoryProperties));
+    deepcopy_VkExternalMemoryProperties(alloc, rootType, &from->externalMemoryProperties, (VkExternalMemoryProperties*)(&to->externalMemoryProperties));
 }
 
 void deepcopy_VkPhysicalDeviceExternalBufferInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalBufferInfo* from,
     VkPhysicalDeviceExternalBufferInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkExternalBufferProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExternalBufferProperties* from,
     VkExternalBufferProperties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkExternalMemoryProperties(pool, &from->externalMemoryProperties, (VkExternalMemoryProperties*)(&to->externalMemoryProperties));
+    deepcopy_VkExternalMemoryProperties(alloc, rootType, &from->externalMemoryProperties, (VkExternalMemoryProperties*)(&to->externalMemoryProperties));
 }
 
 void deepcopy_VkPhysicalDeviceIDProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceIDProperties* from,
     VkPhysicalDeviceIDProperties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     memcpy(to->deviceUUID, from->deviceUUID, VK_UUID_SIZE * sizeof(uint8_t));
     memcpy(to->driverUUID, from->driverUUID, VK_UUID_SIZE * sizeof(uint8_t));
@@ -3597,312 +4336,396 @@
 }
 
 void deepcopy_VkExternalMemoryImageCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExternalMemoryImageCreateInfo* from,
     VkExternalMemoryImageCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkExternalMemoryBufferCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExternalMemoryBufferCreateInfo* from,
     VkExternalMemoryBufferCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkExportMemoryAllocateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExportMemoryAllocateInfo* from,
     VkExportMemoryAllocateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceExternalFenceInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalFenceInfo* from,
     VkPhysicalDeviceExternalFenceInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkExternalFenceProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExternalFenceProperties* from,
     VkExternalFenceProperties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkExportFenceCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExportFenceCreateInfo* from,
     VkExportFenceCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkExportSemaphoreCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExportSemaphoreCreateInfo* from,
     VkExportSemaphoreCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceExternalSemaphoreInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalSemaphoreInfo* from,
     VkPhysicalDeviceExternalSemaphoreInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkExternalSemaphoreProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExternalSemaphoreProperties* from,
     VkExternalSemaphoreProperties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceMaintenance3Properties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceMaintenance3Properties* from,
     VkPhysicalDeviceMaintenance3Properties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDescriptorSetLayoutSupport(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutSupport* from,
     VkDescriptorSetLayoutSupport* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceShaderDrawParametersFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderDrawParametersFeatures* from,
     VkPhysicalDeviceShaderDrawParametersFeatures* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_VERSION_1_2
 void deepcopy_VkPhysicalDeviceVulkan11Features(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan11Features* from,
     VkPhysicalDeviceVulkan11Features* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceVulkan11Properties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan11Properties* from,
     VkPhysicalDeviceVulkan11Properties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     memcpy(to->deviceUUID, from->deviceUUID, VK_UUID_SIZE * sizeof(uint8_t));
     memcpy(to->driverUUID, from->driverUUID, VK_UUID_SIZE * sizeof(uint8_t));
@@ -3910,162 +4733,200 @@
 }
 
 void deepcopy_VkPhysicalDeviceVulkan12Features(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan12Features* from,
     VkPhysicalDeviceVulkan12Features* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkConformanceVersion(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkConformanceVersion* from,
     VkConformanceVersion* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkPhysicalDeviceVulkan12Properties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan12Properties* from,
     VkPhysicalDeviceVulkan12Properties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        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(pool, &from->conformanceVersion, (VkConformanceVersion*)(&to->conformanceVersion));
+    deepcopy_VkConformanceVersion(alloc, rootType, &from->conformanceVersion, (VkConformanceVersion*)(&to->conformanceVersion));
 }
 
 void deepcopy_VkImageFormatListCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageFormatListCreateInfo* from,
     VkImageFormatListCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pViewFormats = nullptr;
     if (from->pViewFormats)
     {
-        to->pViewFormats = (VkFormat*)pool->dupArray(from->pViewFormats, from->viewFormatCount * sizeof(const VkFormat));
+        to->pViewFormats = (VkFormat*)alloc->dupArray(from->pViewFormats, from->viewFormatCount * sizeof(const VkFormat));
     }
 }
 
 void deepcopy_VkAttachmentDescription2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAttachmentDescription2* from,
     VkAttachmentDescription2* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkAttachmentReference2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAttachmentReference2* from,
     VkAttachmentReference2* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkSubpassDescription2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSubpassDescription2* from,
     VkSubpassDescription2* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pInputAttachments = nullptr;
         if (from->pInputAttachments)
         {
-            to->pInputAttachments = (VkAttachmentReference2*)pool->alloc(from->inputAttachmentCount * sizeof(const VkAttachmentReference2));
+            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(pool, from->pInputAttachments + i, (VkAttachmentReference2*)(to->pInputAttachments + i));
+                deepcopy_VkAttachmentReference2(alloc, rootType, from->pInputAttachments + i, (VkAttachmentReference2*)(to->pInputAttachments + i));
             }
         }
     }
@@ -4074,11 +4935,11 @@
         to->pColorAttachments = nullptr;
         if (from->pColorAttachments)
         {
-            to->pColorAttachments = (VkAttachmentReference2*)pool->alloc(from->colorAttachmentCount * sizeof(const VkAttachmentReference2));
+            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(pool, from->pColorAttachments + i, (VkAttachmentReference2*)(to->pColorAttachments + i));
+                deepcopy_VkAttachmentReference2(alloc, rootType, from->pColorAttachments + i, (VkAttachmentReference2*)(to->pColorAttachments + i));
             }
         }
     }
@@ -4087,79 +4948,91 @@
         to->pResolveAttachments = nullptr;
         if (from->pResolveAttachments)
         {
-            to->pResolveAttachments = (VkAttachmentReference2*)pool->alloc(from->colorAttachmentCount * sizeof(const VkAttachmentReference2));
+            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(pool, from->pResolveAttachments + i, (VkAttachmentReference2*)(to->pResolveAttachments + i));
+                deepcopy_VkAttachmentReference2(alloc, rootType, from->pResolveAttachments + i, (VkAttachmentReference2*)(to->pResolveAttachments + i));
             }
         }
     }
     to->pDepthStencilAttachment = nullptr;
     if (from->pDepthStencilAttachment)
     {
-        to->pDepthStencilAttachment = (VkAttachmentReference2*)pool->alloc(sizeof(const VkAttachmentReference2));
-        deepcopy_VkAttachmentReference2(pool, from->pDepthStencilAttachment, (VkAttachmentReference2*)(to->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*)pool->dupArray(from->pPreserveAttachments, from->preserveAttachmentCount * sizeof(const uint32_t));
+        to->pPreserveAttachments = (uint32_t*)alloc->dupArray(from->pPreserveAttachments, from->preserveAttachmentCount * sizeof(const uint32_t));
     }
 }
 
 void deepcopy_VkSubpassDependency2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSubpassDependency2* from,
     VkSubpassDependency2* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkRenderPassCreateInfo2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRenderPassCreateInfo2* from,
     VkRenderPassCreateInfo2* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pAttachments = nullptr;
         if (from->pAttachments)
         {
-            to->pAttachments = (VkAttachmentDescription2*)pool->alloc(from->attachmentCount * sizeof(const VkAttachmentDescription2));
+            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(pool, from->pAttachments + i, (VkAttachmentDescription2*)(to->pAttachments + i));
+                deepcopy_VkAttachmentDescription2(alloc, rootType, from->pAttachments + i, (VkAttachmentDescription2*)(to->pAttachments + i));
             }
         }
     }
@@ -4168,11 +5041,11 @@
         to->pSubpasses = nullptr;
         if (from->pSubpasses)
         {
-            to->pSubpasses = (VkSubpassDescription2*)pool->alloc(from->subpassCount * sizeof(const VkSubpassDescription2));
+            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(pool, from->pSubpasses + i, (VkSubpassDescription2*)(to->pSubpasses + i));
+                deepcopy_VkSubpassDescription2(alloc, rootType, from->pSubpasses + i, (VkSubpassDescription2*)(to->pSubpasses + i));
             }
         }
     }
@@ -4181,1474 +5054,1824 @@
         to->pDependencies = nullptr;
         if (from->pDependencies)
         {
-            to->pDependencies = (VkSubpassDependency2*)pool->alloc(from->dependencyCount * sizeof(const VkSubpassDependency2));
+            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(pool, from->pDependencies + i, (VkSubpassDependency2*)(to->pDependencies + i));
+                deepcopy_VkSubpassDependency2(alloc, rootType, from->pDependencies + i, (VkSubpassDependency2*)(to->pDependencies + i));
             }
         }
     }
     to->pCorrelatedViewMasks = nullptr;
     if (from->pCorrelatedViewMasks)
     {
-        to->pCorrelatedViewMasks = (uint32_t*)pool->dupArray(from->pCorrelatedViewMasks, from->correlatedViewMaskCount * sizeof(const uint32_t));
+        to->pCorrelatedViewMasks = (uint32_t*)alloc->dupArray(from->pCorrelatedViewMasks, from->correlatedViewMaskCount * sizeof(const uint32_t));
     }
 }
 
 void deepcopy_VkSubpassBeginInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSubpassBeginInfo* from,
     VkSubpassBeginInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkSubpassEndInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSubpassEndInfo* from,
     VkSubpassEndInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDevice8BitStorageFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDevice8BitStorageFeatures* from,
     VkPhysicalDevice8BitStorageFeatures* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceDriverProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceDriverProperties* from,
     VkPhysicalDeviceDriverProperties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        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(pool, &from->conformanceVersion, (VkConformanceVersion*)(&to->conformanceVersion));
+    deepcopy_VkConformanceVersion(alloc, rootType, &from->conformanceVersion, (VkConformanceVersion*)(&to->conformanceVersion));
 }
 
 void deepcopy_VkPhysicalDeviceShaderAtomicInt64Features(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderAtomicInt64Features* from,
     VkPhysicalDeviceShaderAtomicInt64Features* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceShaderFloat16Int8Features(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderFloat16Int8Features* from,
     VkPhysicalDeviceShaderFloat16Int8Features* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceFloatControlsProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceFloatControlsProperties* from,
     VkPhysicalDeviceFloatControlsProperties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDescriptorSetLayoutBindingFlagsCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutBindingFlagsCreateInfo* from,
     VkDescriptorSetLayoutBindingFlagsCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pBindingFlags = nullptr;
     if (from->pBindingFlags)
     {
-        to->pBindingFlags = (VkDescriptorBindingFlags*)pool->dupArray(from->pBindingFlags, from->bindingCount * sizeof(const VkDescriptorBindingFlags));
+        to->pBindingFlags = (VkDescriptorBindingFlags*)alloc->dupArray(from->pBindingFlags, from->bindingCount * sizeof(const VkDescriptorBindingFlags));
     }
 }
 
 void deepcopy_VkPhysicalDeviceDescriptorIndexingFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceDescriptorIndexingFeatures* from,
     VkPhysicalDeviceDescriptorIndexingFeatures* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceDescriptorIndexingProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceDescriptorIndexingProperties* from,
     VkPhysicalDeviceDescriptorIndexingProperties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDescriptorSetVariableDescriptorCountAllocateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorSetVariableDescriptorCountAllocateInfo* from,
     VkDescriptorSetVariableDescriptorCountAllocateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const 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*)pool->dupArray(from->pDescriptorCounts, from->descriptorSetCount * sizeof(const uint32_t));
+        to->pDescriptorCounts = (uint32_t*)alloc->dupArray(from->pDescriptorCounts, from->descriptorSetCount * sizeof(const uint32_t));
     }
 }
 
 void deepcopy_VkDescriptorSetVariableDescriptorCountLayoutSupport(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorSetVariableDescriptorCountLayoutSupport* from,
     VkDescriptorSetVariableDescriptorCountLayoutSupport* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkSubpassDescriptionDepthStencilResolve(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSubpassDescriptionDepthStencilResolve* from,
     VkSubpassDescriptionDepthStencilResolve* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pDepthStencilResolveAttachment = nullptr;
     if (from->pDepthStencilResolveAttachment)
     {
-        to->pDepthStencilResolveAttachment = (VkAttachmentReference2*)pool->alloc(sizeof(const VkAttachmentReference2));
-        deepcopy_VkAttachmentReference2(pool, from->pDepthStencilResolveAttachment, (VkAttachmentReference2*)(to->pDepthStencilResolveAttachment));
+        to->pDepthStencilResolveAttachment = (VkAttachmentReference2*)alloc->alloc(sizeof(const VkAttachmentReference2));
+        deepcopy_VkAttachmentReference2(alloc, rootType, from->pDepthStencilResolveAttachment, (VkAttachmentReference2*)(to->pDepthStencilResolveAttachment));
     }
 }
 
 void deepcopy_VkPhysicalDeviceDepthStencilResolveProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceDepthStencilResolveProperties* from,
     VkPhysicalDeviceDepthStencilResolveProperties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceScalarBlockLayoutFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceScalarBlockLayoutFeatures* from,
     VkPhysicalDeviceScalarBlockLayoutFeatures* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkImageStencilUsageCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageStencilUsageCreateInfo* from,
     VkImageStencilUsageCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkSamplerReductionModeCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSamplerReductionModeCreateInfo* from,
     VkSamplerReductionModeCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceSamplerFilterMinmaxProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceSamplerFilterMinmaxProperties* from,
     VkPhysicalDeviceSamplerFilterMinmaxProperties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceVulkanMemoryModelFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkanMemoryModelFeatures* from,
     VkPhysicalDeviceVulkanMemoryModelFeatures* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceImagelessFramebufferFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceImagelessFramebufferFeatures* from,
     VkPhysicalDeviceImagelessFramebufferFeatures* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkFramebufferAttachmentImageInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkFramebufferAttachmentImageInfo* from,
     VkFramebufferAttachmentImageInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pViewFormats = nullptr;
     if (from->pViewFormats)
     {
-        to->pViewFormats = (VkFormat*)pool->dupArray(from->pViewFormats, from->viewFormatCount * sizeof(const VkFormat));
+        to->pViewFormats = (VkFormat*)alloc->dupArray(from->pViewFormats, from->viewFormatCount * sizeof(const VkFormat));
     }
 }
 
 void deepcopy_VkFramebufferAttachmentsCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkFramebufferAttachmentsCreateInfo* from,
     VkFramebufferAttachmentsCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pAttachmentImageInfos = nullptr;
         if (from->pAttachmentImageInfos)
         {
-            to->pAttachmentImageInfos = (VkFramebufferAttachmentImageInfo*)pool->alloc(from->attachmentImageInfoCount * sizeof(const VkFramebufferAttachmentImageInfo));
+            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(pool, from->pAttachmentImageInfos + i, (VkFramebufferAttachmentImageInfo*)(to->pAttachmentImageInfos + i));
+                deepcopy_VkFramebufferAttachmentImageInfo(alloc, rootType, from->pAttachmentImageInfos + i, (VkFramebufferAttachmentImageInfo*)(to->pAttachmentImageInfos + i));
             }
         }
     }
 }
 
 void deepcopy_VkRenderPassAttachmentBeginInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRenderPassAttachmentBeginInfo* from,
     VkRenderPassAttachmentBeginInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pAttachments = nullptr;
     if (from->pAttachments)
     {
-        to->pAttachments = (VkImageView*)pool->dupArray(from->pAttachments, from->attachmentCount * sizeof(const VkImageView));
+        to->pAttachments = (VkImageView*)alloc->dupArray(from->pAttachments, from->attachmentCount * sizeof(const VkImageView));
     }
 }
 
 void deepcopy_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceUniformBufferStandardLayoutFeatures* from,
     VkPhysicalDeviceUniformBufferStandardLayoutFeatures* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* from,
     VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* from,
     VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkAttachmentReferenceStencilLayout(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAttachmentReferenceStencilLayout* from,
     VkAttachmentReferenceStencilLayout* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkAttachmentDescriptionStencilLayout(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAttachmentDescriptionStencilLayout* from,
     VkAttachmentDescriptionStencilLayout* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceHostQueryResetFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceHostQueryResetFeatures* from,
     VkPhysicalDeviceHostQueryResetFeatures* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceTimelineSemaphoreFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceTimelineSemaphoreFeatures* from,
     VkPhysicalDeviceTimelineSemaphoreFeatures* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceTimelineSemaphoreProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceTimelineSemaphoreProperties* from,
     VkPhysicalDeviceTimelineSemaphoreProperties* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkSemaphoreTypeCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSemaphoreTypeCreateInfo* from,
     VkSemaphoreTypeCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkTimelineSemaphoreSubmitInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkTimelineSemaphoreSubmitInfo* from,
     VkTimelineSemaphoreSubmitInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const 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*)pool->dupArray(from->pWaitSemaphoreValues, from->waitSemaphoreValueCount * sizeof(const uint64_t));
+        to->pWaitSemaphoreValues = (uint64_t*)alloc->dupArray(from->pWaitSemaphoreValues, from->waitSemaphoreValueCount * sizeof(const uint64_t));
     }
     to->pSignalSemaphoreValues = nullptr;
     if (from->pSignalSemaphoreValues)
     {
-        to->pSignalSemaphoreValues = (uint64_t*)pool->dupArray(from->pSignalSemaphoreValues, from->signalSemaphoreValueCount * sizeof(const uint64_t));
+        to->pSignalSemaphoreValues = (uint64_t*)alloc->dupArray(from->pSignalSemaphoreValues, from->signalSemaphoreValueCount * sizeof(const uint64_t));
     }
 }
 
 void deepcopy_VkSemaphoreWaitInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSemaphoreWaitInfo* from,
     VkSemaphoreWaitInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pSemaphores = nullptr;
     if (from->pSemaphores)
     {
-        to->pSemaphores = (VkSemaphore*)pool->dupArray(from->pSemaphores, from->semaphoreCount * sizeof(const VkSemaphore));
+        to->pSemaphores = (VkSemaphore*)alloc->dupArray(from->pSemaphores, from->semaphoreCount * sizeof(const VkSemaphore));
     }
     to->pValues = nullptr;
     if (from->pValues)
     {
-        to->pValues = (uint64_t*)pool->dupArray(from->pValues, from->semaphoreCount * sizeof(const uint64_t));
+        to->pValues = (uint64_t*)alloc->dupArray(from->pValues, from->semaphoreCount * sizeof(const uint64_t));
     }
 }
 
 void deepcopy_VkSemaphoreSignalInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSemaphoreSignalInfo* from,
     VkSemaphoreSignalInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceBufferDeviceAddressFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceBufferDeviceAddressFeatures* from,
     VkPhysicalDeviceBufferDeviceAddressFeatures* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkBufferDeviceAddressInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBufferDeviceAddressInfo* from,
     VkBufferDeviceAddressInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkBufferOpaqueCaptureAddressCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBufferOpaqueCaptureAddressCreateInfo* from,
     VkBufferOpaqueCaptureAddressCreateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkMemoryOpaqueCaptureAddressAllocateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryOpaqueCaptureAddressAllocateInfo* from,
     VkMemoryOpaqueCaptureAddressAllocateInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDeviceMemoryOpaqueCaptureAddressInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceMemoryOpaqueCaptureAddressInfo* from,
     VkDeviceMemoryOpaqueCaptureAddressInfo* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_surface
 void deepcopy_VkSurfaceCapabilitiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSurfaceCapabilitiesKHR* from,
     VkSurfaceCapabilitiesKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
-    deepcopy_VkExtent2D(pool, &from->currentExtent, (VkExtent2D*)(&to->currentExtent));
-    deepcopy_VkExtent2D(pool, &from->minImageExtent, (VkExtent2D*)(&to->minImageExtent));
-    deepcopy_VkExtent2D(pool, &from->maxImageExtent, (VkExtent2D*)(&to->maxImageExtent));
+    deepcopy_VkExtent2D(alloc, rootType, &from->currentExtent, (VkExtent2D*)(&to->currentExtent));
+    deepcopy_VkExtent2D(alloc, rootType, &from->minImageExtent, (VkExtent2D*)(&to->minImageExtent));
+    deepcopy_VkExtent2D(alloc, rootType, &from->maxImageExtent, (VkExtent2D*)(&to->maxImageExtent));
 }
 
 void deepcopy_VkSurfaceFormatKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSurfaceFormatKHR* from,
     VkSurfaceFormatKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 #endif
 #ifdef VK_KHR_swapchain
 void deepcopy_VkSwapchainCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSwapchainCreateInfoKHR* from,
     VkSwapchainCreateInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkExtent2D(pool, &from->imageExtent, (VkExtent2D*)(&to->imageExtent));
+    deepcopy_VkExtent2D(alloc, rootType, &from->imageExtent, (VkExtent2D*)(&to->imageExtent));
     to->pQueueFamilyIndices = nullptr;
     if (from->pQueueFamilyIndices)
     {
-        to->pQueueFamilyIndices = (uint32_t*)pool->dupArray(from->pQueueFamilyIndices, from->queueFamilyIndexCount * sizeof(const uint32_t));
+        to->pQueueFamilyIndices = (uint32_t*)alloc->dupArray(from->pQueueFamilyIndices, from->queueFamilyIndexCount * sizeof(const uint32_t));
     }
 }
 
 void deepcopy_VkPresentInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPresentInfoKHR* from,
     VkPresentInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pWaitSemaphores = nullptr;
     if (from->pWaitSemaphores)
     {
-        to->pWaitSemaphores = (VkSemaphore*)pool->dupArray(from->pWaitSemaphores, from->waitSemaphoreCount * sizeof(const VkSemaphore));
+        to->pWaitSemaphores = (VkSemaphore*)alloc->dupArray(from->pWaitSemaphores, from->waitSemaphoreCount * sizeof(const VkSemaphore));
     }
     to->pSwapchains = nullptr;
     if (from->pSwapchains)
     {
-        to->pSwapchains = (VkSwapchainKHR*)pool->dupArray(from->pSwapchains, from->swapchainCount * sizeof(const VkSwapchainKHR));
+        to->pSwapchains = (VkSwapchainKHR*)alloc->dupArray(from->pSwapchains, from->swapchainCount * sizeof(const VkSwapchainKHR));
     }
     to->pImageIndices = nullptr;
     if (from->pImageIndices)
     {
-        to->pImageIndices = (uint32_t*)pool->dupArray(from->pImageIndices, from->swapchainCount * sizeof(const uint32_t));
+        to->pImageIndices = (uint32_t*)alloc->dupArray(from->pImageIndices, from->swapchainCount * sizeof(const uint32_t));
     }
     to->pResults = nullptr;
     if (from->pResults)
     {
-        to->pResults = (VkResult*)pool->dupArray(from->pResults, from->swapchainCount * sizeof(VkResult));
+        to->pResults = (VkResult*)alloc->dupArray(from->pResults, from->swapchainCount * sizeof(VkResult));
     }
 }
 
 void deepcopy_VkImageSwapchainCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageSwapchainCreateInfoKHR* from,
     VkImageSwapchainCreateInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkBindImageMemorySwapchainInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBindImageMemorySwapchainInfoKHR* from,
     VkBindImageMemorySwapchainInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkAcquireNextImageInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAcquireNextImageInfoKHR* from,
     VkAcquireNextImageInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDeviceGroupPresentCapabilitiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceGroupPresentCapabilitiesKHR* from,
     VkDeviceGroupPresentCapabilitiesKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const 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(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceGroupPresentInfoKHR* from,
     VkDeviceGroupPresentInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const 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*)pool->dupArray(from->pDeviceMasks, from->swapchainCount * sizeof(const uint32_t));
+        to->pDeviceMasks = (uint32_t*)alloc->dupArray(from->pDeviceMasks, from->swapchainCount * sizeof(const uint32_t));
     }
 }
 
 void deepcopy_VkDeviceGroupSwapchainCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceGroupSwapchainCreateInfoKHR* from,
     VkDeviceGroupSwapchainCreateInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_display
 void deepcopy_VkDisplayModeParametersKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayModeParametersKHR* from,
     VkDisplayModeParametersKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
-    deepcopy_VkExtent2D(pool, &from->visibleRegion, (VkExtent2D*)(&to->visibleRegion));
+    deepcopy_VkExtent2D(alloc, rootType, &from->visibleRegion, (VkExtent2D*)(&to->visibleRegion));
 }
 
 void deepcopy_VkDisplayModeCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayModeCreateInfoKHR* from,
     VkDisplayModeCreateInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkDisplayModeParametersKHR(pool, &from->parameters, (VkDisplayModeParametersKHR*)(&to->parameters));
+    deepcopy_VkDisplayModeParametersKHR(alloc, rootType, &from->parameters, (VkDisplayModeParametersKHR*)(&to->parameters));
 }
 
 void deepcopy_VkDisplayModePropertiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayModePropertiesKHR* from,
     VkDisplayModePropertiesKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
-    deepcopy_VkDisplayModeParametersKHR(pool, &from->parameters, (VkDisplayModeParametersKHR*)(&to->parameters));
+    deepcopy_VkDisplayModeParametersKHR(alloc, rootType, &from->parameters, (VkDisplayModeParametersKHR*)(&to->parameters));
 }
 
 void deepcopy_VkDisplayPlaneCapabilitiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayPlaneCapabilitiesKHR* from,
     VkDisplayPlaneCapabilitiesKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
-    deepcopy_VkOffset2D(pool, &from->minSrcPosition, (VkOffset2D*)(&to->minSrcPosition));
-    deepcopy_VkOffset2D(pool, &from->maxSrcPosition, (VkOffset2D*)(&to->maxSrcPosition));
-    deepcopy_VkExtent2D(pool, &from->minSrcExtent, (VkExtent2D*)(&to->minSrcExtent));
-    deepcopy_VkExtent2D(pool, &from->maxSrcExtent, (VkExtent2D*)(&to->maxSrcExtent));
-    deepcopy_VkOffset2D(pool, &from->minDstPosition, (VkOffset2D*)(&to->minDstPosition));
-    deepcopy_VkOffset2D(pool, &from->maxDstPosition, (VkOffset2D*)(&to->maxDstPosition));
-    deepcopy_VkExtent2D(pool, &from->minDstExtent, (VkExtent2D*)(&to->minDstExtent));
-    deepcopy_VkExtent2D(pool, &from->maxDstExtent, (VkExtent2D*)(&to->maxDstExtent));
+    deepcopy_VkOffset2D(alloc, rootType, &from->minSrcPosition, (VkOffset2D*)(&to->minSrcPosition));
+    deepcopy_VkOffset2D(alloc, rootType, &from->maxSrcPosition, (VkOffset2D*)(&to->maxSrcPosition));
+    deepcopy_VkExtent2D(alloc, rootType, &from->minSrcExtent, (VkExtent2D*)(&to->minSrcExtent));
+    deepcopy_VkExtent2D(alloc, rootType, &from->maxSrcExtent, (VkExtent2D*)(&to->maxSrcExtent));
+    deepcopy_VkOffset2D(alloc, rootType, &from->minDstPosition, (VkOffset2D*)(&to->minDstPosition));
+    deepcopy_VkOffset2D(alloc, rootType, &from->maxDstPosition, (VkOffset2D*)(&to->maxDstPosition));
+    deepcopy_VkExtent2D(alloc, rootType, &from->minDstExtent, (VkExtent2D*)(&to->minDstExtent));
+    deepcopy_VkExtent2D(alloc, rootType, &from->maxDstExtent, (VkExtent2D*)(&to->maxDstExtent));
 }
 
 void deepcopy_VkDisplayPlanePropertiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayPlanePropertiesKHR* from,
     VkDisplayPlanePropertiesKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkDisplayPropertiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayPropertiesKHR* from,
     VkDisplayPropertiesKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
     to->displayName = nullptr;
     if (from->displayName)
     {
-        to->displayName = pool->strDup(from->displayName);
+        to->displayName = alloc->strDup(from->displayName);
     }
-    deepcopy_VkExtent2D(pool, &from->physicalDimensions, (VkExtent2D*)(&to->physicalDimensions));
-    deepcopy_VkExtent2D(pool, &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(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplaySurfaceCreateInfoKHR* from,
     VkDisplaySurfaceCreateInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkExtent2D(pool, &from->imageExtent, (VkExtent2D*)(&to->imageExtent));
+    deepcopy_VkExtent2D(alloc, rootType, &from->imageExtent, (VkExtent2D*)(&to->imageExtent));
 }
 
 #endif
 #ifdef VK_KHR_display_swapchain
 void deepcopy_VkDisplayPresentInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayPresentInfoKHR* from,
     VkDisplayPresentInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkRect2D(pool, &from->srcRect, (VkRect2D*)(&to->srcRect));
-    deepcopy_VkRect2D(pool, &from->dstRect, (VkRect2D*)(&to->dstRect));
+    deepcopy_VkRect2D(alloc, rootType, &from->srcRect, (VkRect2D*)(&to->srcRect));
+    deepcopy_VkRect2D(alloc, rootType, &from->dstRect, (VkRect2D*)(&to->dstRect));
 }
 
 #endif
 #ifdef VK_KHR_xlib_surface
 void deepcopy_VkXlibSurfaceCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkXlibSurfaceCreateInfoKHR* from,
     VkXlibSurfaceCreateInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->dpy = nullptr;
     if (from->dpy)
     {
-        to->dpy = (Display*)pool->dupArray(from->dpy, sizeof(Display));
+        to->dpy = (Display*)alloc->dupArray(from->dpy, sizeof(Display));
     }
 }
 
 #endif
 #ifdef VK_KHR_xcb_surface
 void deepcopy_VkXcbSurfaceCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkXcbSurfaceCreateInfoKHR* from,
     VkXcbSurfaceCreateInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const 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*)pool->dupArray(from->connection, sizeof(xcb_connection_t));
+        to->connection = (xcb_connection_t*)alloc->dupArray(from->connection, sizeof(xcb_connection_t));
     }
 }
 
 #endif
 #ifdef VK_KHR_wayland_surface
 void deepcopy_VkWaylandSurfaceCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkWaylandSurfaceCreateInfoKHR* from,
     VkWaylandSurfaceCreateInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->display = nullptr;
     if (from->display)
     {
-        to->display = (wl_display*)pool->dupArray(from->display, sizeof(wl_display));
+        to->display = (wl_display*)alloc->dupArray(from->display, sizeof(wl_display));
     }
     to->surface = nullptr;
     if (from->surface)
     {
-        to->surface = (wl_surface*)pool->dupArray(from->surface, sizeof(wl_surface));
+        to->surface = (wl_surface*)alloc->dupArray(from->surface, sizeof(wl_surface));
     }
 }
 
 #endif
 #ifdef VK_KHR_android_surface
 void deepcopy_VkAndroidSurfaceCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAndroidSurfaceCreateInfoKHR* from,
     VkAndroidSurfaceCreateInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->window = nullptr;
     if (from->window)
     {
-        to->window = (ANativeWindow*)pool->dupArray(from->window, sizeof(ANativeWindow));
+        to->window = (ANativeWindow*)alloc->dupArray(from->window, sizeof(ANativeWindow));
     }
 }
 
 #endif
 #ifdef VK_KHR_win32_surface
 void deepcopy_VkWin32SurfaceCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkWin32SurfaceCreateInfoKHR* from,
     VkWin32SurfaceCreateInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
@@ -5673,212 +6896,260 @@
 #endif
 #ifdef VK_KHR_external_memory_win32
 void deepcopy_VkImportMemoryWin32HandleInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImportMemoryWin32HandleInfoKHR* from,
     VkImportMemoryWin32HandleInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkExportMemoryWin32HandleInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExportMemoryWin32HandleInfoKHR* from,
     VkExportMemoryWin32HandleInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const 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*)pool->dupArray(from->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
+        to->pAttributes = (SECURITY_ATTRIBUTES*)alloc->dupArray(from->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
     }
 }
 
 void deepcopy_VkMemoryWin32HandlePropertiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryWin32HandlePropertiesKHR* from,
     VkMemoryWin32HandlePropertiesKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkMemoryGetWin32HandleInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryGetWin32HandleInfoKHR* from,
     VkMemoryGetWin32HandleInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_external_memory_fd
 void deepcopy_VkImportMemoryFdInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImportMemoryFdInfoKHR* from,
     VkImportMemoryFdInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkMemoryFdPropertiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryFdPropertiesKHR* from,
     VkMemoryFdPropertiesKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkMemoryGetFdInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryGetFdInfoKHR* from,
     VkMemoryGetFdInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
 void deepcopy_VkWin32KeyedMutexAcquireReleaseInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkWin32KeyedMutexAcquireReleaseInfoKHR* from,
     VkWin32KeyedMutexAcquireReleaseInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pAcquireSyncs = nullptr;
     if (from->pAcquireSyncs)
     {
-        to->pAcquireSyncs = (VkDeviceMemory*)pool->dupArray(from->pAcquireSyncs, from->acquireCount * sizeof(const VkDeviceMemory));
+        to->pAcquireSyncs = (VkDeviceMemory*)alloc->dupArray(from->pAcquireSyncs, from->acquireCount * sizeof(const VkDeviceMemory));
     }
     to->pAcquireKeys = nullptr;
     if (from->pAcquireKeys)
     {
-        to->pAcquireKeys = (uint64_t*)pool->dupArray(from->pAcquireKeys, from->acquireCount * sizeof(const uint64_t));
+        to->pAcquireKeys = (uint64_t*)alloc->dupArray(from->pAcquireKeys, from->acquireCount * sizeof(const uint64_t));
     }
     to->pAcquireTimeouts = nullptr;
     if (from->pAcquireTimeouts)
     {
-        to->pAcquireTimeouts = (uint32_t*)pool->dupArray(from->pAcquireTimeouts, from->acquireCount * sizeof(const uint32_t));
+        to->pAcquireTimeouts = (uint32_t*)alloc->dupArray(from->pAcquireTimeouts, from->acquireCount * sizeof(const uint32_t));
     }
     to->pReleaseSyncs = nullptr;
     if (from->pReleaseSyncs)
     {
-        to->pReleaseSyncs = (VkDeviceMemory*)pool->dupArray(from->pReleaseSyncs, from->releaseCount * sizeof(const VkDeviceMemory));
+        to->pReleaseSyncs = (VkDeviceMemory*)alloc->dupArray(from->pReleaseSyncs, from->releaseCount * sizeof(const VkDeviceMemory));
     }
     to->pReleaseKeys = nullptr;
     if (from->pReleaseKeys)
     {
-        to->pReleaseKeys = (uint64_t*)pool->dupArray(from->pReleaseKeys, from->releaseCount * sizeof(const uint64_t));
+        to->pReleaseKeys = (uint64_t*)alloc->dupArray(from->pReleaseKeys, from->releaseCount * sizeof(const uint64_t));
     }
 }
 
@@ -5889,175 +7160,217 @@
 #endif
 #ifdef VK_KHR_external_semaphore_win32
 void deepcopy_VkImportSemaphoreWin32HandleInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImportSemaphoreWin32HandleInfoKHR* from,
     VkImportSemaphoreWin32HandleInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkExportSemaphoreWin32HandleInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExportSemaphoreWin32HandleInfoKHR* from,
     VkExportSemaphoreWin32HandleInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const 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*)pool->dupArray(from->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
+        to->pAttributes = (SECURITY_ATTRIBUTES*)alloc->dupArray(from->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
     }
 }
 
 void deepcopy_VkD3D12FenceSubmitInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkD3D12FenceSubmitInfoKHR* from,
     VkD3D12FenceSubmitInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const 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*)pool->dupArray(from->pWaitSemaphoreValues, from->waitSemaphoreValuesCount * sizeof(const uint64_t));
+        to->pWaitSemaphoreValues = (uint64_t*)alloc->dupArray(from->pWaitSemaphoreValues, from->waitSemaphoreValuesCount * sizeof(const uint64_t));
     }
     to->pSignalSemaphoreValues = nullptr;
     if (from->pSignalSemaphoreValues)
     {
-        to->pSignalSemaphoreValues = (uint64_t*)pool->dupArray(from->pSignalSemaphoreValues, from->signalSemaphoreValuesCount * sizeof(const uint64_t));
+        to->pSignalSemaphoreValues = (uint64_t*)alloc->dupArray(from->pSignalSemaphoreValues, from->signalSemaphoreValuesCount * sizeof(const uint64_t));
     }
 }
 
 void deepcopy_VkSemaphoreGetWin32HandleInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSemaphoreGetWin32HandleInfoKHR* from,
     VkSemaphoreGetWin32HandleInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_external_semaphore_fd
 void deepcopy_VkImportSemaphoreFdInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImportSemaphoreFdInfoKHR* from,
     VkImportSemaphoreFdInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkSemaphoreGetFdInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSemaphoreGetFdInfoKHR* from,
     VkSemaphoreGetFdInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_push_descriptor
 void deepcopy_VkPhysicalDevicePushDescriptorPropertiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDevicePushDescriptorPropertiesKHR* from,
     VkPhysicalDevicePushDescriptorPropertiesKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
@@ -6068,68 +7381,78 @@
 #endif
 #ifdef VK_KHR_incremental_present
 void deepcopy_VkRectLayerKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRectLayerKHR* from,
     VkRectLayerKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
-    deepcopy_VkOffset2D(pool, &from->offset, (VkOffset2D*)(&to->offset));
-    deepcopy_VkExtent2D(pool, &from->extent, (VkExtent2D*)(&to->extent));
+    deepcopy_VkOffset2D(alloc, rootType, &from->offset, (VkOffset2D*)(&to->offset));
+    deepcopy_VkExtent2D(alloc, rootType, &from->extent, (VkExtent2D*)(&to->extent));
 }
 
 void deepcopy_VkPresentRegionKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPresentRegionKHR* from,
     VkPresentRegionKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
     if (from)
     {
         to->pRectangles = nullptr;
         if (from->pRectangles)
         {
-            to->pRectangles = (VkRectLayerKHR*)pool->alloc(from->rectangleCount * sizeof(const VkRectLayerKHR));
+            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(pool, from->pRectangles + i, (VkRectLayerKHR*)(to->pRectangles + i));
+                deepcopy_VkRectLayerKHR(alloc, rootType, from->pRectangles + i, (VkRectLayerKHR*)(to->pRectangles + i));
             }
         }
     }
 }
 
 void deepcopy_VkPresentRegionsKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPresentRegionsKHR* from,
     VkPresentRegionsKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pRegions = nullptr;
         if (from->pRegions)
         {
-            to->pRegions = (VkPresentRegionKHR*)pool->alloc(from->swapchainCount * sizeof(const VkPresentRegionKHR));
+            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(pool, from->pRegions + i, (VkPresentRegionKHR*)(to->pRegions + i));
+                deepcopy_VkPresentRegionKHR(alloc, rootType, from->pRegions + i, (VkPresentRegionKHR*)(to->pRegions + i));
             }
         }
     }
@@ -6144,24 +7467,30 @@
 #endif
 #ifdef VK_KHR_shared_presentable_image
 void deepcopy_VkSharedPresentSurfaceCapabilitiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSharedPresentSurfaceCapabilitiesKHR* from,
     VkSharedPresentSurfaceCapabilitiesKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
@@ -6172,210 +7501,264 @@
 #endif
 #ifdef VK_KHR_external_fence_win32
 void deepcopy_VkImportFenceWin32HandleInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImportFenceWin32HandleInfoKHR* from,
     VkImportFenceWin32HandleInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkExportFenceWin32HandleInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExportFenceWin32HandleInfoKHR* from,
     VkExportFenceWin32HandleInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const 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*)pool->dupArray(from->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
+        to->pAttributes = (SECURITY_ATTRIBUTES*)alloc->dupArray(from->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
     }
 }
 
 void deepcopy_VkFenceGetWin32HandleInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkFenceGetWin32HandleInfoKHR* from,
     VkFenceGetWin32HandleInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_external_fence_fd
 void deepcopy_VkImportFenceFdInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImportFenceFdInfoKHR* from,
     VkImportFenceFdInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkFenceGetFdInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkFenceGetFdInfoKHR* from,
     VkFenceGetFdInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_performance_query
 void deepcopy_VkPhysicalDevicePerformanceQueryFeaturesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDevicePerformanceQueryFeaturesKHR* from,
     VkPhysicalDevicePerformanceQueryFeaturesKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDevicePerformanceQueryPropertiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDevicePerformanceQueryPropertiesKHR* from,
     VkPhysicalDevicePerformanceQueryPropertiesKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPerformanceCounterKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPerformanceCounterKHR* from,
     VkPerformanceCounterKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const 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(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPerformanceCounterDescriptionKHR* from,
     VkPerformanceCounterDescriptionKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const 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->category, from->category, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
@@ -6383,82 +7766,102 @@
 }
 
 void deepcopy_VkQueryPoolPerformanceCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkQueryPoolPerformanceCreateInfoKHR* from,
     VkQueryPoolPerformanceCreateInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const 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*)pool->dupArray(from->pCounterIndices, from->counterIndexCount * sizeof(const uint32_t));
+        to->pCounterIndices = (uint32_t*)alloc->dupArray(from->pCounterIndices, from->counterIndexCount * sizeof(const uint32_t));
     }
 }
 
 void deepcopy_VkPerformanceCounterResultKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPerformanceCounterResultKHR* from,
     VkPerformanceCounterResultKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkAcquireProfilingLockInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAcquireProfilingLockInfoKHR* from,
     VkAcquireProfilingLockInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPerformanceQuerySubmitInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPerformanceQuerySubmitInfoKHR* from,
     VkPerformanceQuerySubmitInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
@@ -6467,71 +7870,89 @@
 #endif
 #ifdef VK_KHR_get_surface_capabilities2
 void deepcopy_VkPhysicalDeviceSurfaceInfo2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceSurfaceInfo2KHR* from,
     VkPhysicalDeviceSurfaceInfo2KHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkSurfaceCapabilities2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSurfaceCapabilities2KHR* from,
     VkSurfaceCapabilities2KHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkSurfaceCapabilitiesKHR(pool, &from->surfaceCapabilities, (VkSurfaceCapabilitiesKHR*)(&to->surfaceCapabilities));
+    deepcopy_VkSurfaceCapabilitiesKHR(alloc, rootType, &from->surfaceCapabilities, (VkSurfaceCapabilitiesKHR*)(&to->surfaceCapabilities));
 }
 
 void deepcopy_VkSurfaceFormat2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSurfaceFormat2KHR* from,
     VkSurfaceFormat2KHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkSurfaceFormatKHR(pool, &from->surfaceFormat, (VkSurfaceFormatKHR*)(&to->surfaceFormat));
+    deepcopy_VkSurfaceFormatKHR(alloc, rootType, &from->surfaceFormat, (VkSurfaceFormatKHR*)(&to->surfaceFormat));
 }
 
 #endif
@@ -6539,117 +7960,147 @@
 #endif
 #ifdef VK_KHR_get_display_properties2
 void deepcopy_VkDisplayProperties2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayProperties2KHR* from,
     VkDisplayProperties2KHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkDisplayPropertiesKHR(pool, &from->displayProperties, (VkDisplayPropertiesKHR*)(&to->displayProperties));
+    deepcopy_VkDisplayPropertiesKHR(alloc, rootType, &from->displayProperties, (VkDisplayPropertiesKHR*)(&to->displayProperties));
 }
 
 void deepcopy_VkDisplayPlaneProperties2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayPlaneProperties2KHR* from,
     VkDisplayPlaneProperties2KHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkDisplayPlanePropertiesKHR(pool, &from->displayPlaneProperties, (VkDisplayPlanePropertiesKHR*)(&to->displayPlaneProperties));
+    deepcopy_VkDisplayPlanePropertiesKHR(alloc, rootType, &from->displayPlaneProperties, (VkDisplayPlanePropertiesKHR*)(&to->displayPlaneProperties));
 }
 
 void deepcopy_VkDisplayModeProperties2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayModeProperties2KHR* from,
     VkDisplayModeProperties2KHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkDisplayModePropertiesKHR(pool, &from->displayModeProperties, (VkDisplayModePropertiesKHR*)(&to->displayModeProperties));
+    deepcopy_VkDisplayModePropertiesKHR(alloc, rootType, &from->displayModeProperties, (VkDisplayModePropertiesKHR*)(&to->displayModeProperties));
 }
 
 void deepcopy_VkDisplayPlaneInfo2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayPlaneInfo2KHR* from,
     VkDisplayPlaneInfo2KHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDisplayPlaneCapabilities2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayPlaneCapabilities2KHR* from,
     VkDisplayPlaneCapabilities2KHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkDisplayPlaneCapabilitiesKHR(pool, &from->capabilities, (VkDisplayPlaneCapabilitiesKHR*)(&to->capabilities));
+    deepcopy_VkDisplayPlaneCapabilitiesKHR(alloc, rootType, &from->capabilities, (VkDisplayPlaneCapabilitiesKHR*)(&to->capabilities));
 }
 
 #endif
@@ -6669,46 +8120,58 @@
 #endif
 #ifdef VK_KHR_portability_subset
 void deepcopy_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDevicePortabilitySubsetFeaturesKHR* from,
     VkPhysicalDevicePortabilitySubsetFeaturesKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDevicePortabilitySubsetPropertiesKHR* from,
     VkPhysicalDevicePortabilitySubsetPropertiesKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
@@ -6725,24 +8188,30 @@
 #endif
 #ifdef VK_KHR_shader_clock
 void deepcopy_VkPhysicalDeviceShaderClockFeaturesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderClockFeaturesKHR* from,
     VkPhysicalDeviceShaderClockFeaturesKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
@@ -6761,150 +8230,186 @@
 #endif
 #ifdef VK_KHR_shader_terminate_invocation
 void deepcopy_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* from,
     VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_fragment_shading_rate
 void deepcopy_VkFragmentShadingRateAttachmentInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkFragmentShadingRateAttachmentInfoKHR* from,
     VkFragmentShadingRateAttachmentInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pFragmentShadingRateAttachment = nullptr;
     if (from->pFragmentShadingRateAttachment)
     {
-        to->pFragmentShadingRateAttachment = (VkAttachmentReference2*)pool->alloc(sizeof(const VkAttachmentReference2));
-        deepcopy_VkAttachmentReference2(pool, from->pFragmentShadingRateAttachment, (VkAttachmentReference2*)(to->pFragmentShadingRateAttachment));
+        to->pFragmentShadingRateAttachment = (VkAttachmentReference2*)alloc->alloc(sizeof(const VkAttachmentReference2));
+        deepcopy_VkAttachmentReference2(alloc, rootType, from->pFragmentShadingRateAttachment, (VkAttachmentReference2*)(to->pFragmentShadingRateAttachment));
     }
-    deepcopy_VkExtent2D(pool, &from->shadingRateAttachmentTexelSize, (VkExtent2D*)(&to->shadingRateAttachmentTexelSize));
+    deepcopy_VkExtent2D(alloc, rootType, &from->shadingRateAttachmentTexelSize, (VkExtent2D*)(&to->shadingRateAttachmentTexelSize));
 }
 
 void deepcopy_VkPipelineFragmentShadingRateStateCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineFragmentShadingRateStateCreateInfoKHR* from,
     VkPipelineFragmentShadingRateStateCreateInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkExtent2D(pool, &from->fragmentSize, (VkExtent2D*)(&to->fragmentSize));
+    deepcopy_VkExtent2D(alloc, rootType, &from->fragmentSize, (VkExtent2D*)(&to->fragmentSize));
     memcpy(to->combinerOps, from->combinerOps, 2 * sizeof(VkFragmentShadingRateCombinerOpKHR));
 }
 
 void deepcopy_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateFeaturesKHR* from,
     VkPhysicalDeviceFragmentShadingRateFeaturesKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRatePropertiesKHR* from,
     VkPhysicalDeviceFragmentShadingRatePropertiesKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkExtent2D(pool, &from->minFragmentShadingRateAttachmentTexelSize, (VkExtent2D*)(&to->minFragmentShadingRateAttachmentTexelSize));
-    deepcopy_VkExtent2D(pool, &from->maxFragmentShadingRateAttachmentTexelSize, (VkExtent2D*)(&to->maxFragmentShadingRateAttachmentTexelSize));
-    deepcopy_VkExtent2D(pool, &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(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateKHR* from,
     VkPhysicalDeviceFragmentShadingRateKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkExtent2D(pool, &from->fragmentSize, (VkExtent2D*)(&to->fragmentSize));
+    deepcopy_VkExtent2D(alloc, rootType, &from->fragmentSize, (VkExtent2D*)(&to->fragmentSize));
 }
 
 #endif
@@ -6912,24 +8417,30 @@
 #endif
 #ifdef VK_KHR_surface_protected_capabilities
 void deepcopy_VkSurfaceProtectedCapabilitiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSurfaceProtectedCapabilitiesKHR* from,
     VkSurfaceProtectedCapabilitiesKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
@@ -6944,184 +8455,228 @@
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
 void deepcopy_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* from,
     VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineInfoKHR* from,
     VkPipelineInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineExecutablePropertiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineExecutablePropertiesKHR* from,
     VkPipelineExecutablePropertiesKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        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));
 }
 
 void deepcopy_VkPipelineExecutableInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineExecutableInfoKHR* from,
     VkPipelineExecutableInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineExecutableStatisticValueKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineExecutableStatisticValueKHR* from,
     VkPipelineExecutableStatisticValueKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkPipelineExecutableStatisticKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineExecutableStatisticKHR* from,
     VkPipelineExecutableStatisticKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        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(pool, &from->value, (VkPipelineExecutableStatisticValueKHR*)(&to->value));
+    deepcopy_VkPipelineExecutableStatisticValueKHR(alloc, rootType, &from->value, (VkPipelineExecutableStatisticValueKHR*)(&to->value));
 }
 
 void deepcopy_VkPipelineExecutableInternalRepresentationKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineExecutableInternalRepresentationKHR* from,
     VkPipelineExecutableInternalRepresentationKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        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)
     {
-        to->pData = (void*)pool->dupArray(from->pData, from->dataSize * sizeof(uint8_t));
+        to->pData = (void*)alloc->dupArray(from->pData, from->dataSize * sizeof(uint8_t));
     }
 }
 
 #endif
 #ifdef VK_KHR_pipeline_library
 void deepcopy_VkPipelineLibraryCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineLibraryCreateInfoKHR* from,
     VkPipelineLibraryCreateInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pLibraries = nullptr;
     if (from->pLibraries)
     {
-        to->pLibraries = (VkPipeline*)pool->dupArray(from->pLibraries, from->libraryCount * sizeof(const VkPipeline));
+        to->pLibraries = (VkPipeline*)alloc->dupArray(from->pLibraries, from->libraryCount * sizeof(const VkPipeline));
     }
 }
 
@@ -7130,343 +8685,409 @@
 #endif
 #ifdef VK_KHR_copy_commands2
 void deepcopy_VkBufferCopy2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBufferCopy2KHR* from,
     VkBufferCopy2KHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkCopyBufferInfo2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCopyBufferInfo2KHR* from,
     VkCopyBufferInfo2KHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pRegions = nullptr;
         if (from->pRegions)
         {
-            to->pRegions = (VkBufferCopy2KHR*)pool->alloc(from->regionCount * sizeof(const VkBufferCopy2KHR));
+            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(pool, from->pRegions + i, (VkBufferCopy2KHR*)(to->pRegions + i));
+                deepcopy_VkBufferCopy2KHR(alloc, rootType, from->pRegions + i, (VkBufferCopy2KHR*)(to->pRegions + i));
             }
         }
     }
 }
 
 void deepcopy_VkImageCopy2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageCopy2KHR* from,
     VkImageCopy2KHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkImageSubresourceLayers(pool, &from->srcSubresource, (VkImageSubresourceLayers*)(&to->srcSubresource));
-    deepcopy_VkOffset3D(pool, &from->srcOffset, (VkOffset3D*)(&to->srcOffset));
-    deepcopy_VkImageSubresourceLayers(pool, &from->dstSubresource, (VkImageSubresourceLayers*)(&to->dstSubresource));
-    deepcopy_VkOffset3D(pool, &from->dstOffset, (VkOffset3D*)(&to->dstOffset));
-    deepcopy_VkExtent3D(pool, &from->extent, (VkExtent3D*)(&to->extent));
+    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_VkOffset3D(alloc, rootType, &from->dstOffset, (VkOffset3D*)(&to->dstOffset));
+    deepcopy_VkExtent3D(alloc, rootType, &from->extent, (VkExtent3D*)(&to->extent));
 }
 
 void deepcopy_VkCopyImageInfo2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCopyImageInfo2KHR* from,
     VkCopyImageInfo2KHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pRegions = nullptr;
         if (from->pRegions)
         {
-            to->pRegions = (VkImageCopy2KHR*)pool->alloc(from->regionCount * sizeof(const VkImageCopy2KHR));
+            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(pool, from->pRegions + i, (VkImageCopy2KHR*)(to->pRegions + i));
+                deepcopy_VkImageCopy2KHR(alloc, rootType, from->pRegions + i, (VkImageCopy2KHR*)(to->pRegions + i));
             }
         }
     }
 }
 
 void deepcopy_VkBufferImageCopy2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBufferImageCopy2KHR* from,
     VkBufferImageCopy2KHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkImageSubresourceLayers(pool, &from->imageSubresource, (VkImageSubresourceLayers*)(&to->imageSubresource));
-    deepcopy_VkOffset3D(pool, &from->imageOffset, (VkOffset3D*)(&to->imageOffset));
-    deepcopy_VkExtent3D(pool, &from->imageExtent, (VkExtent3D*)(&to->imageExtent));
+    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(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCopyBufferToImageInfo2KHR* from,
     VkCopyBufferToImageInfo2KHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pRegions = nullptr;
         if (from->pRegions)
         {
-            to->pRegions = (VkBufferImageCopy2KHR*)pool->alloc(from->regionCount * sizeof(const VkBufferImageCopy2KHR));
+            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(pool, from->pRegions + i, (VkBufferImageCopy2KHR*)(to->pRegions + i));
+                deepcopy_VkBufferImageCopy2KHR(alloc, rootType, from->pRegions + i, (VkBufferImageCopy2KHR*)(to->pRegions + i));
             }
         }
     }
 }
 
 void deepcopy_VkCopyImageToBufferInfo2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCopyImageToBufferInfo2KHR* from,
     VkCopyImageToBufferInfo2KHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pRegions = nullptr;
         if (from->pRegions)
         {
-            to->pRegions = (VkBufferImageCopy2KHR*)pool->alloc(from->regionCount * sizeof(const VkBufferImageCopy2KHR));
+            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(pool, from->pRegions + i, (VkBufferImageCopy2KHR*)(to->pRegions + i));
+                deepcopy_VkBufferImageCopy2KHR(alloc, rootType, from->pRegions + i, (VkBufferImageCopy2KHR*)(to->pRegions + i));
             }
         }
     }
 }
 
 void deepcopy_VkImageBlit2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageBlit2KHR* from,
     VkImageBlit2KHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkImageSubresourceLayers(pool, &from->srcSubresource, (VkImageSubresourceLayers*)(&to->srcSubresource));
+    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->srcSubresource, (VkImageSubresourceLayers*)(&to->srcSubresource));
     for (uint32_t i = 0; i < (uint32_t)2; ++i)
     {
-        deepcopy_VkOffset3D(pool, from->srcOffsets + i, (VkOffset3D*)(to->srcOffsets + i));
+        deepcopy_VkOffset3D(alloc, rootType, from->srcOffsets + i, (VkOffset3D*)(to->srcOffsets + i));
     }
-    deepcopy_VkImageSubresourceLayers(pool, &from->dstSubresource, (VkImageSubresourceLayers*)(&to->dstSubresource));
+    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->dstSubresource, (VkImageSubresourceLayers*)(&to->dstSubresource));
     for (uint32_t i = 0; i < (uint32_t)2; ++i)
     {
-        deepcopy_VkOffset3D(pool, from->dstOffsets + i, (VkOffset3D*)(to->dstOffsets + i));
+        deepcopy_VkOffset3D(alloc, rootType, from->dstOffsets + i, (VkOffset3D*)(to->dstOffsets + i));
     }
 }
 
 void deepcopy_VkBlitImageInfo2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBlitImageInfo2KHR* from,
     VkBlitImageInfo2KHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pRegions = nullptr;
         if (from->pRegions)
         {
-            to->pRegions = (VkImageBlit2KHR*)pool->alloc(from->regionCount * sizeof(const VkImageBlit2KHR));
+            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(pool, from->pRegions + i, (VkImageBlit2KHR*)(to->pRegions + i));
+                deepcopy_VkImageBlit2KHR(alloc, rootType, from->pRegions + i, (VkImageBlit2KHR*)(to->pRegions + i));
             }
         }
     }
 }
 
 void deepcopy_VkImageResolve2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageResolve2KHR* from,
     VkImageResolve2KHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkImageSubresourceLayers(pool, &from->srcSubresource, (VkImageSubresourceLayers*)(&to->srcSubresource));
-    deepcopy_VkOffset3D(pool, &from->srcOffset, (VkOffset3D*)(&to->srcOffset));
-    deepcopy_VkImageSubresourceLayers(pool, &from->dstSubresource, (VkImageSubresourceLayers*)(&to->dstSubresource));
-    deepcopy_VkOffset3D(pool, &from->dstOffset, (VkOffset3D*)(&to->dstOffset));
-    deepcopy_VkExtent3D(pool, &from->extent, (VkExtent3D*)(&to->extent));
+    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_VkOffset3D(alloc, rootType, &from->dstOffset, (VkOffset3D*)(&to->dstOffset));
+    deepcopy_VkExtent3D(alloc, rootType, &from->extent, (VkExtent3D*)(&to->extent));
 }
 
 void deepcopy_VkResolveImageInfo2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkResolveImageInfo2KHR* from,
     VkResolveImageInfo2KHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pRegions = nullptr;
         if (from->pRegions)
         {
-            to->pRegions = (VkImageResolve2KHR*)pool->alloc(from->regionCount * sizeof(const VkImageResolve2KHR));
+            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(pool, from->pRegions + i, (VkImageResolve2KHR*)(to->pRegions + i));
+                deepcopy_VkImageResolve2KHR(alloc, rootType, from->pRegions + i, (VkImageResolve2KHR*)(to->pRegions + i));
             }
         }
     }
@@ -7475,58 +9096,70 @@
 #endif
 #ifdef VK_ANDROID_native_buffer
 void deepcopy_VkNativeBufferANDROID(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkNativeBufferANDROID* from,
     VkNativeBufferANDROID* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->handle = nullptr;
     if (from->handle)
     {
-        to->handle = (uint32_t*)pool->dupArray(from->handle, sizeof(const uint32_t));
+        to->handle = (uint32_t*)alloc->dupArray(from->handle, sizeof(const uint32_t));
     }
 }
 
 #endif
 #ifdef VK_EXT_debug_report
 void deepcopy_VkDebugReportCallbackCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDebugReportCallbackCreateInfoEXT* from,
     VkDebugReportCallbackCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pUserData = nullptr;
     if (from->pUserData)
     {
-        to->pUserData = (void*)pool->dupArray(from->pUserData, sizeof(uint8_t));
+        to->pUserData = (void*)alloc->dupArray(from->pUserData, sizeof(uint8_t));
     }
 }
 
@@ -7539,24 +9172,30 @@
 #endif
 #ifdef VK_AMD_rasterization_order
 void deepcopy_VkPipelineRasterizationStateRasterizationOrderAMD(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineRasterizationStateRasterizationOrderAMD* from,
     VkPipelineRasterizationStateRasterizationOrderAMD* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
@@ -7567,83 +9206,101 @@
 #endif
 #ifdef VK_EXT_debug_marker
 void deepcopy_VkDebugMarkerObjectNameInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDebugMarkerObjectNameInfoEXT* from,
     VkDebugMarkerObjectNameInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pObjectName = nullptr;
     if (from->pObjectName)
     {
-        to->pObjectName = pool->strDup(from->pObjectName);
+        to->pObjectName = alloc->strDup(from->pObjectName);
     }
 }
 
 void deepcopy_VkDebugMarkerObjectTagInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDebugMarkerObjectTagInfoEXT* from,
     VkDebugMarkerObjectTagInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pTag = nullptr;
     if (from->pTag)
     {
-        to->pTag = (void*)pool->dupArray(from->pTag, from->tagSize * sizeof(const uint8_t));
+        to->pTag = (void*)alloc->dupArray(from->pTag, from->tagSize * sizeof(const uint8_t));
     }
 }
 
 void deepcopy_VkDebugMarkerMarkerInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDebugMarkerMarkerInfoEXT* from,
     VkDebugMarkerMarkerInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pMarkerName = nullptr;
     if (from->pMarkerName)
     {
-        to->pMarkerName = pool->strDup(from->pMarkerName);
+        to->pMarkerName = alloc->strDup(from->pMarkerName);
     }
     memcpy(to->color, from->color, 4 * sizeof(float));
 }
@@ -7653,182 +9310,230 @@
 #endif
 #ifdef VK_NV_dedicated_allocation
 void deepcopy_VkDedicatedAllocationImageCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDedicatedAllocationImageCreateInfoNV* from,
     VkDedicatedAllocationImageCreateInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDedicatedAllocationBufferCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDedicatedAllocationBufferCreateInfoNV* from,
     VkDedicatedAllocationBufferCreateInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDedicatedAllocationMemoryAllocateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDedicatedAllocationMemoryAllocateInfoNV* from,
     VkDedicatedAllocationMemoryAllocateInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_transform_feedback
 void deepcopy_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceTransformFeedbackFeaturesEXT* from,
     VkPhysicalDeviceTransformFeedbackFeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceTransformFeedbackPropertiesEXT* from,
     VkPhysicalDeviceTransformFeedbackPropertiesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineRasterizationStateStreamCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineRasterizationStateStreamCreateInfoEXT* from,
     VkPipelineRasterizationStateStreamCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_NVX_image_view_handle
 void deepcopy_VkImageViewHandleInfoNVX(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageViewHandleInfoNVX* from,
     VkImageViewHandleInfoNVX* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkImageViewAddressPropertiesNVX(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageViewAddressPropertiesNVX* from,
     VkImageViewAddressPropertiesNVX* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
@@ -7843,46 +9548,56 @@
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
 void deepcopy_VkTextureLODGatherFormatPropertiesAMD(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkTextureLODGatherFormatPropertiesAMD* from,
     VkTextureLODGatherFormatPropertiesAMD* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_AMD_shader_info
 void deepcopy_VkShaderResourceUsageAMD(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkShaderResourceUsageAMD* from,
     VkShaderResourceUsageAMD* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkShaderStatisticsInfoAMD(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkShaderStatisticsInfoAMD* from,
     VkShaderStatisticsInfoAMD* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
-    deepcopy_VkShaderResourceUsageAMD(pool, &from->resourceUsage, (VkShaderResourceUsageAMD*)(&to->resourceUsage));
+    deepcopy_VkShaderResourceUsageAMD(alloc, rootType, &from->resourceUsage, (VkShaderResourceUsageAMD*)(&to->resourceUsage));
     memcpy(to->computeWorkGroupSize, from->computeWorkGroupSize, 3 * sizeof(uint32_t));
 }
 
@@ -7891,48 +9606,60 @@
 #endif
 #ifdef VK_GGP_stream_descriptor_surface
 void deepcopy_VkStreamDescriptorSurfaceCreateInfoGGP(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkStreamDescriptorSurfaceCreateInfoGGP* from,
     VkStreamDescriptorSurfaceCreateInfoGGP* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_corner_sampled_image
 void deepcopy_VkPhysicalDeviceCornerSampledImageFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceCornerSampledImageFeaturesNV* from,
     VkPhysicalDeviceCornerSampledImageFeaturesNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
@@ -7941,216 +9668,260 @@
 #endif
 #ifdef VK_NV_external_memory_capabilities
 void deepcopy_VkExternalImageFormatPropertiesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExternalImageFormatPropertiesNV* from,
     VkExternalImageFormatPropertiesNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
-    deepcopy_VkImageFormatProperties(pool, &from->imageFormatProperties, (VkImageFormatProperties*)(&to->imageFormatProperties));
+    deepcopy_VkImageFormatProperties(alloc, rootType, &from->imageFormatProperties, (VkImageFormatProperties*)(&to->imageFormatProperties));
 }
 
 #endif
 #ifdef VK_NV_external_memory
 void deepcopy_VkExternalMemoryImageCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExternalMemoryImageCreateInfoNV* from,
     VkExternalMemoryImageCreateInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkExportMemoryAllocateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExportMemoryAllocateInfoNV* from,
     VkExportMemoryAllocateInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_external_memory_win32
 void deepcopy_VkImportMemoryWin32HandleInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImportMemoryWin32HandleInfoNV* from,
     VkImportMemoryWin32HandleInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkExportMemoryWin32HandleInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExportMemoryWin32HandleInfoNV* from,
     VkExportMemoryWin32HandleInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const 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*)pool->dupArray(from->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
+        to->pAttributes = (SECURITY_ATTRIBUTES*)alloc->dupArray(from->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
     }
 }
 
 #endif
 #ifdef VK_NV_win32_keyed_mutex
 void deepcopy_VkWin32KeyedMutexAcquireReleaseInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkWin32KeyedMutexAcquireReleaseInfoNV* from,
     VkWin32KeyedMutexAcquireReleaseInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pAcquireSyncs = nullptr;
     if (from->pAcquireSyncs)
     {
-        to->pAcquireSyncs = (VkDeviceMemory*)pool->dupArray(from->pAcquireSyncs, from->acquireCount * sizeof(const VkDeviceMemory));
+        to->pAcquireSyncs = (VkDeviceMemory*)alloc->dupArray(from->pAcquireSyncs, from->acquireCount * sizeof(const VkDeviceMemory));
     }
     to->pAcquireKeys = nullptr;
     if (from->pAcquireKeys)
     {
-        to->pAcquireKeys = (uint64_t*)pool->dupArray(from->pAcquireKeys, from->acquireCount * sizeof(const uint64_t));
+        to->pAcquireKeys = (uint64_t*)alloc->dupArray(from->pAcquireKeys, from->acquireCount * sizeof(const uint64_t));
     }
     to->pAcquireTimeoutMilliseconds = nullptr;
     if (from->pAcquireTimeoutMilliseconds)
     {
-        to->pAcquireTimeoutMilliseconds = (uint32_t*)pool->dupArray(from->pAcquireTimeoutMilliseconds, from->acquireCount * sizeof(const uint32_t));
+        to->pAcquireTimeoutMilliseconds = (uint32_t*)alloc->dupArray(from->pAcquireTimeoutMilliseconds, from->acquireCount * sizeof(const uint32_t));
     }
     to->pReleaseSyncs = nullptr;
     if (from->pReleaseSyncs)
     {
-        to->pReleaseSyncs = (VkDeviceMemory*)pool->dupArray(from->pReleaseSyncs, from->releaseCount * sizeof(const VkDeviceMemory));
+        to->pReleaseSyncs = (VkDeviceMemory*)alloc->dupArray(from->pReleaseSyncs, from->releaseCount * sizeof(const VkDeviceMemory));
     }
     to->pReleaseKeys = nullptr;
     if (from->pReleaseKeys)
     {
-        to->pReleaseKeys = (uint64_t*)pool->dupArray(from->pReleaseKeys, from->releaseCount * sizeof(const uint64_t));
+        to->pReleaseKeys = (uint64_t*)alloc->dupArray(from->pReleaseKeys, from->releaseCount * sizeof(const uint64_t));
     }
 }
 
 #endif
 #ifdef VK_EXT_validation_flags
 void deepcopy_VkValidationFlagsEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkValidationFlagsEXT* from,
     VkValidationFlagsEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pDisabledValidationChecks = nullptr;
     if (from->pDisabledValidationChecks)
     {
-        to->pDisabledValidationChecks = (VkValidationCheckEXT*)pool->dupArray(from->pDisabledValidationChecks, from->disabledValidationCheckCount * sizeof(const VkValidationCheckEXT));
+        to->pDisabledValidationChecks = (VkValidationCheckEXT*)alloc->dupArray(from->pDisabledValidationChecks, from->disabledValidationCheckCount * sizeof(const VkValidationCheckEXT));
     }
 }
 
 #endif
 #ifdef VK_NN_vi_surface
 void deepcopy_VkViSurfaceCreateInfoNN(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkViSurfaceCreateInfoNN* from,
     VkViSurfaceCreateInfoNN* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->window = nullptr;
     if (from->window)
     {
-        to->window = (void*)pool->dupArray(from->window, sizeof(uint8_t));
+        to->window = (void*)alloc->dupArray(from->window, sizeof(uint8_t));
     }
 }
 
@@ -8161,182 +9932,226 @@
 #endif
 #ifdef VK_EXT_texture_compression_astc_hdr
 void deepcopy_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* from,
     VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_astc_decode_mode
 void deepcopy_VkImageViewASTCDecodeModeEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageViewASTCDecodeModeEXT* from,
     VkImageViewASTCDecodeModeEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceASTCDecodeFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceASTCDecodeFeaturesEXT* from,
     VkPhysicalDeviceASTCDecodeFeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_conditional_rendering
 void deepcopy_VkConditionalRenderingBeginInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkConditionalRenderingBeginInfoEXT* from,
     VkConditionalRenderingBeginInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceConditionalRenderingFeaturesEXT* from,
     VkPhysicalDeviceConditionalRenderingFeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCommandBufferInheritanceConditionalRenderingInfoEXT* from,
     VkCommandBufferInheritanceConditionalRenderingInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_clip_space_w_scaling
 void deepcopy_VkViewportWScalingNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkViewportWScalingNV* from,
     VkViewportWScalingNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkPipelineViewportWScalingStateCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineViewportWScalingStateCreateInfoNV* from,
     VkPipelineViewportWScalingStateCreateInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pViewportWScalings = nullptr;
         if (from->pViewportWScalings)
         {
-            to->pViewportWScalings = (VkViewportWScalingNV*)pool->alloc(from->viewportCount * sizeof(const VkViewportWScalingNV));
+            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(pool, from->pViewportWScalings + i, (VkViewportWScalingNV*)(to->pViewportWScalings + i));
+                deepcopy_VkViewportWScalingNV(alloc, rootType, from->pViewportWScalings + i, (VkViewportWScalingNV*)(to->pViewportWScalings + i));
             }
         }
     }
@@ -8349,179 +10164,221 @@
 #endif
 #ifdef VK_EXT_display_surface_counter
 void deepcopy_VkSurfaceCapabilities2EXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSurfaceCapabilities2EXT* from,
     VkSurfaceCapabilities2EXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkExtent2D(pool, &from->currentExtent, (VkExtent2D*)(&to->currentExtent));
-    deepcopy_VkExtent2D(pool, &from->minImageExtent, (VkExtent2D*)(&to->minImageExtent));
-    deepcopy_VkExtent2D(pool, &from->maxImageExtent, (VkExtent2D*)(&to->maxImageExtent));
+    deepcopy_VkExtent2D(alloc, rootType, &from->currentExtent, (VkExtent2D*)(&to->currentExtent));
+    deepcopy_VkExtent2D(alloc, rootType, &from->minImageExtent, (VkExtent2D*)(&to->minImageExtent));
+    deepcopy_VkExtent2D(alloc, rootType, &from->maxImageExtent, (VkExtent2D*)(&to->maxImageExtent));
 }
 
 #endif
 #ifdef VK_EXT_display_control
 void deepcopy_VkDisplayPowerInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayPowerInfoEXT* from,
     VkDisplayPowerInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDeviceEventInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceEventInfoEXT* from,
     VkDeviceEventInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDisplayEventInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayEventInfoEXT* from,
     VkDisplayEventInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkSwapchainCounterCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSwapchainCounterCreateInfoEXT* from,
     VkSwapchainCounterCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_GOOGLE_display_timing
 void deepcopy_VkRefreshCycleDurationGOOGLE(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRefreshCycleDurationGOOGLE* from,
     VkRefreshCycleDurationGOOGLE* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkPastPresentationTimingGOOGLE(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPastPresentationTimingGOOGLE* from,
     VkPastPresentationTimingGOOGLE* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkPresentTimeGOOGLE(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPresentTimeGOOGLE* from,
     VkPresentTimeGOOGLE* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkPresentTimesInfoGOOGLE(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPresentTimesInfoGOOGLE* from,
     VkPresentTimesInfoGOOGLE* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pTimes = nullptr;
         if (from->pTimes)
         {
-            to->pTimes = (VkPresentTimeGOOGLE*)pool->alloc(from->swapchainCount * sizeof(const VkPresentTimeGOOGLE));
+            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(pool, from->pTimes + i, (VkPresentTimeGOOGLE*)(to->pTimes + i));
+                deepcopy_VkPresentTimeGOOGLE(alloc, rootType, from->pTimes + i, (VkPresentTimeGOOGLE*)(to->pTimes + i));
             }
         }
     }
@@ -8536,68 +10393,82 @@
 #endif
 #ifdef VK_NVX_multiview_per_view_attributes
 void deepcopy_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* from,
     VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_viewport_swizzle
 void deepcopy_VkViewportSwizzleNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkViewportSwizzleNV* from,
     VkViewportSwizzleNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkPipelineViewportSwizzleStateCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineViewportSwizzleStateCreateInfoNV* from,
     VkPipelineViewportSwizzleStateCreateInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pViewportSwizzles = nullptr;
         if (from->pViewportSwizzles)
         {
-            to->pViewportSwizzles = (VkViewportSwizzleNV*)pool->alloc(from->viewportCount * sizeof(const VkViewportSwizzleNV));
+            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(pool, from->pViewportSwizzles + i, (VkViewportSwizzleNV*)(to->pViewportSwizzles + i));
+                deepcopy_VkViewportSwizzleNV(alloc, rootType, from->pViewportSwizzles + i, (VkViewportSwizzleNV*)(to->pViewportSwizzles + i));
             }
         }
     }
@@ -8606,57 +10477,69 @@
 #endif
 #ifdef VK_EXT_discard_rectangles
 void deepcopy_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceDiscardRectanglePropertiesEXT* from,
     VkPhysicalDeviceDiscardRectanglePropertiesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineDiscardRectangleStateCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineDiscardRectangleStateCreateInfoEXT* from,
     VkPipelineDiscardRectangleStateCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pDiscardRectangles = nullptr;
         if (from->pDiscardRectangles)
         {
-            to->pDiscardRectangles = (VkRect2D*)pool->alloc(from->discardRectangleCount * sizeof(const VkRect2D));
+            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(pool, from->pDiscardRectangles + i, (VkRect2D*)(to->pDiscardRectangles + i));
+                deepcopy_VkRect2D(alloc, rootType, from->pDiscardRectangles + i, (VkRect2D*)(to->pDiscardRectangles + i));
             }
         }
     }
@@ -8665,92 +10548,116 @@
 #endif
 #ifdef VK_EXT_conservative_rasterization
 void deepcopy_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceConservativeRasterizationPropertiesEXT* from,
     VkPhysicalDeviceConservativeRasterizationPropertiesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineRasterizationConservativeStateCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineRasterizationConservativeStateCreateInfoEXT* from,
     VkPipelineRasterizationConservativeStateCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_depth_clip_enable
 void deepcopy_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceDepthClipEnableFeaturesEXT* from,
     VkPhysicalDeviceDepthClipEnableFeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineRasterizationDepthClipStateCreateInfoEXT* from,
     VkPipelineRasterizationDepthClipStateCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
@@ -8759,95 +10666,115 @@
 #endif
 #ifdef VK_EXT_hdr_metadata
 void deepcopy_VkXYColorEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkXYColorEXT* from,
     VkXYColorEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkHdrMetadataEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkHdrMetadataEXT* from,
     VkHdrMetadataEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkXYColorEXT(pool, &from->displayPrimaryRed, (VkXYColorEXT*)(&to->displayPrimaryRed));
-    deepcopy_VkXYColorEXT(pool, &from->displayPrimaryGreen, (VkXYColorEXT*)(&to->displayPrimaryGreen));
-    deepcopy_VkXYColorEXT(pool, &from->displayPrimaryBlue, (VkXYColorEXT*)(&to->displayPrimaryBlue));
-    deepcopy_VkXYColorEXT(pool, &from->whitePoint, (VkXYColorEXT*)(&to->whitePoint));
+    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(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkIOSSurfaceCreateInfoMVK* from,
     VkIOSSurfaceCreateInfoMVK* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pView = nullptr;
     if (from->pView)
     {
-        to->pView = (void*)pool->dupArray(from->pView, sizeof(const uint8_t));
+        to->pView = (void*)alloc->dupArray(from->pView, sizeof(const uint8_t));
     }
 }
 
 #endif
 #ifdef VK_MVK_macos_surface
 void deepcopy_VkMacOSSurfaceCreateInfoMVK(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMacOSSurfaceCreateInfoMVK* from,
     VkMacOSSurfaceCreateInfoMVK* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pView = nullptr;
     if (from->pView)
     {
-        to->pView = (void*)pool->dupArray(from->pView, sizeof(const uint8_t));
+        to->pView = (void*)alloc->dupArray(from->pView, sizeof(const uint8_t));
     }
 }
 
@@ -8860,100 +10787,118 @@
 #endif
 #ifdef VK_EXT_debug_utils
 void deepcopy_VkDebugUtilsLabelEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDebugUtilsLabelEXT* from,
     VkDebugUtilsLabelEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pLabelName = nullptr;
     if (from->pLabelName)
     {
-        to->pLabelName = pool->strDup(from->pLabelName);
+        to->pLabelName = alloc->strDup(from->pLabelName);
     }
     memcpy(to->color, from->color, 4 * sizeof(float));
 }
 
 void deepcopy_VkDebugUtilsObjectNameInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDebugUtilsObjectNameInfoEXT* from,
     VkDebugUtilsObjectNameInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pObjectName = nullptr;
     if (from->pObjectName)
     {
-        to->pObjectName = pool->strDup(from->pObjectName);
+        to->pObjectName = alloc->strDup(from->pObjectName);
     }
 }
 
 void deepcopy_VkDebugUtilsMessengerCallbackDataEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDebugUtilsMessengerCallbackDataEXT* from,
     VkDebugUtilsMessengerCallbackDataEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pMessageIdName = nullptr;
     if (from->pMessageIdName)
     {
-        to->pMessageIdName = pool->strDup(from->pMessageIdName);
+        to->pMessageIdName = alloc->strDup(from->pMessageIdName);
     }
     to->pMessage = nullptr;
     if (from->pMessage)
     {
-        to->pMessage = pool->strDup(from->pMessage);
+        to->pMessage = alloc->strDup(from->pMessage);
     }
     if (from)
     {
         to->pQueueLabels = nullptr;
         if (from->pQueueLabels)
         {
-            to->pQueueLabels = (VkDebugUtilsLabelEXT*)pool->alloc(from->queueLabelCount * sizeof(VkDebugUtilsLabelEXT));
+            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(pool, from->pQueueLabels + i, (VkDebugUtilsLabelEXT*)(to->pQueueLabels + i));
+                deepcopy_VkDebugUtilsLabelEXT(alloc, rootType, from->pQueueLabels + i, (VkDebugUtilsLabelEXT*)(to->pQueueLabels + i));
             }
         }
     }
@@ -8962,11 +10907,11 @@
         to->pCmdBufLabels = nullptr;
         if (from->pCmdBufLabels)
         {
-            to->pCmdBufLabels = (VkDebugUtilsLabelEXT*)pool->alloc(from->cmdBufLabelCount * sizeof(VkDebugUtilsLabelEXT));
+            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(pool, from->pCmdBufLabels + i, (VkDebugUtilsLabelEXT*)(to->pCmdBufLabels + i));
+                deepcopy_VkDebugUtilsLabelEXT(alloc, rootType, from->pCmdBufLabels + i, (VkDebugUtilsLabelEXT*)(to->pCmdBufLabels + i));
             }
         }
     }
@@ -8975,207 +10920,255 @@
         to->pObjects = nullptr;
         if (from->pObjects)
         {
-            to->pObjects = (VkDebugUtilsObjectNameInfoEXT*)pool->alloc(from->objectCount * sizeof(VkDebugUtilsObjectNameInfoEXT));
+            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(pool, from->pObjects + i, (VkDebugUtilsObjectNameInfoEXT*)(to->pObjects + i));
+                deepcopy_VkDebugUtilsObjectNameInfoEXT(alloc, rootType, from->pObjects + i, (VkDebugUtilsObjectNameInfoEXT*)(to->pObjects + i));
             }
         }
     }
 }
 
 void deepcopy_VkDebugUtilsMessengerCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDebugUtilsMessengerCreateInfoEXT* from,
     VkDebugUtilsMessengerCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pUserData = nullptr;
     if (from->pUserData)
     {
-        to->pUserData = (void*)pool->dupArray(from->pUserData, sizeof(uint8_t));
+        to->pUserData = (void*)alloc->dupArray(from->pUserData, sizeof(uint8_t));
     }
 }
 
 void deepcopy_VkDebugUtilsObjectTagInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDebugUtilsObjectTagInfoEXT* from,
     VkDebugUtilsObjectTagInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pTag = nullptr;
     if (from->pTag)
     {
-        to->pTag = (void*)pool->dupArray(from->pTag, from->tagSize * sizeof(const uint8_t));
+        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(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAndroidHardwareBufferUsageANDROID* from,
     VkAndroidHardwareBufferUsageANDROID* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkAndroidHardwareBufferPropertiesANDROID(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAndroidHardwareBufferPropertiesANDROID* from,
     VkAndroidHardwareBufferPropertiesANDROID* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkAndroidHardwareBufferFormatPropertiesANDROID(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAndroidHardwareBufferFormatPropertiesANDROID* from,
     VkAndroidHardwareBufferFormatPropertiesANDROID* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkComponentMapping(pool, &from->samplerYcbcrConversionComponents, (VkComponentMapping*)(&to->samplerYcbcrConversionComponents));
+    deepcopy_VkComponentMapping(alloc, rootType, &from->samplerYcbcrConversionComponents, (VkComponentMapping*)(&to->samplerYcbcrConversionComponents));
 }
 
 void deepcopy_VkImportAndroidHardwareBufferInfoANDROID(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImportAndroidHardwareBufferInfoANDROID* from,
     VkImportAndroidHardwareBufferInfoANDROID* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->buffer = nullptr;
     if (from->buffer)
     {
-        to->buffer = (AHardwareBuffer*)pool->dupArray(from->buffer, sizeof(AHardwareBuffer));
+        to->buffer = (AHardwareBuffer*)alloc->dupArray(from->buffer, sizeof(AHardwareBuffer));
     }
 }
 
 void deepcopy_VkMemoryGetAndroidHardwareBufferInfoANDROID(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryGetAndroidHardwareBufferInfoANDROID* from,
     VkMemoryGetAndroidHardwareBufferInfoANDROID* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkExternalFormatANDROID(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExternalFormatANDROID* from,
     VkExternalFormatANDROID* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
@@ -9190,95 +11183,119 @@
 #endif
 #ifdef VK_EXT_inline_uniform_block
 void deepcopy_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceInlineUniformBlockFeaturesEXT* from,
     VkPhysicalDeviceInlineUniformBlockFeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceInlineUniformBlockPropertiesEXT* from,
     VkPhysicalDeviceInlineUniformBlockPropertiesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkWriteDescriptorSetInlineUniformBlockEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkWriteDescriptorSetInlineUniformBlockEXT* from,
     VkWriteDescriptorSetInlineUniformBlockEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pData = nullptr;
     if (from->pData)
     {
-        to->pData = (void*)pool->dupArray(from->pData, from->dataSize * sizeof(const uint8_t));
+        to->pData = (void*)alloc->dupArray(from->pData, from->dataSize * sizeof(const uint8_t));
     }
 }
 
 void deepcopy_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorPoolInlineUniformBlockCreateInfoEXT* from,
     VkDescriptorPoolInlineUniformBlockCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
@@ -9287,100 +11304,118 @@
 #endif
 #ifdef VK_EXT_sample_locations
 void deepcopy_VkSampleLocationEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSampleLocationEXT* from,
     VkSampleLocationEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkSampleLocationsInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSampleLocationsInfoEXT* from,
     VkSampleLocationsInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkExtent2D(pool, &from->sampleLocationGridSize, (VkExtent2D*)(&to->sampleLocationGridSize));
+    deepcopy_VkExtent2D(alloc, rootType, &from->sampleLocationGridSize, (VkExtent2D*)(&to->sampleLocationGridSize));
     if (from)
     {
         to->pSampleLocations = nullptr;
         if (from->pSampleLocations)
         {
-            to->pSampleLocations = (VkSampleLocationEXT*)pool->alloc(from->sampleLocationsCount * sizeof(const VkSampleLocationEXT));
+            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(pool, from->pSampleLocations + i, (VkSampleLocationEXT*)(to->pSampleLocations + i));
+                deepcopy_VkSampleLocationEXT(alloc, rootType, from->pSampleLocations + i, (VkSampleLocationEXT*)(to->pSampleLocations + i));
             }
         }
     }
 }
 
 void deepcopy_VkAttachmentSampleLocationsEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAttachmentSampleLocationsEXT* from,
     VkAttachmentSampleLocationsEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
-    deepcopy_VkSampleLocationsInfoEXT(pool, &from->sampleLocationsInfo, (VkSampleLocationsInfoEXT*)(&to->sampleLocationsInfo));
+    deepcopy_VkSampleLocationsInfoEXT(alloc, rootType, &from->sampleLocationsInfo, (VkSampleLocationsInfoEXT*)(&to->sampleLocationsInfo));
 }
 
 void deepcopy_VkSubpassSampleLocationsEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSubpassSampleLocationsEXT* from,
     VkSubpassSampleLocationsEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
-    deepcopy_VkSampleLocationsInfoEXT(pool, &from->sampleLocationsInfo, (VkSampleLocationsInfoEXT*)(&to->sampleLocationsInfo));
+    deepcopy_VkSampleLocationsInfoEXT(alloc, rootType, &from->sampleLocationsInfo, (VkSampleLocationsInfoEXT*)(&to->sampleLocationsInfo));
 }
 
 void deepcopy_VkRenderPassSampleLocationsBeginInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRenderPassSampleLocationsBeginInfoEXT* from,
     VkRenderPassSampleLocationsBeginInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pAttachmentInitialSampleLocations = nullptr;
         if (from->pAttachmentInitialSampleLocations)
         {
-            to->pAttachmentInitialSampleLocations = (VkAttachmentSampleLocationsEXT*)pool->alloc(from->attachmentInitialSampleLocationsCount * sizeof(const VkAttachmentSampleLocationsEXT));
+            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(pool, from->pAttachmentInitialSampleLocations + i, (VkAttachmentSampleLocationsEXT*)(to->pAttachmentInitialSampleLocations + i));
+                deepcopy_VkAttachmentSampleLocationsEXT(alloc, rootType, from->pAttachmentInitialSampleLocations + i, (VkAttachmentSampleLocationsEXT*)(to->pAttachmentInitialSampleLocations + i));
             }
         }
     }
@@ -9389,204 +11424,252 @@
         to->pPostSubpassSampleLocations = nullptr;
         if (from->pPostSubpassSampleLocations)
         {
-            to->pPostSubpassSampleLocations = (VkSubpassSampleLocationsEXT*)pool->alloc(from->postSubpassSampleLocationsCount * sizeof(const VkSubpassSampleLocationsEXT));
+            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(pool, from->pPostSubpassSampleLocations + i, (VkSubpassSampleLocationsEXT*)(to->pPostSubpassSampleLocations + i));
+                deepcopy_VkSubpassSampleLocationsEXT(alloc, rootType, from->pPostSubpassSampleLocations + i, (VkSubpassSampleLocationsEXT*)(to->pPostSubpassSampleLocations + i));
             }
         }
     }
 }
 
 void deepcopy_VkPipelineSampleLocationsStateCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineSampleLocationsStateCreateInfoEXT* from,
     VkPipelineSampleLocationsStateCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkSampleLocationsInfoEXT(pool, &from->sampleLocationsInfo, (VkSampleLocationsInfoEXT*)(&to->sampleLocationsInfo));
+    deepcopy_VkSampleLocationsInfoEXT(alloc, rootType, &from->sampleLocationsInfo, (VkSampleLocationsInfoEXT*)(&to->sampleLocationsInfo));
 }
 
 void deepcopy_VkPhysicalDeviceSampleLocationsPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceSampleLocationsPropertiesEXT* from,
     VkPhysicalDeviceSampleLocationsPropertiesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkExtent2D(pool, &from->maxSampleLocationGridSize, (VkExtent2D*)(&to->maxSampleLocationGridSize));
+    deepcopy_VkExtent2D(alloc, rootType, &from->maxSampleLocationGridSize, (VkExtent2D*)(&to->maxSampleLocationGridSize));
     memcpy(to->sampleLocationCoordinateRange, from->sampleLocationCoordinateRange, 2 * sizeof(float));
 }
 
 void deepcopy_VkMultisamplePropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMultisamplePropertiesEXT* from,
     VkMultisamplePropertiesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkExtent2D(pool, &from->maxSampleLocationGridSize, (VkExtent2D*)(&to->maxSampleLocationGridSize));
+    deepcopy_VkExtent2D(alloc, rootType, &from->maxSampleLocationGridSize, (VkExtent2D*)(&to->maxSampleLocationGridSize));
 }
 
 #endif
 #ifdef VK_EXT_blend_operation_advanced
 void deepcopy_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* from,
     VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* from,
     VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineColorBlendAdvancedStateCreateInfoEXT* from,
     VkPipelineColorBlendAdvancedStateCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_fragment_coverage_to_color
 void deepcopy_VkPipelineCoverageToColorStateCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineCoverageToColorStateCreateInfoNV* from,
     VkPipelineCoverageToColorStateCreateInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_framebuffer_mixed_samples
 void deepcopy_VkPipelineCoverageModulationStateCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineCoverageModulationStateCreateInfoNV* from,
     VkPipelineCoverageModulationStateCreateInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pCoverageModulationTable = nullptr;
     if (from->pCoverageModulationTable)
     {
-        to->pCoverageModulationTable = (float*)pool->dupArray(from->pCoverageModulationTable, from->coverageModulationTableCount * sizeof(const float));
+        to->pCoverageModulationTable = (float*)alloc->dupArray(from->pCoverageModulationTable, from->coverageModulationTableCount * sizeof(const float));
     }
 }
 
@@ -9595,46 +11678,58 @@
 #endif
 #ifdef VK_NV_shader_sm_builtins
 void deepcopy_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* from,
     VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* from,
     VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
@@ -9643,208 +11738,252 @@
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
 void deepcopy_VkDrmFormatModifierPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDrmFormatModifierPropertiesEXT* from,
     VkDrmFormatModifierPropertiesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkDrmFormatModifierPropertiesListEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDrmFormatModifierPropertiesListEXT* from,
     VkDrmFormatModifierPropertiesListEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pDrmFormatModifierProperties = nullptr;
         if (from->pDrmFormatModifierProperties)
         {
-            to->pDrmFormatModifierProperties = (VkDrmFormatModifierPropertiesEXT*)pool->alloc(from->drmFormatModifierCount * sizeof(VkDrmFormatModifierPropertiesEXT));
+            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(pool, from->pDrmFormatModifierProperties + i, (VkDrmFormatModifierPropertiesEXT*)(to->pDrmFormatModifierProperties + i));
+                deepcopy_VkDrmFormatModifierPropertiesEXT(alloc, rootType, from->pDrmFormatModifierProperties + i, (VkDrmFormatModifierPropertiesEXT*)(to->pDrmFormatModifierProperties + i));
             }
         }
     }
 }
 
 void deepcopy_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageDrmFormatModifierInfoEXT* from,
     VkPhysicalDeviceImageDrmFormatModifierInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const 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*)pool->dupArray(from->pQueueFamilyIndices, from->queueFamilyIndexCount * sizeof(const uint32_t));
+        to->pQueueFamilyIndices = (uint32_t*)alloc->dupArray(from->pQueueFamilyIndices, from->queueFamilyIndexCount * sizeof(const uint32_t));
     }
 }
 
 void deepcopy_VkImageDrmFormatModifierListCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageDrmFormatModifierListCreateInfoEXT* from,
     VkImageDrmFormatModifierListCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const 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*)pool->dupArray(from->pDrmFormatModifiers, from->drmFormatModifierCount * sizeof(const uint64_t));
+        to->pDrmFormatModifiers = (uint64_t*)alloc->dupArray(from->pDrmFormatModifiers, from->drmFormatModifierCount * sizeof(const uint64_t));
     }
 }
 
 void deepcopy_VkImageDrmFormatModifierExplicitCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageDrmFormatModifierExplicitCreateInfoEXT* from,
     VkImageDrmFormatModifierExplicitCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pPlaneLayouts = nullptr;
         if (from->pPlaneLayouts)
         {
-            to->pPlaneLayouts = (VkSubresourceLayout*)pool->alloc(from->drmFormatModifierPlaneCount * sizeof(const VkSubresourceLayout));
+            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(pool, from->pPlaneLayouts + i, (VkSubresourceLayout*)(to->pPlaneLayouts + i));
+                deepcopy_VkSubresourceLayout(alloc, rootType, from->pPlaneLayouts + i, (VkSubresourceLayout*)(to->pPlaneLayouts + i));
             }
         }
     }
 }
 
 void deepcopy_VkImageDrmFormatModifierPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageDrmFormatModifierPropertiesEXT* from,
     VkImageDrmFormatModifierPropertiesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_validation_cache
 void deepcopy_VkValidationCacheCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkValidationCacheCreateInfoEXT* from,
     VkValidationCacheCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pInitialData = nullptr;
     if (from->pInitialData)
     {
-        to->pInitialData = (void*)pool->dupArray(from->pInitialData, from->initialDataSize * sizeof(const uint8_t));
+        to->pInitialData = (void*)alloc->dupArray(from->pInitialData, from->initialDataSize * sizeof(const uint8_t));
     }
 }
 
 void deepcopy_VkShaderModuleValidationCacheCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkShaderModuleValidationCacheCreateInfoEXT* from,
     VkShaderModuleValidationCacheCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
@@ -9855,160 +11994,190 @@
 #endif
 #ifdef VK_NV_shading_rate_image
 void deepcopy_VkShadingRatePaletteNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkShadingRatePaletteNV* from,
     VkShadingRatePaletteNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
     to->pShadingRatePaletteEntries = nullptr;
     if (from->pShadingRatePaletteEntries)
     {
-        to->pShadingRatePaletteEntries = (VkShadingRatePaletteEntryNV*)pool->dupArray(from->pShadingRatePaletteEntries, from->shadingRatePaletteEntryCount * sizeof(const VkShadingRatePaletteEntryNV));
+        to->pShadingRatePaletteEntries = (VkShadingRatePaletteEntryNV*)alloc->dupArray(from->pShadingRatePaletteEntries, from->shadingRatePaletteEntryCount * sizeof(const VkShadingRatePaletteEntryNV));
     }
 }
 
 void deepcopy_VkPipelineViewportShadingRateImageStateCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineViewportShadingRateImageStateCreateInfoNV* from,
     VkPipelineViewportShadingRateImageStateCreateInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pShadingRatePalettes = nullptr;
         if (from->pShadingRatePalettes)
         {
-            to->pShadingRatePalettes = (VkShadingRatePaletteNV*)pool->alloc(from->viewportCount * sizeof(const VkShadingRatePaletteNV));
+            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(pool, from->pShadingRatePalettes + i, (VkShadingRatePaletteNV*)(to->pShadingRatePalettes + i));
+                deepcopy_VkShadingRatePaletteNV(alloc, rootType, from->pShadingRatePalettes + i, (VkShadingRatePaletteNV*)(to->pShadingRatePalettes + i));
             }
         }
     }
 }
 
 void deepcopy_VkPhysicalDeviceShadingRateImageFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShadingRateImageFeaturesNV* from,
     VkPhysicalDeviceShadingRateImageFeaturesNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceShadingRateImagePropertiesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShadingRateImagePropertiesNV* from,
     VkPhysicalDeviceShadingRateImagePropertiesNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkExtent2D(pool, &from->shadingRateTexelSize, (VkExtent2D*)(&to->shadingRateTexelSize));
+    deepcopy_VkExtent2D(alloc, rootType, &from->shadingRateTexelSize, (VkExtent2D*)(&to->shadingRateTexelSize));
 }
 
 void deepcopy_VkCoarseSampleLocationNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCoarseSampleLocationNV* from,
     VkCoarseSampleLocationNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkCoarseSampleOrderCustomNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCoarseSampleOrderCustomNV* from,
     VkCoarseSampleOrderCustomNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
     if (from)
     {
         to->pSampleLocations = nullptr;
         if (from->pSampleLocations)
         {
-            to->pSampleLocations = (VkCoarseSampleLocationNV*)pool->alloc(from->sampleLocationCount * sizeof(const VkCoarseSampleLocationNV));
+            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(pool, from->pSampleLocations + i, (VkCoarseSampleLocationNV*)(to->pSampleLocations + i));
+                deepcopy_VkCoarseSampleLocationNV(alloc, rootType, from->pSampleLocations + i, (VkCoarseSampleLocationNV*)(to->pSampleLocations + i));
             }
         }
     }
 }
 
 void deepcopy_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* from,
     VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pCustomSampleOrders = nullptr;
         if (from->pCustomSampleOrders)
         {
-            to->pCustomSampleOrders = (VkCoarseSampleOrderCustomNV*)pool->alloc(from->customSampleOrderCount * sizeof(const VkCoarseSampleOrderCustomNV));
+            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(pool, from->pCustomSampleOrders + i, (VkCoarseSampleOrderCustomNV*)(to->pCustomSampleOrders + i));
+                deepcopy_VkCoarseSampleOrderCustomNV(alloc, rootType, from->pCustomSampleOrders + i, (VkCoarseSampleOrderCustomNV*)(to->pCustomSampleOrders + i));
             }
         }
     }
@@ -10017,57 +12186,69 @@
 #endif
 #ifdef VK_NV_ray_tracing
 void deepcopy_VkRayTracingShaderGroupCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRayTracingShaderGroupCreateInfoNV* from,
     VkRayTracingShaderGroupCreateInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkRayTracingPipelineCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRayTracingPipelineCreateInfoNV* from,
     VkRayTracingPipelineCreateInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pStages = nullptr;
         if (from->pStages)
         {
-            to->pStages = (VkPipelineShaderStageCreateInfo*)pool->alloc(from->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
+            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(pool, from->pStages + i, (VkPipelineShaderStageCreateInfo*)(to->pStages + i));
+                deepcopy_VkPipelineShaderStageCreateInfo(alloc, rootType, from->pStages + i, (VkPipelineShaderStageCreateInfo*)(to->pStages + i));
             }
         }
     }
@@ -10076,368 +12257,454 @@
         to->pGroups = nullptr;
         if (from->pGroups)
         {
-            to->pGroups = (VkRayTracingShaderGroupCreateInfoNV*)pool->alloc(from->groupCount * sizeof(const VkRayTracingShaderGroupCreateInfoNV));
+            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(pool, from->pGroups + i, (VkRayTracingShaderGroupCreateInfoNV*)(to->pGroups + i));
+                deepcopy_VkRayTracingShaderGroupCreateInfoNV(alloc, rootType, from->pGroups + i, (VkRayTracingShaderGroupCreateInfoNV*)(to->pGroups + i));
             }
         }
     }
 }
 
 void deepcopy_VkGeometryTrianglesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkGeometryTrianglesNV* from,
     VkGeometryTrianglesNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkGeometryAABBNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkGeometryAABBNV* from,
     VkGeometryAABBNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkGeometryDataNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkGeometryDataNV* from,
     VkGeometryDataNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
-    deepcopy_VkGeometryTrianglesNV(pool, &from->triangles, (VkGeometryTrianglesNV*)(&to->triangles));
-    deepcopy_VkGeometryAABBNV(pool, &from->aabbs, (VkGeometryAABBNV*)(&to->aabbs));
+    deepcopy_VkGeometryTrianglesNV(alloc, rootType, &from->triangles, (VkGeometryTrianglesNV*)(&to->triangles));
+    deepcopy_VkGeometryAABBNV(alloc, rootType, &from->aabbs, (VkGeometryAABBNV*)(&to->aabbs));
 }
 
 void deepcopy_VkGeometryNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkGeometryNV* from,
     VkGeometryNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkGeometryDataNV(pool, &from->geometry, (VkGeometryDataNV*)(&to->geometry));
+    deepcopy_VkGeometryDataNV(alloc, rootType, &from->geometry, (VkGeometryDataNV*)(&to->geometry));
 }
 
 void deepcopy_VkAccelerationStructureInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureInfoNV* from,
     VkAccelerationStructureInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pGeometries = nullptr;
         if (from->pGeometries)
         {
-            to->pGeometries = (VkGeometryNV*)pool->alloc(from->geometryCount * sizeof(const VkGeometryNV));
+            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(pool, from->pGeometries + i, (VkGeometryNV*)(to->pGeometries + i));
+                deepcopy_VkGeometryNV(alloc, rootType, from->pGeometries + i, (VkGeometryNV*)(to->pGeometries + i));
             }
         }
     }
 }
 
 void deepcopy_VkAccelerationStructureCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureCreateInfoNV* from,
     VkAccelerationStructureCreateInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkAccelerationStructureInfoNV(pool, &from->info, (VkAccelerationStructureInfoNV*)(&to->info));
+    deepcopy_VkAccelerationStructureInfoNV(alloc, rootType, &from->info, (VkAccelerationStructureInfoNV*)(&to->info));
 }
 
 void deepcopy_VkBindAccelerationStructureMemoryInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBindAccelerationStructureMemoryInfoNV* from,
     VkBindAccelerationStructureMemoryInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const 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*)pool->dupArray(from->pDeviceIndices, from->deviceIndexCount * sizeof(const uint32_t));
+        to->pDeviceIndices = (uint32_t*)alloc->dupArray(from->pDeviceIndices, from->deviceIndexCount * sizeof(const uint32_t));
     }
 }
 
 void deepcopy_VkWriteDescriptorSetAccelerationStructureNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkWriteDescriptorSetAccelerationStructureNV* from,
     VkWriteDescriptorSetAccelerationStructureNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pAccelerationStructures = nullptr;
     if (from->pAccelerationStructures)
     {
-        to->pAccelerationStructures = (VkAccelerationStructureNV*)pool->dupArray(from->pAccelerationStructures, from->accelerationStructureCount * sizeof(const VkAccelerationStructureNV));
+        to->pAccelerationStructures = (VkAccelerationStructureNV*)alloc->dupArray(from->pAccelerationStructures, from->accelerationStructureCount * sizeof(const VkAccelerationStructureNV));
     }
 }
 
 void deepcopy_VkAccelerationStructureMemoryRequirementsInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureMemoryRequirementsInfoNV* from,
     VkAccelerationStructureMemoryRequirementsInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceRayTracingPropertiesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPropertiesNV* from,
     VkPhysicalDeviceRayTracingPropertiesNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkTransformMatrixKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkTransformMatrixKHR* from,
     VkTransformMatrixKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
     memcpy(to->matrix, from->matrix, ((3)*(4)) * sizeof(float));
 }
 
 void deepcopy_VkAabbPositionsKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAabbPositionsKHR* from,
     VkAabbPositionsKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkAccelerationStructureInstanceKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureInstanceKHR* from,
     VkAccelerationStructureInstanceKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
-    deepcopy_VkTransformMatrixKHR(pool, &from->transform, (VkTransformMatrixKHR*)(&to->transform));
+    deepcopy_VkTransformMatrixKHR(alloc, rootType, &from->transform, (VkTransformMatrixKHR*)(&to->transform));
 }
 
 #endif
 #ifdef VK_NV_representative_fragment_test
 void deepcopy_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* from,
     VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineRepresentativeFragmentTestStateCreateInfoNV* from,
     VkPipelineRepresentativeFragmentTestStateCreateInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_filter_cubic
 void deepcopy_VkPhysicalDeviceImageViewImageFormatInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageViewImageFormatInfoEXT* from,
     VkPhysicalDeviceImageViewImageFormatInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkFilterCubicImageViewImageFormatPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkFilterCubicImageViewImageFormatPropertiesEXT* from,
     VkFilterCubicImageViewImageFormatPropertiesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
@@ -10446,97 +12713,121 @@
 #endif
 #ifdef VK_EXT_global_priority
 void deepcopy_VkDeviceQueueGlobalPriorityCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceQueueGlobalPriorityCreateInfoEXT* from,
     VkDeviceQueueGlobalPriorityCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_external_memory_host
 void deepcopy_VkImportMemoryHostPointerInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImportMemoryHostPointerInfoEXT* from,
     VkImportMemoryHostPointerInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pHostPointer = nullptr;
     if (from->pHostPointer)
     {
-        to->pHostPointer = (void*)pool->dupArray(from->pHostPointer, sizeof(uint8_t));
+        to->pHostPointer = (void*)alloc->dupArray(from->pHostPointer, sizeof(uint8_t));
     }
 }
 
 void deepcopy_VkMemoryHostPointerPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryHostPointerPropertiesEXT* from,
     VkMemoryHostPointerPropertiesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalMemoryHostPropertiesEXT* from,
     VkPhysicalDeviceExternalMemoryHostPropertiesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
@@ -10545,260 +12836,318 @@
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
 void deepcopy_VkPipelineCompilerControlCreateInfoAMD(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineCompilerControlCreateInfoAMD* from,
     VkPipelineCompilerControlCreateInfoAMD* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_calibrated_timestamps
 void deepcopy_VkCalibratedTimestampInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCalibratedTimestampInfoEXT* from,
     VkCalibratedTimestampInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_AMD_shader_core_properties
 void deepcopy_VkPhysicalDeviceShaderCorePropertiesAMD(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderCorePropertiesAMD* from,
     VkPhysicalDeviceShaderCorePropertiesAMD* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
 void deepcopy_VkDeviceMemoryOverallocationCreateInfoAMD(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceMemoryOverallocationCreateInfoAMD* from,
     VkDeviceMemoryOverallocationCreateInfoAMD* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_vertex_attribute_divisor
 void deepcopy_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* from,
     VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkVertexInputBindingDivisorDescriptionEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkVertexInputBindingDivisorDescriptionEXT* from,
     VkVertexInputBindingDivisorDescriptionEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkPipelineVertexInputDivisorStateCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineVertexInputDivisorStateCreateInfoEXT* from,
     VkPipelineVertexInputDivisorStateCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pVertexBindingDivisors = nullptr;
         if (from->pVertexBindingDivisors)
         {
-            to->pVertexBindingDivisors = (VkVertexInputBindingDivisorDescriptionEXT*)pool->alloc(from->vertexBindingDivisorCount * sizeof(const VkVertexInputBindingDivisorDescriptionEXT));
+            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(pool, from->pVertexBindingDivisors + i, (VkVertexInputBindingDivisorDescriptionEXT*)(to->pVertexBindingDivisors + i));
+                deepcopy_VkVertexInputBindingDivisorDescriptionEXT(alloc, rootType, from->pVertexBindingDivisors + i, (VkVertexInputBindingDivisorDescriptionEXT*)(to->pVertexBindingDivisors + i));
             }
         }
     }
 }
 
 void deepcopy_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* from,
     VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_GGP_frame_token
 void deepcopy_VkPresentFrameTokenGGP(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPresentFrameTokenGGP* from,
     VkPresentFrameTokenGGP* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
 void deepcopy_VkPipelineCreationFeedbackEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineCreationFeedbackEXT* from,
     VkPipelineCreationFeedbackEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkPipelineCreationFeedbackCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineCreationFeedbackCreateInfoEXT* from,
     VkPipelineCreationFeedbackCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pPipelineCreationFeedback = nullptr;
     if (from->pPipelineCreationFeedback)
     {
-        to->pPipelineCreationFeedback = (VkPipelineCreationFeedbackEXT*)pool->alloc(sizeof(VkPipelineCreationFeedbackEXT));
-        deepcopy_VkPipelineCreationFeedbackEXT(pool, from->pPipelineCreationFeedback, (VkPipelineCreationFeedbackEXT*)(to->pPipelineCreationFeedback));
+        to->pPipelineCreationFeedback = (VkPipelineCreationFeedbackEXT*)alloc->alloc(sizeof(VkPipelineCreationFeedbackEXT));
+        deepcopy_VkPipelineCreationFeedbackEXT(alloc, rootType, from->pPipelineCreationFeedback, (VkPipelineCreationFeedbackEXT*)(to->pPipelineCreationFeedback));
     }
     if (from)
     {
         to->pPipelineStageCreationFeedbacks = nullptr;
         if (from->pPipelineStageCreationFeedbacks)
         {
-            to->pPipelineStageCreationFeedbacks = (VkPipelineCreationFeedbackEXT*)pool->alloc(from->pipelineStageCreationFeedbackCount * sizeof(VkPipelineCreationFeedbackEXT));
+            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(pool, from->pPipelineStageCreationFeedbacks + i, (VkPipelineCreationFeedbackEXT*)(to->pPipelineStageCreationFeedbacks + i));
+                deepcopy_VkPipelineCreationFeedbackEXT(alloc, rootType, from->pPipelineStageCreationFeedbacks + i, (VkPipelineCreationFeedbackEXT*)(to->pPipelineStageCreationFeedbacks + i));
             }
         }
     }
@@ -10809,618 +13158,771 @@
 #endif
 #ifdef VK_NV_compute_shader_derivatives
 void deepcopy_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* from,
     VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_mesh_shader
 void deepcopy_VkPhysicalDeviceMeshShaderFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceMeshShaderFeaturesNV* from,
     VkPhysicalDeviceMeshShaderFeaturesNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceMeshShaderPropertiesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceMeshShaderPropertiesNV* from,
     VkPhysicalDeviceMeshShaderPropertiesNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     memcpy(to->maxTaskWorkGroupSize, from->maxTaskWorkGroupSize, 3 * sizeof(uint32_t));
     memcpy(to->maxMeshWorkGroupSize, from->maxMeshWorkGroupSize, 3 * sizeof(uint32_t));
 }
 
 void deepcopy_VkDrawMeshTasksIndirectCommandNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDrawMeshTasksIndirectCommandNV* from,
     VkDrawMeshTasksIndirectCommandNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
 void deepcopy_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* from,
     VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_shader_image_footprint
 void deepcopy_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderImageFootprintFeaturesNV* from,
     VkPhysicalDeviceShaderImageFootprintFeaturesNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_scissor_exclusive
 void deepcopy_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineViewportExclusiveScissorStateCreateInfoNV* from,
     VkPipelineViewportExclusiveScissorStateCreateInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pExclusiveScissors = nullptr;
         if (from->pExclusiveScissors)
         {
-            to->pExclusiveScissors = (VkRect2D*)pool->alloc(from->exclusiveScissorCount * sizeof(const VkRect2D));
+            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(pool, from->pExclusiveScissors + i, (VkRect2D*)(to->pExclusiveScissors + i));
+                deepcopy_VkRect2D(alloc, rootType, from->pExclusiveScissors + i, (VkRect2D*)(to->pExclusiveScissors + i));
             }
         }
     }
 }
 
 void deepcopy_VkPhysicalDeviceExclusiveScissorFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceExclusiveScissorFeaturesNV* from,
     VkPhysicalDeviceExclusiveScissorFeaturesNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
 void deepcopy_VkQueueFamilyCheckpointPropertiesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkQueueFamilyCheckpointPropertiesNV* from,
     VkQueueFamilyCheckpointPropertiesNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkCheckpointDataNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCheckpointDataNV* from,
     VkCheckpointDataNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pCheckpointMarker = nullptr;
     if (from->pCheckpointMarker)
     {
-        to->pCheckpointMarker = (void*)pool->dupArray(from->pCheckpointMarker, sizeof(uint8_t));
+        to->pCheckpointMarker = (void*)alloc->dupArray(from->pCheckpointMarker, sizeof(uint8_t));
     }
 }
 
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
 void deepcopy_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* from,
     VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_INTEL_performance_query
 void deepcopy_VkPerformanceValueDataINTEL(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPerformanceValueDataINTEL* from,
     VkPerformanceValueDataINTEL* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
     to->valueString = nullptr;
     if (from->valueString)
     {
-        to->valueString = pool->strDup(from->valueString);
+        to->valueString = alloc->strDup(from->valueString);
     }
 }
 
 void deepcopy_VkPerformanceValueINTEL(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPerformanceValueINTEL* from,
     VkPerformanceValueINTEL* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
-    deepcopy_VkPerformanceValueDataINTEL(pool, &from->data, (VkPerformanceValueDataINTEL*)(&to->data));
+    deepcopy_VkPerformanceValueDataINTEL(alloc, rootType, &from->data, (VkPerformanceValueDataINTEL*)(&to->data));
 }
 
 void deepcopy_VkInitializePerformanceApiInfoINTEL(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkInitializePerformanceApiInfoINTEL* from,
     VkInitializePerformanceApiInfoINTEL* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pUserData = nullptr;
     if (from->pUserData)
     {
-        to->pUserData = (void*)pool->dupArray(from->pUserData, sizeof(uint8_t));
+        to->pUserData = (void*)alloc->dupArray(from->pUserData, sizeof(uint8_t));
     }
 }
 
 void deepcopy_VkQueryPoolPerformanceQueryCreateInfoINTEL(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkQueryPoolPerformanceQueryCreateInfoINTEL* from,
     VkQueryPoolPerformanceQueryCreateInfoINTEL* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPerformanceMarkerInfoINTEL(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPerformanceMarkerInfoINTEL* from,
     VkPerformanceMarkerInfoINTEL* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPerformanceStreamMarkerInfoINTEL(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPerformanceStreamMarkerInfoINTEL* from,
     VkPerformanceStreamMarkerInfoINTEL* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPerformanceOverrideInfoINTEL(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPerformanceOverrideInfoINTEL* from,
     VkPerformanceOverrideInfoINTEL* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPerformanceConfigurationAcquireInfoINTEL(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPerformanceConfigurationAcquireInfoINTEL* from,
     VkPerformanceConfigurationAcquireInfoINTEL* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_pci_bus_info
 void deepcopy_VkPhysicalDevicePCIBusInfoPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDevicePCIBusInfoPropertiesEXT* from,
     VkPhysicalDevicePCIBusInfoPropertiesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_AMD_display_native_hdr
 void deepcopy_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayNativeHdrSurfaceCapabilitiesAMD* from,
     VkDisplayNativeHdrSurfaceCapabilitiesAMD* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkSwapchainDisplayNativeHdrCreateInfoAMD(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSwapchainDisplayNativeHdrCreateInfoAMD* from,
     VkSwapchainDisplayNativeHdrCreateInfoAMD* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_FUCHSIA_imagepipe_surface
 void deepcopy_VkImagePipeSurfaceCreateInfoFUCHSIA(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImagePipeSurfaceCreateInfoFUCHSIA* from,
     VkImagePipeSurfaceCreateInfoFUCHSIA* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_metal_surface
 void deepcopy_VkMetalSurfaceCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMetalSurfaceCreateInfoEXT* from,
     VkMetalSurfaceCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pLayer = nullptr;
     if (from->pLayer)
     {
-        to->pLayer = (CAMetalLayer*)pool->dupArray(from->pLayer, sizeof(const CAMetalLayer));
+        to->pLayer = (CAMetalLayer*)alloc->dupArray(from->pLayer, sizeof(const CAMetalLayer));
     }
 }
 
 #endif
-#ifdef VK_GOOGLE_color_buffer
-void deepcopy_VkImportColorBufferGOOGLE(
-    BumpPool* pool,
-    const VkImportColorBufferGOOGLE* from,
-    VkImportColorBufferGOOGLE* to)
+#ifdef VK_EXT_fragment_density_map
+void deepcopy_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
+    Allocator* alloc,
+    VkStructureType rootType,
+    const VkPhysicalDeviceFragmentDensityMapFeaturesEXT* from,
+    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkImportBufferGOOGLE(
-    BumpPool* pool,
-    const VkImportBufferGOOGLE* from,
-    VkImportBufferGOOGLE* to)
+void deepcopy_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
+    Allocator* alloc,
+    VkStructureType rootType,
+    const VkPhysicalDeviceFragmentDensityMapPropertiesEXT* from,
+    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        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));
 }
 
-void deepcopy_VkImportPhysicalAddressGOOGLE(
-    BumpPool* pool,
-    const VkImportPhysicalAddressGOOGLE* from,
-    VkImportPhysicalAddressGOOGLE* to)
+void deepcopy_VkRenderPassFragmentDensityMapCreateInfoEXT(
+    Allocator* alloc,
+    VkStructureType rootType,
+    const VkRenderPassFragmentDensityMapCreateInfoEXT* from,
+    VkRenderPassFragmentDensityMapCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
+    deepcopy_VkAttachmentReference(alloc, rootType, &from->fragmentDensityMapAttachment, (VkAttachmentReference*)(&to->fragmentDensityMapAttachment));
 }
 
 #endif
@@ -11432,164 +13934,206 @@
 #endif
 #ifdef VK_EXT_subgroup_size_control
 void deepcopy_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* from,
     VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* from,
     VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* from,
     VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_AMD_shader_core_properties2
 void deepcopy_VkPhysicalDeviceShaderCoreProperties2AMD(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderCoreProperties2AMD* from,
     VkPhysicalDeviceShaderCoreProperties2AMD* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_AMD_device_coherent_memory
 void deepcopy_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceCoherentMemoryFeaturesAMD* from,
     VkPhysicalDeviceCoherentMemoryFeaturesAMD* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_shader_image_atomic_int64
 void deepcopy_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* from,
     VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_memory_budget
 void deepcopy_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryBudgetPropertiesEXT* from,
     VkPhysicalDeviceMemoryBudgetPropertiesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     memcpy(to->heapBudget, from->heapBudget, VK_MAX_MEMORY_HEAPS * sizeof(VkDeviceSize));
     memcpy(to->heapUsage, from->heapUsage, VK_MAX_MEMORY_HEAPS * sizeof(VkDeviceSize));
@@ -11598,140 +14142,176 @@
 #endif
 #ifdef VK_EXT_memory_priority
 void deepcopy_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryPriorityFeaturesEXT* from,
     VkPhysicalDeviceMemoryPriorityFeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkMemoryPriorityAllocateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryPriorityAllocateInfoEXT* from,
     VkMemoryPriorityAllocateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_dedicated_allocation_image_aliasing
 void deepcopy_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* from,
     VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_buffer_device_address
 void deepcopy_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* from,
     VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkBufferDeviceAddressCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBufferDeviceAddressCreateInfoEXT* from,
     VkBufferDeviceAddressCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_tooling_info
 void deepcopy_VkPhysicalDeviceToolPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceToolPropertiesEXT* from,
     VkPhysicalDeviceToolPropertiesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     memcpy(to->name, from->name, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char));
     memcpy(to->version, from->version, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char));
@@ -11744,402 +14324,504 @@
 #endif
 #ifdef VK_EXT_validation_features
 void deepcopy_VkValidationFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkValidationFeaturesEXT* from,
     VkValidationFeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pEnabledValidationFeatures = nullptr;
     if (from->pEnabledValidationFeatures)
     {
-        to->pEnabledValidationFeatures = (VkValidationFeatureEnableEXT*)pool->dupArray(from->pEnabledValidationFeatures, from->enabledValidationFeatureCount * sizeof(const VkValidationFeatureEnableEXT));
+        to->pEnabledValidationFeatures = (VkValidationFeatureEnableEXT*)alloc->dupArray(from->pEnabledValidationFeatures, from->enabledValidationFeatureCount * sizeof(const VkValidationFeatureEnableEXT));
     }
     to->pDisabledValidationFeatures = nullptr;
     if (from->pDisabledValidationFeatures)
     {
-        to->pDisabledValidationFeatures = (VkValidationFeatureDisableEXT*)pool->dupArray(from->pDisabledValidationFeatures, from->disabledValidationFeatureCount * sizeof(const VkValidationFeatureDisableEXT));
+        to->pDisabledValidationFeatures = (VkValidationFeatureDisableEXT*)alloc->dupArray(from->pDisabledValidationFeatures, from->disabledValidationFeatureCount * sizeof(const VkValidationFeatureDisableEXT));
     }
 }
 
 #endif
 #ifdef VK_NV_cooperative_matrix
 void deepcopy_VkCooperativeMatrixPropertiesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCooperativeMatrixPropertiesNV* from,
     VkCooperativeMatrixPropertiesNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceCooperativeMatrixFeaturesNV* from,
     VkPhysicalDeviceCooperativeMatrixFeaturesNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceCooperativeMatrixPropertiesNV* from,
     VkPhysicalDeviceCooperativeMatrixPropertiesNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_coverage_reduction_mode
 void deepcopy_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceCoverageReductionModeFeaturesNV* from,
     VkPhysicalDeviceCoverageReductionModeFeaturesNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineCoverageReductionStateCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineCoverageReductionStateCreateInfoNV* from,
     VkPipelineCoverageReductionStateCreateInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkFramebufferMixedSamplesCombinationNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkFramebufferMixedSamplesCombinationNV* from,
     VkFramebufferMixedSamplesCombinationNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
 void deepcopy_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* from,
     VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_ycbcr_image_arrays
 void deepcopy_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* from,
     VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_full_screen_exclusive
 void deepcopy_VkSurfaceFullScreenExclusiveInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSurfaceFullScreenExclusiveInfoEXT* from,
     VkSurfaceFullScreenExclusiveInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSurfaceCapabilitiesFullScreenExclusiveEXT* from,
     VkSurfaceCapabilitiesFullScreenExclusiveEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkSurfaceFullScreenExclusiveWin32InfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSurfaceFullScreenExclusiveWin32InfoEXT* from,
     VkSurfaceFullScreenExclusiveWin32InfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_headless_surface
 void deepcopy_VkHeadlessSurfaceCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkHeadlessSurfaceCreateInfoEXT* from,
     VkHeadlessSurfaceCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_line_rasterization
 void deepcopy_VkPhysicalDeviceLineRasterizationFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceLineRasterizationFeaturesEXT* from,
     VkPhysicalDeviceLineRasterizationFeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceLineRasterizationPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceLineRasterizationPropertiesEXT* from,
     VkPhysicalDeviceLineRasterizationPropertiesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineRasterizationLineStateCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineRasterizationLineStateCreateInfoEXT* from,
     VkPipelineRasterizationLineStateCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_shader_atomic_float
 void deepcopy_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* from,
     VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
@@ -12148,660 +14830,808 @@
 #endif
 #ifdef VK_EXT_index_type_uint8
 void deepcopy_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceIndexTypeUint8FeaturesEXT* from,
     VkPhysicalDeviceIndexTypeUint8FeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_extended_dynamic_state
 void deepcopy_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* from,
     VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 void deepcopy_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* from,
     VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_device_generated_commands
 void deepcopy_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* from,
     VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* from,
     VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkGraphicsShaderGroupCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkGraphicsShaderGroupCreateInfoNV* from,
     VkGraphicsShaderGroupCreateInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pStages = nullptr;
         if (from->pStages)
         {
-            to->pStages = (VkPipelineShaderStageCreateInfo*)pool->alloc(from->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
+            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(pool, from->pStages + i, (VkPipelineShaderStageCreateInfo*)(to->pStages + i));
+                deepcopy_VkPipelineShaderStageCreateInfo(alloc, rootType, from->pStages + i, (VkPipelineShaderStageCreateInfo*)(to->pStages + i));
             }
         }
     }
     to->pVertexInputState = nullptr;
     if (from->pVertexInputState)
     {
-        to->pVertexInputState = (VkPipelineVertexInputStateCreateInfo*)pool->alloc(sizeof(const VkPipelineVertexInputStateCreateInfo));
-        deepcopy_VkPipelineVertexInputStateCreateInfo(pool, from->pVertexInputState, (VkPipelineVertexInputStateCreateInfo*)(to->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*)pool->alloc(sizeof(const VkPipelineTessellationStateCreateInfo));
-        deepcopy_VkPipelineTessellationStateCreateInfo(pool, from->pTessellationState, (VkPipelineTessellationStateCreateInfo*)(to->pTessellationState));
+        to->pTessellationState = (VkPipelineTessellationStateCreateInfo*)alloc->alloc(sizeof(const VkPipelineTessellationStateCreateInfo));
+        deepcopy_VkPipelineTessellationStateCreateInfo(alloc, rootType, from->pTessellationState, (VkPipelineTessellationStateCreateInfo*)(to->pTessellationState));
     }
 }
 
 void deepcopy_VkGraphicsPipelineShaderGroupsCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkGraphicsPipelineShaderGroupsCreateInfoNV* from,
     VkGraphicsPipelineShaderGroupsCreateInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pGroups = nullptr;
         if (from->pGroups)
         {
-            to->pGroups = (VkGraphicsShaderGroupCreateInfoNV*)pool->alloc(from->groupCount * sizeof(const VkGraphicsShaderGroupCreateInfoNV));
+            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(pool, from->pGroups + i, (VkGraphicsShaderGroupCreateInfoNV*)(to->pGroups + i));
+                deepcopy_VkGraphicsShaderGroupCreateInfoNV(alloc, rootType, from->pGroups + i, (VkGraphicsShaderGroupCreateInfoNV*)(to->pGroups + i));
             }
         }
     }
     to->pPipelines = nullptr;
     if (from->pPipelines)
     {
-        to->pPipelines = (VkPipeline*)pool->dupArray(from->pPipelines, from->pipelineCount * sizeof(const VkPipeline));
+        to->pPipelines = (VkPipeline*)alloc->dupArray(from->pPipelines, from->pipelineCount * sizeof(const VkPipeline));
     }
 }
 
 void deepcopy_VkBindShaderGroupIndirectCommandNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBindShaderGroupIndirectCommandNV* from,
     VkBindShaderGroupIndirectCommandNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkBindIndexBufferIndirectCommandNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBindIndexBufferIndirectCommandNV* from,
     VkBindIndexBufferIndirectCommandNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkBindVertexBufferIndirectCommandNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBindVertexBufferIndirectCommandNV* from,
     VkBindVertexBufferIndirectCommandNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkSetStateFlagsIndirectCommandNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSetStateFlagsIndirectCommandNV* from,
     VkSetStateFlagsIndirectCommandNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkIndirectCommandsStreamNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkIndirectCommandsStreamNV* from,
     VkIndirectCommandsStreamNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkIndirectCommandsLayoutTokenNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkIndirectCommandsLayoutTokenNV* from,
     VkIndirectCommandsLayoutTokenNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pIndexTypes = nullptr;
     if (from->pIndexTypes)
     {
-        to->pIndexTypes = (VkIndexType*)pool->dupArray(from->pIndexTypes, from->indexTypeCount * sizeof(const VkIndexType));
+        to->pIndexTypes = (VkIndexType*)alloc->dupArray(from->pIndexTypes, from->indexTypeCount * sizeof(const VkIndexType));
     }
     to->pIndexTypeValues = nullptr;
     if (from->pIndexTypeValues)
     {
-        to->pIndexTypeValues = (uint32_t*)pool->dupArray(from->pIndexTypeValues, from->indexTypeCount * sizeof(const uint32_t));
+        to->pIndexTypeValues = (uint32_t*)alloc->dupArray(from->pIndexTypeValues, from->indexTypeCount * sizeof(const uint32_t));
     }
 }
 
 void deepcopy_VkIndirectCommandsLayoutCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkIndirectCommandsLayoutCreateInfoNV* from,
     VkIndirectCommandsLayoutCreateInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pTokens = nullptr;
         if (from->pTokens)
         {
-            to->pTokens = (VkIndirectCommandsLayoutTokenNV*)pool->alloc(from->tokenCount * sizeof(const VkIndirectCommandsLayoutTokenNV));
+            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(pool, from->pTokens + i, (VkIndirectCommandsLayoutTokenNV*)(to->pTokens + i));
+                deepcopy_VkIndirectCommandsLayoutTokenNV(alloc, rootType, from->pTokens + i, (VkIndirectCommandsLayoutTokenNV*)(to->pTokens + i));
             }
         }
     }
     to->pStreamStrides = nullptr;
     if (from->pStreamStrides)
     {
-        to->pStreamStrides = (uint32_t*)pool->dupArray(from->pStreamStrides, from->streamCount * sizeof(const uint32_t));
+        to->pStreamStrides = (uint32_t*)alloc->dupArray(from->pStreamStrides, from->streamCount * sizeof(const uint32_t));
     }
 }
 
 void deepcopy_VkGeneratedCommandsInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkGeneratedCommandsInfoNV* from,
     VkGeneratedCommandsInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pStreams = nullptr;
         if (from->pStreams)
         {
-            to->pStreams = (VkIndirectCommandsStreamNV*)pool->alloc(from->streamCount * sizeof(const VkIndirectCommandsStreamNV));
+            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(pool, from->pStreams + i, (VkIndirectCommandsStreamNV*)(to->pStreams + i));
+                deepcopy_VkIndirectCommandsStreamNV(alloc, rootType, from->pStreams + i, (VkIndirectCommandsStreamNV*)(to->pStreams + i));
             }
         }
     }
 }
 
 void deepcopy_VkGeneratedCommandsMemoryRequirementsInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkGeneratedCommandsMemoryRequirementsInfoNV* from,
     VkGeneratedCommandsMemoryRequirementsInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_texel_buffer_alignment
 void deepcopy_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* from,
     VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* from,
     VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_QCOM_render_pass_transform
 void deepcopy_VkRenderPassTransformBeginInfoQCOM(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRenderPassTransformBeginInfoQCOM* from,
     VkRenderPassTransformBeginInfoQCOM* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCommandBufferInheritanceRenderPassTransformInfoQCOM* from,
     VkCommandBufferInheritanceRenderPassTransformInfoQCOM* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkRect2D(pool, &from->renderArea, (VkRect2D*)(&to->renderArea));
+    deepcopy_VkRect2D(alloc, rootType, &from->renderArea, (VkRect2D*)(&to->renderArea));
 }
 
 #endif
 #ifdef VK_EXT_device_memory_report
 void deepcopy_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* from,
     VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDeviceMemoryReportCallbackDataEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceMemoryReportCallbackDataEXT* from,
     VkDeviceMemoryReportCallbackDataEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDeviceDeviceMemoryReportCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceDeviceMemoryReportCreateInfoEXT* from,
     VkDeviceDeviceMemoryReportCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pUserData = nullptr;
     if (from->pUserData)
     {
-        to->pUserData = (void*)pool->dupArray(from->pUserData, sizeof(uint8_t));
+        to->pUserData = (void*)alloc->dupArray(from->pUserData, sizeof(uint8_t));
     }
 }
 
 #endif
 #ifdef VK_EXT_robustness2
 void deepcopy_VkPhysicalDeviceRobustness2FeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceRobustness2FeaturesEXT* from,
     VkPhysicalDeviceRobustness2FeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceRobustness2PropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceRobustness2PropertiesEXT* from,
     VkPhysicalDeviceRobustness2PropertiesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_custom_border_color
 void deepcopy_VkSamplerCustomBorderColorCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSamplerCustomBorderColorCreateInfoEXT* from,
     VkSamplerCustomBorderColorCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkClearColorValue(pool, &from->customBorderColor, (VkClearColorValue*)(&to->customBorderColor));
+    deepcopy_VkClearColorValue(alloc, rootType, &from->customBorderColor, (VkClearColorValue*)(&to->customBorderColor));
 }
 
 void deepcopy_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceCustomBorderColorPropertiesEXT* from,
     VkPhysicalDeviceCustomBorderColorPropertiesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceCustomBorderColorFeaturesEXT* from,
     VkPhysicalDeviceCustomBorderColorFeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
@@ -12810,138 +15640,174 @@
 #endif
 #ifdef VK_EXT_private_data
 void deepcopy_VkPhysicalDevicePrivateDataFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDevicePrivateDataFeaturesEXT* from,
     VkPhysicalDevicePrivateDataFeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDevicePrivateDataCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDevicePrivateDataCreateInfoEXT* from,
     VkDevicePrivateDataCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPrivateDataSlotCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPrivateDataSlotCreateInfoEXT* from,
     VkPrivateDataSlotCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
 void deepcopy_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* from,
     VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_device_diagnostics_config
 void deepcopy_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceDiagnosticsConfigFeaturesNV* from,
     VkPhysicalDeviceDiagnosticsConfigFeaturesNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDeviceDiagnosticsConfigCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceDiagnosticsConfigCreateInfoNV* from,
     VkDeviceDiagnosticsConfigCreateInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
@@ -12950,68 +15816,86 @@
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
 void deepcopy_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* from,
     VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* from,
     VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineFragmentShadingRateEnumStateCreateInfoNV* from,
     VkPipelineFragmentShadingRateEnumStateCreateInfoNV* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     memcpy(to->combinerOps, from->combinerOps, 2 * sizeof(VkFragmentShadingRateCombinerOpKHR));
 }
@@ -13019,651 +15903,887 @@
 #endif
 #ifdef VK_EXT_fragment_density_map2
 void deepcopy_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* from,
     VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* from,
     VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
 void deepcopy_VkCopyCommandTransformInfoQCOM(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCopyCommandTransformInfoQCOM* from,
     VkCopyCommandTransformInfoQCOM* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_image_robustness
 void deepcopy_VkPhysicalDeviceImageRobustnessFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageRobustnessFeaturesEXT* from,
     VkPhysicalDeviceImageRobustnessFeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_4444_formats
 void deepcopy_VkPhysicalDevice4444FormatsFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDevice4444FormatsFeaturesEXT* from,
     VkPhysicalDevice4444FormatsFeaturesEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_directfb_surface
 void deepcopy_VkDirectFBSurfaceCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDirectFBSurfaceCreateInfoEXT* from,
     VkDirectFBSurfaceCreateInfoEXT* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->dfb = nullptr;
     if (from->dfb)
     {
-        to->dfb = (IDirectFB*)pool->dupArray(from->dfb, sizeof(IDirectFB));
+        to->dfb = (IDirectFB*)alloc->dupArray(from->dfb, sizeof(IDirectFB));
     }
     to->surface = nullptr;
     if (from->surface)
     {
-        to->surface = (IDirectFBSurface*)pool->dupArray(from->surface, sizeof(IDirectFBSurface));
+        to->surface = (IDirectFBSurface*)alloc->dupArray(from->surface, sizeof(IDirectFBSurface));
     }
 }
 
 #endif
 #ifdef VK_GOOGLE_gfxstream
+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)
+    {
+        rootType = from->sType;
+    }
+    const void* from_pNext = from;
+    size_t pNext_size = 0u;
+    while (!pNext_size && from_pNext)
+    {
+        from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
+    }
+    to->pNext = nullptr;
+    if (pNext_size)
+    {
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
+    }
+}
+
+void deepcopy_VkImportBufferGOOGLE(
+    Allocator* alloc,
+    VkStructureType rootType,
+    const VkImportBufferGOOGLE* from,
+    VkImportBufferGOOGLE* to)
+{
+    (void)alloc;
+    (void)rootType;
+    *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
+    const void* from_pNext = from;
+    size_t pNext_size = 0u;
+    while (!pNext_size && from_pNext)
+    {
+        from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
+    }
+    to->pNext = nullptr;
+    if (pNext_size)
+    {
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
+    }
+}
+
+void deepcopy_VkImportPhysicalAddressGOOGLE(
+    Allocator* alloc,
+    VkStructureType rootType,
+    const VkImportPhysicalAddressGOOGLE* from,
+    VkImportPhysicalAddressGOOGLE* to)
+{
+    (void)alloc;
+    (void)rootType;
+    *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
+    const void* from_pNext = from;
+    size_t pNext_size = 0u;
+    while (!pNext_size && from_pNext)
+    {
+        from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
+    }
+    to->pNext = nullptr;
+    if (pNext_size)
+    {
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
+    }
+}
+
 #endif
 #ifdef VK_KHR_acceleration_structure
 void deepcopy_VkDeviceOrHostAddressKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceOrHostAddressKHR* from,
     VkDeviceOrHostAddressKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
     to->hostAddress = nullptr;
     if (from->hostAddress)
     {
-        to->hostAddress = (void*)pool->dupArray(from->hostAddress, sizeof(uint8_t));
+        to->hostAddress = (void*)alloc->dupArray(from->hostAddress, sizeof(uint8_t));
     }
 }
 
 void deepcopy_VkDeviceOrHostAddressConstKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceOrHostAddressConstKHR* from,
     VkDeviceOrHostAddressConstKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
     to->hostAddress = nullptr;
     if (from->hostAddress)
     {
-        to->hostAddress = (void*)pool->dupArray(from->hostAddress, sizeof(const uint8_t));
+        to->hostAddress = (void*)alloc->dupArray(from->hostAddress, sizeof(const uint8_t));
     }
 }
 
 void deepcopy_VkAccelerationStructureBuildRangeInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureBuildRangeInfoKHR* from,
     VkAccelerationStructureBuildRangeInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkAccelerationStructureGeometryTrianglesDataKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryTrianglesDataKHR* from,
     VkAccelerationStructureGeometryTrianglesDataKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkDeviceOrHostAddressConstKHR(pool, &from->vertexData, (VkDeviceOrHostAddressConstKHR*)(&to->vertexData));
-    deepcopy_VkDeviceOrHostAddressConstKHR(pool, &from->indexData, (VkDeviceOrHostAddressConstKHR*)(&to->indexData));
-    deepcopy_VkDeviceOrHostAddressConstKHR(pool, &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(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryAabbsDataKHR* from,
     VkAccelerationStructureGeometryAabbsDataKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkDeviceOrHostAddressConstKHR(pool, &from->data, (VkDeviceOrHostAddressConstKHR*)(&to->data));
+    deepcopy_VkDeviceOrHostAddressConstKHR(alloc, rootType, &from->data, (VkDeviceOrHostAddressConstKHR*)(&to->data));
 }
 
 void deepcopy_VkAccelerationStructureGeometryInstancesDataKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryInstancesDataKHR* from,
     VkAccelerationStructureGeometryInstancesDataKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkDeviceOrHostAddressConstKHR(pool, &from->data, (VkDeviceOrHostAddressConstKHR*)(&to->data));
+    deepcopy_VkDeviceOrHostAddressConstKHR(alloc, rootType, &from->data, (VkDeviceOrHostAddressConstKHR*)(&to->data));
 }
 
 void deepcopy_VkAccelerationStructureGeometryDataKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryDataKHR* from,
     VkAccelerationStructureGeometryDataKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
-    deepcopy_VkAccelerationStructureGeometryTrianglesDataKHR(pool, &from->triangles, (VkAccelerationStructureGeometryTrianglesDataKHR*)(&to->triangles));
-    deepcopy_VkAccelerationStructureGeometryAabbsDataKHR(pool, &from->aabbs, (VkAccelerationStructureGeometryAabbsDataKHR*)(&to->aabbs));
-    deepcopy_VkAccelerationStructureGeometryInstancesDataKHR(pool, &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(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryKHR* from,
     VkAccelerationStructureGeometryKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkAccelerationStructureGeometryDataKHR(pool, &from->geometry, (VkAccelerationStructureGeometryDataKHR*)(&to->geometry));
+    deepcopy_VkAccelerationStructureGeometryDataKHR(alloc, rootType, &from->geometry, (VkAccelerationStructureGeometryDataKHR*)(&to->geometry));
 }
 
 void deepcopy_VkAccelerationStructureBuildGeometryInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureBuildGeometryInfoKHR* from,
     VkAccelerationStructureBuildGeometryInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pGeometries = nullptr;
         if (from->pGeometries)
         {
-            to->pGeometries = (VkAccelerationStructureGeometryKHR*)pool->alloc(from->geometryCount * sizeof(const VkAccelerationStructureGeometryKHR));
+            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(pool, from->pGeometries + i, (VkAccelerationStructureGeometryKHR*)(to->pGeometries + i));
+                deepcopy_VkAccelerationStructureGeometryKHR(alloc, rootType, from->pGeometries + i, (VkAccelerationStructureGeometryKHR*)(to->pGeometries + i));
             }
         }
     }
-    deepcopy_VkDeviceOrHostAddressKHR(pool, &from->scratchData, (VkDeviceOrHostAddressKHR*)(&to->scratchData));
+    deepcopy_VkDeviceOrHostAddressKHR(alloc, rootType, &from->scratchData, (VkDeviceOrHostAddressKHR*)(&to->scratchData));
 }
 
 void deepcopy_VkAccelerationStructureCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureCreateInfoKHR* from,
     VkAccelerationStructureCreateInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkWriteDescriptorSetAccelerationStructureKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkWriteDescriptorSetAccelerationStructureKHR* from,
     VkWriteDescriptorSetAccelerationStructureKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pAccelerationStructures = nullptr;
     if (from->pAccelerationStructures)
     {
-        to->pAccelerationStructures = (VkAccelerationStructureKHR*)pool->dupArray(from->pAccelerationStructures, from->accelerationStructureCount * sizeof(const VkAccelerationStructureKHR));
+        to->pAccelerationStructures = (VkAccelerationStructureKHR*)alloc->dupArray(from->pAccelerationStructures, from->accelerationStructureCount * sizeof(const VkAccelerationStructureKHR));
     }
 }
 
 void deepcopy_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceAccelerationStructureFeaturesKHR* from,
     VkPhysicalDeviceAccelerationStructureFeaturesKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceAccelerationStructurePropertiesKHR* from,
     VkPhysicalDeviceAccelerationStructurePropertiesKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkAccelerationStructureDeviceAddressInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureDeviceAddressInfoKHR* from,
     VkAccelerationStructureDeviceAddressInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkAccelerationStructureVersionInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureVersionInfoKHR* from,
     VkAccelerationStructureVersionInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const 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*)pool->dupArray(from->pVersionData, 2*VK_UUID_SIZE * sizeof(const uint8_t));
+        to->pVersionData = (uint8_t*)alloc->dupArray(from->pVersionData, 2*VK_UUID_SIZE * sizeof(const uint8_t));
     }
 }
 
 void deepcopy_VkCopyAccelerationStructureToMemoryInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCopyAccelerationStructureToMemoryInfoKHR* from,
     VkCopyAccelerationStructureToMemoryInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkDeviceOrHostAddressKHR(pool, &from->dst, (VkDeviceOrHostAddressKHR*)(&to->dst));
+    deepcopy_VkDeviceOrHostAddressKHR(alloc, rootType, &from->dst, (VkDeviceOrHostAddressKHR*)(&to->dst));
 }
 
 void deepcopy_VkCopyMemoryToAccelerationStructureInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCopyMemoryToAccelerationStructureInfoKHR* from,
     VkCopyMemoryToAccelerationStructureInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkDeviceOrHostAddressConstKHR(pool, &from->src, (VkDeviceOrHostAddressConstKHR*)(&to->src));
+    deepcopy_VkDeviceOrHostAddressConstKHR(alloc, rootType, &from->src, (VkDeviceOrHostAddressConstKHR*)(&to->src));
 }
 
 void deepcopy_VkCopyAccelerationStructureInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCopyAccelerationStructureInfoKHR* from,
     VkCopyAccelerationStructureInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkAccelerationStructureBuildSizesInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureBuildSizesInfoKHR* from,
     VkAccelerationStructureBuildSizesInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
 void deepcopy_VkRayTracingShaderGroupCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRayTracingShaderGroupCreateInfoKHR* from,
     VkRayTracingShaderGroupCreateInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pShaderGroupCaptureReplayHandle = nullptr;
     if (from->pShaderGroupCaptureReplayHandle)
     {
-        to->pShaderGroupCaptureReplayHandle = (void*)pool->dupArray(from->pShaderGroupCaptureReplayHandle, sizeof(const uint8_t));
+        to->pShaderGroupCaptureReplayHandle = (void*)alloc->dupArray(from->pShaderGroupCaptureReplayHandle, sizeof(const uint8_t));
     }
 }
 
 void deepcopy_VkRayTracingPipelineInterfaceCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRayTracingPipelineInterfaceCreateInfoKHR* from,
     VkRayTracingPipelineInterfaceCreateInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkRayTracingPipelineCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRayTracingPipelineCreateInfoKHR* from,
     VkRayTracingPipelineCreateInfoKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (const void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (const void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     if (from)
     {
         to->pStages = nullptr;
         if (from->pStages)
         {
-            to->pStages = (VkPipelineShaderStageCreateInfo*)pool->alloc(from->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
+            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(pool, from->pStages + i, (VkPipelineShaderStageCreateInfo*)(to->pStages + i));
+                deepcopy_VkPipelineShaderStageCreateInfo(alloc, rootType, from->pStages + i, (VkPipelineShaderStageCreateInfo*)(to->pStages + i));
             }
         }
     }
@@ -13672,123 +16792,146 @@
         to->pGroups = nullptr;
         if (from->pGroups)
         {
-            to->pGroups = (VkRayTracingShaderGroupCreateInfoKHR*)pool->alloc(from->groupCount * sizeof(const VkRayTracingShaderGroupCreateInfoKHR));
+            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(pool, from->pGroups + i, (VkRayTracingShaderGroupCreateInfoKHR*)(to->pGroups + i));
+                deepcopy_VkRayTracingShaderGroupCreateInfoKHR(alloc, rootType, from->pGroups + i, (VkRayTracingShaderGroupCreateInfoKHR*)(to->pGroups + i));
             }
         }
     }
     to->pLibraryInfo = nullptr;
     if (from->pLibraryInfo)
     {
-        to->pLibraryInfo = (VkPipelineLibraryCreateInfoKHR*)pool->alloc(sizeof(const VkPipelineLibraryCreateInfoKHR));
-        deepcopy_VkPipelineLibraryCreateInfoKHR(pool, from->pLibraryInfo, (VkPipelineLibraryCreateInfoKHR*)(to->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*)pool->alloc(sizeof(const VkRayTracingPipelineInterfaceCreateInfoKHR));
-        deepcopy_VkRayTracingPipelineInterfaceCreateInfoKHR(pool, from->pLibraryInterface, (VkRayTracingPipelineInterfaceCreateInfoKHR*)(to->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*)pool->alloc(sizeof(const VkPipelineDynamicStateCreateInfo));
-        deepcopy_VkPipelineDynamicStateCreateInfo(pool, from->pDynamicState, (VkPipelineDynamicStateCreateInfo*)(to->pDynamicState));
+        to->pDynamicState = (VkPipelineDynamicStateCreateInfo*)alloc->alloc(sizeof(const VkPipelineDynamicStateCreateInfo));
+        deepcopy_VkPipelineDynamicStateCreateInfo(alloc, rootType, from->pDynamicState, (VkPipelineDynamicStateCreateInfo*)(to->pDynamicState));
     }
 }
 
 void deepcopy_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPipelineFeaturesKHR* from,
     VkPhysicalDeviceRayTracingPipelineFeaturesKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPipelinePropertiesKHR* from,
     VkPhysicalDeviceRayTracingPipelinePropertiesKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkStridedDeviceAddressRegionKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkStridedDeviceAddressRegionKHR* from,
     VkStridedDeviceAddressRegionKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkTraceRaysIndirectCommandKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkTraceRaysIndirectCommandKHR* from,
     VkTraceRaysIndirectCommandKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
 }
 
 #endif
 #ifdef VK_KHR_ray_query
 void deepcopy_VkPhysicalDeviceRayQueryFeaturesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayQueryFeaturesKHR* from,
     VkPhysicalDeviceRayQueryFeaturesKHR* to)
 {
-    (void)pool;
+    (void)alloc;
+    (void)rootType;
     *to = *from;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = from->sType;
+    }
     const void* from_pNext = from;
     size_t pNext_size = 0u;
     while (!pNext_size && from_pNext)
     {
         from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(from_pNext);
+        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
     }
     to->pNext = nullptr;
     if (pNext_size)
     {
-        to->pNext = (void*)pool->alloc(pNext_size);
-        deepcopy_extension_struct(pool, from_pNext, (void*)(to->pNext));
+        to->pNext = (void*)alloc->alloc(pNext_size);
+        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
 void deepcopy_extension_struct(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const void* structExtension,
     void* structExtension_out)
 {
@@ -13802,1535 +16945,1613 @@
 #ifdef VK_VERSION_1_1
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES:
         {
-            deepcopy_VkPhysicalDeviceSubgroupProperties(pool, reinterpret_cast<const VkPhysicalDeviceSubgroupProperties*>(structExtension), reinterpret_cast<VkPhysicalDeviceSubgroupProperties*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDevice16BitStorageFeatures*>(structExtension), reinterpret_cast<VkPhysicalDevice16BitStorageFeatures*>(structExtension_out));
+            deepcopy_VkPhysicalDevice16BitStorageFeatures(alloc, rootType, reinterpret_cast<const VkPhysicalDevice16BitStorageFeatures*>(structExtension), reinterpret_cast<VkPhysicalDevice16BitStorageFeatures*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS:
         {
-            deepcopy_VkMemoryDedicatedRequirements(pool, reinterpret_cast<const VkMemoryDedicatedRequirements*>(structExtension), reinterpret_cast<VkMemoryDedicatedRequirements*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkMemoryDedicatedAllocateInfo*>(structExtension), reinterpret_cast<VkMemoryDedicatedAllocateInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkMemoryAllocateFlagsInfo*>(structExtension), reinterpret_cast<VkMemoryAllocateFlagsInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkDeviceGroupRenderPassBeginInfo*>(structExtension), reinterpret_cast<VkDeviceGroupRenderPassBeginInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkDeviceGroupCommandBufferBeginInfo*>(structExtension), reinterpret_cast<VkDeviceGroupCommandBufferBeginInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkDeviceGroupSubmitInfo*>(structExtension), reinterpret_cast<VkDeviceGroupSubmitInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkDeviceGroupBindSparseInfo*>(structExtension), reinterpret_cast<VkDeviceGroupBindSparseInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkBindBufferMemoryDeviceGroupInfo*>(structExtension), reinterpret_cast<VkBindBufferMemoryDeviceGroupInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkBindImageMemoryDeviceGroupInfo*>(structExtension), reinterpret_cast<VkBindImageMemoryDeviceGroupInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkDeviceGroupDeviceCreateInfo*>(structExtension), reinterpret_cast<VkDeviceGroupDeviceCreateInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceFeatures2*>(structExtension), reinterpret_cast<VkPhysicalDeviceFeatures2*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDevicePointClippingProperties*>(structExtension), reinterpret_cast<VkPhysicalDevicePointClippingProperties*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkRenderPassInputAttachmentAspectCreateInfo*>(structExtension), reinterpret_cast<VkRenderPassInputAttachmentAspectCreateInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkImageViewUsageCreateInfo*>(structExtension), reinterpret_cast<VkImageViewUsageCreateInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPipelineTessellationDomainOriginStateCreateInfo*>(structExtension), reinterpret_cast<VkPipelineTessellationDomainOriginStateCreateInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkRenderPassMultiviewCreateInfo*>(structExtension), reinterpret_cast<VkRenderPassMultiviewCreateInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceMultiviewFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceMultiviewFeatures*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceMultiviewProperties*>(structExtension), reinterpret_cast<VkPhysicalDeviceMultiviewProperties*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceVariablePointersFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceVariablePointersFeatures*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceProtectedMemoryProperties*>(structExtension), reinterpret_cast<VkPhysicalDeviceProtectedMemoryProperties*>(structExtension_out));
+            deepcopy_VkPhysicalDeviceProtectedMemoryProperties(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceProtectedMemoryProperties*>(structExtension), reinterpret_cast<VkPhysicalDeviceProtectedMemoryProperties*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO:
         {
-            deepcopy_VkProtectedSubmitInfo(pool, reinterpret_cast<const VkProtectedSubmitInfo*>(structExtension), reinterpret_cast<VkProtectedSubmitInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkSamplerYcbcrConversionInfo*>(structExtension), reinterpret_cast<VkSamplerYcbcrConversionInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkBindImagePlaneMemoryInfo*>(structExtension), reinterpret_cast<VkBindImagePlaneMemoryInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkImagePlaneMemoryRequirementsInfo*>(structExtension), reinterpret_cast<VkImagePlaneMemoryRequirementsInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkSamplerYcbcrConversionImageFormatProperties*>(structExtension), reinterpret_cast<VkSamplerYcbcrConversionImageFormatProperties*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceExternalImageFormatInfo*>(structExtension), reinterpret_cast<VkPhysicalDeviceExternalImageFormatInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkExternalImageFormatProperties*>(structExtension), reinterpret_cast<VkExternalImageFormatProperties*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceIDProperties*>(structExtension), reinterpret_cast<VkPhysicalDeviceIDProperties*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkExternalMemoryImageCreateInfo*>(structExtension), reinterpret_cast<VkExternalMemoryImageCreateInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkExternalMemoryBufferCreateInfo*>(structExtension), reinterpret_cast<VkExternalMemoryBufferCreateInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkExportMemoryAllocateInfo*>(structExtension), reinterpret_cast<VkExportMemoryAllocateInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkExportFenceCreateInfo*>(structExtension), reinterpret_cast<VkExportFenceCreateInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkExportSemaphoreCreateInfo*>(structExtension), reinterpret_cast<VkExportSemaphoreCreateInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceMaintenance3Properties*>(structExtension), reinterpret_cast<VkPhysicalDeviceMaintenance3Properties*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceShaderDrawParametersFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderDrawParametersFeatures*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceVulkan11Features*>(structExtension), reinterpret_cast<VkPhysicalDeviceVulkan11Features*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceVulkan11Properties*>(structExtension), reinterpret_cast<VkPhysicalDeviceVulkan11Properties*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceVulkan12Features*>(structExtension), reinterpret_cast<VkPhysicalDeviceVulkan12Features*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceVulkan12Properties*>(structExtension), reinterpret_cast<VkPhysicalDeviceVulkan12Properties*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkImageFormatListCreateInfo*>(structExtension), reinterpret_cast<VkImageFormatListCreateInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDevice8BitStorageFeatures*>(structExtension), reinterpret_cast<VkPhysicalDevice8BitStorageFeatures*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceDriverProperties*>(structExtension), reinterpret_cast<VkPhysicalDeviceDriverProperties*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceFloatControlsProperties*>(structExtension), reinterpret_cast<VkPhysicalDeviceFloatControlsProperties*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkDescriptorSetLayoutBindingFlagsCreateInfo*>(structExtension), reinterpret_cast<VkDescriptorSetLayoutBindingFlagsCreateInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingProperties*>(structExtension), reinterpret_cast<VkPhysicalDeviceDescriptorIndexingProperties*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkDescriptorSetVariableDescriptorCountAllocateInfo*>(structExtension), reinterpret_cast<VkDescriptorSetVariableDescriptorCountAllocateInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkDescriptorSetVariableDescriptorCountLayoutSupport*>(structExtension), reinterpret_cast<VkDescriptorSetVariableDescriptorCountLayoutSupport*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkSubpassDescriptionDepthStencilResolve*>(structExtension), reinterpret_cast<VkSubpassDescriptionDepthStencilResolve*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceDepthStencilResolveProperties*>(structExtension), reinterpret_cast<VkPhysicalDeviceDepthStencilResolveProperties*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkImageStencilUsageCreateInfo*>(structExtension), reinterpret_cast<VkImageStencilUsageCreateInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkSamplerReductionModeCreateInfo*>(structExtension), reinterpret_cast<VkSamplerReductionModeCreateInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceSamplerFilterMinmaxProperties*>(structExtension), reinterpret_cast<VkPhysicalDeviceSamplerFilterMinmaxProperties*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceImagelessFramebufferFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceImagelessFramebufferFeatures*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkFramebufferAttachmentsCreateInfo*>(structExtension), reinterpret_cast<VkFramebufferAttachmentsCreateInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkRenderPassAttachmentBeginInfo*>(structExtension), reinterpret_cast<VkRenderPassAttachmentBeginInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkAttachmentReferenceStencilLayout*>(structExtension), reinterpret_cast<VkAttachmentReferenceStencilLayout*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkAttachmentDescriptionStencilLayout*>(structExtension), reinterpret_cast<VkAttachmentDescriptionStencilLayout*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceHostQueryResetFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceHostQueryResetFeatures*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreProperties*>(structExtension), reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreProperties*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkSemaphoreTypeCreateInfo*>(structExtension), reinterpret_cast<VkSemaphoreTypeCreateInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkTimelineSemaphoreSubmitInfo*>(structExtension), reinterpret_cast<VkTimelineSemaphoreSubmitInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeatures*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension), reinterpret_cast<VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension), reinterpret_cast<VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkImageSwapchainCreateInfoKHR*>(structExtension), reinterpret_cast<VkImageSwapchainCreateInfoKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkBindImageMemorySwapchainInfoKHR*>(structExtension), reinterpret_cast<VkBindImageMemorySwapchainInfoKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkDeviceGroupPresentInfoKHR*>(structExtension), reinterpret_cast<VkDeviceGroupPresentInfoKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension), reinterpret_cast<VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkDisplayPresentInfoKHR*>(structExtension), reinterpret_cast<VkDisplayPresentInfoKHR*>(structExtension_out));
+            deepcopy_VkDisplayPresentInfoKHR(alloc, rootType, reinterpret_cast<const VkDisplayPresentInfoKHR*>(structExtension), reinterpret_cast<VkDisplayPresentInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_external_memory_win32
         case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
         {
-            deepcopy_VkImportMemoryWin32HandleInfoKHR(pool, reinterpret_cast<const VkImportMemoryWin32HandleInfoKHR*>(structExtension), reinterpret_cast<VkImportMemoryWin32HandleInfoKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkExportMemoryWin32HandleInfoKHR*>(structExtension), reinterpret_cast<VkExportMemoryWin32HandleInfoKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkImportMemoryFdInfoKHR*>(structExtension), reinterpret_cast<VkImportMemoryFdInfoKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension), reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkExportSemaphoreWin32HandleInfoKHR*>(structExtension), reinterpret_cast<VkExportSemaphoreWin32HandleInfoKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkD3D12FenceSubmitInfoKHR*>(structExtension), reinterpret_cast<VkD3D12FenceSubmitInfoKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDevicePushDescriptorPropertiesKHR*>(structExtension), reinterpret_cast<VkPhysicalDevicePushDescriptorPropertiesKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPresentRegionsKHR*>(structExtension), reinterpret_cast<VkPresentRegionsKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension), reinterpret_cast<VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkExportFenceWin32HandleInfoKHR*>(structExtension), reinterpret_cast<VkExportFenceWin32HandleInfoKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDevicePerformanceQueryFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDevicePerformanceQueryFeaturesKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDevicePerformanceQueryPropertiesKHR*>(structExtension), reinterpret_cast<VkPhysicalDevicePerformanceQueryPropertiesKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkQueryPoolPerformanceCreateInfoKHR*>(structExtension), reinterpret_cast<VkQueryPoolPerformanceCreateInfoKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPerformanceQuerySubmitInfoKHR*>(structExtension), reinterpret_cast<VkPerformanceQuerySubmitInfoKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(structExtension), reinterpret_cast<VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkFragmentShadingRateAttachmentInfoKHR*>(structExtension), reinterpret_cast<VkFragmentShadingRateAttachmentInfoKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPipelineFragmentShadingRateStateCreateInfoKHR*>(structExtension), reinterpret_cast<VkPipelineFragmentShadingRateStateCreateInfoKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkSurfaceProtectedCapabilitiesKHR*>(structExtension), reinterpret_cast<VkSurfaceProtectedCapabilitiesKHR*>(structExtension_out));
+            deepcopy_VkSurfaceProtectedCapabilitiesKHR(alloc, rootType, reinterpret_cast<const VkSurfaceProtectedCapabilitiesKHR*>(structExtension), reinterpret_cast<VkSurfaceProtectedCapabilitiesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR:
         {
-            deepcopy_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(pool, reinterpret_cast<const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(structExtension_out));
+            deepcopy_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_ANDROID_native_buffer
         case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID:
         {
-            deepcopy_VkNativeBufferANDROID(pool, reinterpret_cast<const VkNativeBufferANDROID*>(structExtension), reinterpret_cast<VkNativeBufferANDROID*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkDebugReportCallbackCreateInfoEXT*>(structExtension), reinterpret_cast<VkDebugReportCallbackCreateInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPipelineRasterizationStateRasterizationOrderAMD*>(structExtension), reinterpret_cast<VkPipelineRasterizationStateRasterizationOrderAMD*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkDedicatedAllocationImageCreateInfoNV*>(structExtension), reinterpret_cast<VkDedicatedAllocationImageCreateInfoNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkDedicatedAllocationBufferCreateInfoNV*>(structExtension), reinterpret_cast<VkDedicatedAllocationBufferCreateInfoNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension), reinterpret_cast<VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPipelineRasterizationStateStreamCreateInfoEXT*>(structExtension), reinterpret_cast<VkPipelineRasterizationStateStreamCreateInfoEXT*>(structExtension_out));
+            deepcopy_VkPipelineRasterizationStateStreamCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkPipelineRasterizationStateStreamCreateInfoEXT*>(structExtension), reinterpret_cast<VkPipelineRasterizationStateStreamCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
         case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD:
         {
-            deepcopy_VkTextureLODGatherFormatPropertiesAMD(pool, reinterpret_cast<const VkTextureLODGatherFormatPropertiesAMD*>(structExtension), reinterpret_cast<VkTextureLODGatherFormatPropertiesAMD*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceCornerSampledImageFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceCornerSampledImageFeaturesNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkExternalMemoryImageCreateInfoNV*>(structExtension), reinterpret_cast<VkExternalMemoryImageCreateInfoNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkExportMemoryAllocateInfoNV*>(structExtension), reinterpret_cast<VkExportMemoryAllocateInfoNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkImportMemoryWin32HandleInfoNV*>(structExtension), reinterpret_cast<VkImportMemoryWin32HandleInfoNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkExportMemoryWin32HandleInfoNV*>(structExtension), reinterpret_cast<VkExportMemoryWin32HandleInfoNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension), reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkValidationFlagsEXT*>(structExtension), reinterpret_cast<VkValidationFlagsEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkImageViewASTCDecodeModeEXT*>(structExtension), reinterpret_cast<VkImageViewASTCDecodeModeEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(structExtension), reinterpret_cast<VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPipelineViewportWScalingStateCreateInfoNV*>(structExtension), reinterpret_cast<VkPipelineViewportWScalingStateCreateInfoNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkSwapchainCounterCreateInfoEXT*>(structExtension), reinterpret_cast<VkSwapchainCounterCreateInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPresentTimesInfoGOOGLE*>(structExtension), reinterpret_cast<VkPresentTimesInfoGOOGLE*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(structExtension), reinterpret_cast<VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension), reinterpret_cast<VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPipelineDiscardRectangleStateCreateInfoEXT*>(structExtension), reinterpret_cast<VkPipelineDiscardRectangleStateCreateInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPipelineRasterizationConservativeStateCreateInfoEXT*>(structExtension), reinterpret_cast<VkPipelineRasterizationConservativeStateCreateInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(structExtension), reinterpret_cast<VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkDebugUtilsMessengerCreateInfoEXT*>(structExtension), reinterpret_cast<VkDebugUtilsMessengerCreateInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkAndroidHardwareBufferUsageANDROID*>(structExtension), reinterpret_cast<VkAndroidHardwareBufferUsageANDROID*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkAndroidHardwareBufferFormatPropertiesANDROID*>(structExtension), reinterpret_cast<VkAndroidHardwareBufferFormatPropertiesANDROID*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkImportAndroidHardwareBufferInfoANDROID*>(structExtension), reinterpret_cast<VkImportAndroidHardwareBufferInfoANDROID*>(structExtension_out));
+            deepcopy_VkImportAndroidHardwareBufferInfoANDROID(alloc, rootType, reinterpret_cast<const VkImportAndroidHardwareBufferInfoANDROID*>(structExtension), reinterpret_cast<VkImportAndroidHardwareBufferInfoANDROID*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID:
         {
-            deepcopy_VkExternalFormatANDROID(pool, reinterpret_cast<const VkExternalFormatANDROID*>(structExtension), reinterpret_cast<VkExternalFormatANDROID*>(structExtension_out));
+            deepcopy_VkExternalFormatANDROID(alloc, rootType, reinterpret_cast<const VkExternalFormatANDROID*>(structExtension), reinterpret_cast<VkExternalFormatANDROID*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_inline_uniform_block
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT:
         {
-            deepcopy_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(pool, reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension), reinterpret_cast<VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(structExtension), reinterpret_cast<VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkSampleLocationsInfoEXT*>(structExtension), reinterpret_cast<VkSampleLocationsInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension), reinterpret_cast<VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPipelineSampleLocationsStateCreateInfoEXT*>(structExtension), reinterpret_cast<VkPipelineSampleLocationsStateCreateInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceSampleLocationsPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceSampleLocationsPropertiesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(structExtension), reinterpret_cast<VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension), reinterpret_cast<VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPipelineCoverageModulationStateCreateInfoNV*>(structExtension), reinterpret_cast<VkPipelineCoverageModulationStateCreateInfoNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkDrmFormatModifierPropertiesListEXT*>(structExtension), reinterpret_cast<VkDrmFormatModifierPropertiesListEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension), reinterpret_cast<VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkImageDrmFormatModifierExplicitCreateInfoEXT*>(structExtension), reinterpret_cast<VkImageDrmFormatModifierExplicitCreateInfoEXT*>(structExtension_out));
+            deepcopy_VkImageDrmFormatModifierExplicitCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkImageDrmFormatModifierExplicitCreateInfoEXT*>(structExtension), reinterpret_cast<VkImageDrmFormatModifierExplicitCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_validation_cache
         case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT:
         {
-            deepcopy_VkShaderModuleValidationCacheCreateInfoEXT(pool, reinterpret_cast<const VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension), reinterpret_cast<VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPipelineViewportShadingRateImageStateCreateInfoNV*>(structExtension), reinterpret_cast<VkPipelineViewportShadingRateImageStateCreateInfoNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceShadingRateImagePropertiesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceShadingRateImagePropertiesNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(structExtension), reinterpret_cast<VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureNV*>(structExtension), reinterpret_cast<VkWriteDescriptorSetAccelerationStructureNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(structExtension), reinterpret_cast<VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceImageViewImageFormatInfoEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceImageViewImageFormatInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkFilterCubicImageViewImageFormatPropertiesEXT*>(structExtension), reinterpret_cast<VkFilterCubicImageViewImageFormatPropertiesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension), reinterpret_cast<VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkImportMemoryHostPointerInfoEXT*>(structExtension), reinterpret_cast<VkImportMemoryHostPointerInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPipelineCompilerControlCreateInfoAMD*>(structExtension), reinterpret_cast<VkPipelineCompilerControlCreateInfoAMD*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension_out));
+            deepcopy_VkPhysicalDeviceShaderCorePropertiesAMD(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
         case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD:
         {
-            deepcopy_VkDeviceMemoryOverallocationCreateInfoAMD(pool, reinterpret_cast<const VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension), reinterpret_cast<VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPipelineVertexInputDivisorStateCreateInfoEXT*>(structExtension), reinterpret_cast<VkPipelineVertexInputDivisorStateCreateInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPresentFrameTokenGGP*>(structExtension), reinterpret_cast<VkPresentFrameTokenGGP*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension), reinterpret_cast<VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(structExtension), reinterpret_cast<VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceExclusiveScissorFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceExclusiveScissorFeaturesNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkQueueFamilyCheckpointPropertiesNV*>(structExtension), reinterpret_cast<VkQueueFamilyCheckpointPropertiesNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkQueryPoolPerformanceQueryCreateInfoINTEL*>(structExtension), reinterpret_cast<VkQueryPoolPerformanceQueryCreateInfoINTEL*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension), reinterpret_cast<VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension), reinterpret_cast<VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension_out));
+            deepcopy_VkSwapchainDisplayNativeHdrCreateInfoAMD(alloc, rootType, reinterpret_cast<const VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension), reinterpret_cast<VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension_out));
             break;
         }
 #endif
-#ifdef VK_GOOGLE_color_buffer
-        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE:
+#ifdef VK_EXT_fragment_density_map
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT:
         {
-            deepcopy_VkImportColorBufferGOOGLE(pool, reinterpret_cast<const VkImportColorBufferGOOGLE*>(structExtension), reinterpret_cast<VkImportColorBufferGOOGLE*>(structExtension_out));
+            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));
+                    break;
+                }
+                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));
+                    break;
+                }
+            }
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE:
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT:
         {
-            deepcopy_VkImportBufferGOOGLE(pool, reinterpret_cast<const VkImportBufferGOOGLE*>(structExtension), reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out));
+            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));
+                    break;
+                }
+                default:
+                {
+                    deepcopy_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension_out));
+                    break;
+                }
+            }
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
+        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT:
         {
-            deepcopy_VkImportPhysicalAddressGOOGLE(pool, reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension), reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
+            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));
+                    break;
+                }
+                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));
+                    break;
+                }
+            }
             break;
         }
 #endif
 #ifdef VK_EXT_subgroup_size_control
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT:
         {
-            deepcopy_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(pool, reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(structExtension), reinterpret_cast<VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension), reinterpret_cast<VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkMemoryPriorityAllocateInfoEXT*>(structExtension), reinterpret_cast<VkMemoryPriorityAllocateInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkBufferDeviceAddressCreateInfoEXT*>(structExtension), reinterpret_cast<VkBufferDeviceAddressCreateInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkValidationFeaturesEXT*>(structExtension), reinterpret_cast<VkValidationFeaturesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPipelineCoverageReductionStateCreateInfoNV*>(structExtension), reinterpret_cast<VkPipelineCoverageReductionStateCreateInfoNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(structExtension_out));
+            deepcopy_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_full_screen_exclusive
         case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT:
         {
-            deepcopy_VkSurfaceFullScreenExclusiveInfoEXT(pool, reinterpret_cast<const VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension), reinterpret_cast<VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(structExtension), reinterpret_cast<VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension), reinterpret_cast<VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceLineRasterizationFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceLineRasterizationFeaturesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceLineRasterizationPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceLineRasterizationPropertiesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPipelineRasterizationLineStateCreateInfoEXT*>(structExtension), reinterpret_cast<VkPipelineRasterizationLineStateCreateInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(structExtension_out));
+            deepcopy_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(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(pool, reinterpret_cast<const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension), reinterpret_cast<VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension_out));
+            deepcopy_VkGraphicsPipelineShaderGroupsCreateInfoNV(alloc, rootType, reinterpret_cast<const VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension), reinterpret_cast<VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_texel_buffer_alignment
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT:
         {
-            deepcopy_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(pool, reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkRenderPassTransformBeginInfoQCOM*>(structExtension), reinterpret_cast<VkRenderPassTransformBeginInfoQCOM*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(structExtension), reinterpret_cast<VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension), reinterpret_cast<VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension), reinterpret_cast<VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkDevicePrivateDataCreateInfoEXT*>(structExtension), reinterpret_cast<VkDevicePrivateDataCreateInfoEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension), reinterpret_cast<VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(structExtension), reinterpret_cast<VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(structExtension_out));
+            deepcopy_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(alloc, rootType, reinterpret_cast<const VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(structExtension), reinterpret_cast<VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_density_map2
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT:
         {
-            deepcopy_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(pool, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkCopyCommandTransformInfoQCOM*>(structExtension), reinterpret_cast<VkCopyCommandTransformInfoQCOM*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceImageRobustnessFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceImageRobustnessFeaturesEXT*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension_out));
+            deepcopy_VkPhysicalDevice4444FormatsFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDevice4444FormatsFeaturesEXT*>(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));
+            break;
+        }
+        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));
             break;
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
         case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR:
         {
-            deepcopy_VkWriteDescriptorSetAccelerationStructureKHR(pool, reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureKHR*>(structExtension), reinterpret_cast<VkWriteDescriptorSetAccelerationStructureKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(structExtension_out));
+            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(pool, reinterpret_cast<const VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension_out));
+            deepcopy_VkPhysicalDeviceRayQueryFeaturesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension_out));
             break;
         }
 #endif
diff --git a/system/vulkan_enc/goldfish_vk_deepcopy_guest.h b/system/vulkan_enc/goldfish_vk_deepcopy_guest.h
index ef555eb..d1e8c10 100644
--- a/system/vulkan_enc/goldfish_vk_deepcopy_guest.h
+++ b/system/vulkan_enc/goldfish_vk_deepcopy_guest.h
@@ -31,6 +31,7 @@
 
 #include "goldfish_vk_private_defs.h"
 #include "android/base/BumpPool.h"
+using android::base::Allocator;
 using android::base::BumpPool;
 // Stuff we are not going to use but if included,
 // will cause compile errors. These are Android Vulkan
@@ -44,891 +45,1068 @@
 
 #ifdef VK_VERSION_1_0
 void deepcopy_VkExtent2D(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExtent2D* from,
     VkExtent2D* to);
 
 void deepcopy_VkExtent3D(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExtent3D* from,
     VkExtent3D* to);
 
 void deepcopy_VkOffset2D(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkOffset2D* from,
     VkOffset2D* to);
 
 void deepcopy_VkOffset3D(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkOffset3D* from,
     VkOffset3D* to);
 
 void deepcopy_VkRect2D(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRect2D* from,
     VkRect2D* to);
 
 void deepcopy_VkBaseInStructure(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBaseInStructure* from,
     VkBaseInStructure* to);
 
 void deepcopy_VkBaseOutStructure(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBaseOutStructure* from,
     VkBaseOutStructure* to);
 
 void deepcopy_VkBufferMemoryBarrier(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBufferMemoryBarrier* from,
     VkBufferMemoryBarrier* to);
 
 void deepcopy_VkDispatchIndirectCommand(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDispatchIndirectCommand* from,
     VkDispatchIndirectCommand* to);
 
 void deepcopy_VkDrawIndexedIndirectCommand(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDrawIndexedIndirectCommand* from,
     VkDrawIndexedIndirectCommand* to);
 
 void deepcopy_VkDrawIndirectCommand(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDrawIndirectCommand* from,
     VkDrawIndirectCommand* to);
 
 void deepcopy_VkImageSubresourceRange(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageSubresourceRange* from,
     VkImageSubresourceRange* to);
 
 void deepcopy_VkImageMemoryBarrier(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageMemoryBarrier* from,
     VkImageMemoryBarrier* to);
 
 void deepcopy_VkMemoryBarrier(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryBarrier* from,
     VkMemoryBarrier* to);
 
 void deepcopy_VkAllocationCallbacks(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAllocationCallbacks* from,
     VkAllocationCallbacks* to);
 
 void deepcopy_VkApplicationInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkApplicationInfo* from,
     VkApplicationInfo* to);
 
 void deepcopy_VkFormatProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkFormatProperties* from,
     VkFormatProperties* to);
 
 void deepcopy_VkImageFormatProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageFormatProperties* from,
     VkImageFormatProperties* to);
 
 void deepcopy_VkInstanceCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkInstanceCreateInfo* from,
     VkInstanceCreateInfo* to);
 
 void deepcopy_VkMemoryHeap(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryHeap* from,
     VkMemoryHeap* to);
 
 void deepcopy_VkMemoryType(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryType* from,
     VkMemoryType* to);
 
 void deepcopy_VkPhysicalDeviceFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceFeatures* from,
     VkPhysicalDeviceFeatures* to);
 
 void deepcopy_VkPhysicalDeviceLimits(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceLimits* from,
     VkPhysicalDeviceLimits* to);
 
 void deepcopy_VkPhysicalDeviceMemoryProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryProperties* from,
     VkPhysicalDeviceMemoryProperties* to);
 
 void deepcopy_VkPhysicalDeviceSparseProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceSparseProperties* from,
     VkPhysicalDeviceSparseProperties* to);
 
 void deepcopy_VkPhysicalDeviceProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceProperties* from,
     VkPhysicalDeviceProperties* to);
 
 void deepcopy_VkQueueFamilyProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkQueueFamilyProperties* from,
     VkQueueFamilyProperties* to);
 
 void deepcopy_VkDeviceQueueCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceQueueCreateInfo* from,
     VkDeviceQueueCreateInfo* to);
 
 void deepcopy_VkDeviceCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceCreateInfo* from,
     VkDeviceCreateInfo* to);
 
 void deepcopy_VkExtensionProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExtensionProperties* from,
     VkExtensionProperties* to);
 
 void deepcopy_VkLayerProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkLayerProperties* from,
     VkLayerProperties* to);
 
 void deepcopy_VkSubmitInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSubmitInfo* from,
     VkSubmitInfo* to);
 
 void deepcopy_VkMappedMemoryRange(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMappedMemoryRange* from,
     VkMappedMemoryRange* to);
 
 void deepcopy_VkMemoryAllocateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryAllocateInfo* from,
     VkMemoryAllocateInfo* to);
 
 void deepcopy_VkMemoryRequirements(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryRequirements* from,
     VkMemoryRequirements* to);
 
 void deepcopy_VkSparseMemoryBind(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSparseMemoryBind* from,
     VkSparseMemoryBind* to);
 
 void deepcopy_VkSparseBufferMemoryBindInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSparseBufferMemoryBindInfo* from,
     VkSparseBufferMemoryBindInfo* to);
 
 void deepcopy_VkSparseImageOpaqueMemoryBindInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSparseImageOpaqueMemoryBindInfo* from,
     VkSparseImageOpaqueMemoryBindInfo* to);
 
 void deepcopy_VkImageSubresource(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageSubresource* from,
     VkImageSubresource* to);
 
 void deepcopy_VkSparseImageMemoryBind(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSparseImageMemoryBind* from,
     VkSparseImageMemoryBind* to);
 
 void deepcopy_VkSparseImageMemoryBindInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSparseImageMemoryBindInfo* from,
     VkSparseImageMemoryBindInfo* to);
 
 void deepcopy_VkBindSparseInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBindSparseInfo* from,
     VkBindSparseInfo* to);
 
 void deepcopy_VkSparseImageFormatProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSparseImageFormatProperties* from,
     VkSparseImageFormatProperties* to);
 
 void deepcopy_VkSparseImageMemoryRequirements(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSparseImageMemoryRequirements* from,
     VkSparseImageMemoryRequirements* to);
 
 void deepcopy_VkFenceCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkFenceCreateInfo* from,
     VkFenceCreateInfo* to);
 
 void deepcopy_VkSemaphoreCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSemaphoreCreateInfo* from,
     VkSemaphoreCreateInfo* to);
 
 void deepcopy_VkEventCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkEventCreateInfo* from,
     VkEventCreateInfo* to);
 
 void deepcopy_VkQueryPoolCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkQueryPoolCreateInfo* from,
     VkQueryPoolCreateInfo* to);
 
 void deepcopy_VkBufferCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBufferCreateInfo* from,
     VkBufferCreateInfo* to);
 
 void deepcopy_VkBufferViewCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBufferViewCreateInfo* from,
     VkBufferViewCreateInfo* to);
 
 void deepcopy_VkImageCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageCreateInfo* from,
     VkImageCreateInfo* to);
 
 void deepcopy_VkSubresourceLayout(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSubresourceLayout* from,
     VkSubresourceLayout* to);
 
 void deepcopy_VkComponentMapping(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkComponentMapping* from,
     VkComponentMapping* to);
 
 void deepcopy_VkImageViewCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageViewCreateInfo* from,
     VkImageViewCreateInfo* to);
 
 void deepcopy_VkShaderModuleCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkShaderModuleCreateInfo* from,
     VkShaderModuleCreateInfo* to);
 
 void deepcopy_VkPipelineCacheCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineCacheCreateInfo* from,
     VkPipelineCacheCreateInfo* to);
 
 void deepcopy_VkSpecializationMapEntry(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSpecializationMapEntry* from,
     VkSpecializationMapEntry* to);
 
 void deepcopy_VkSpecializationInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSpecializationInfo* from,
     VkSpecializationInfo* to);
 
 void deepcopy_VkPipelineShaderStageCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineShaderStageCreateInfo* from,
     VkPipelineShaderStageCreateInfo* to);
 
 void deepcopy_VkComputePipelineCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkComputePipelineCreateInfo* from,
     VkComputePipelineCreateInfo* to);
 
 void deepcopy_VkVertexInputBindingDescription(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkVertexInputBindingDescription* from,
     VkVertexInputBindingDescription* to);
 
 void deepcopy_VkVertexInputAttributeDescription(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkVertexInputAttributeDescription* from,
     VkVertexInputAttributeDescription* to);
 
 void deepcopy_VkPipelineVertexInputStateCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineVertexInputStateCreateInfo* from,
     VkPipelineVertexInputStateCreateInfo* to);
 
 void deepcopy_VkPipelineInputAssemblyStateCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineInputAssemblyStateCreateInfo* from,
     VkPipelineInputAssemblyStateCreateInfo* to);
 
 void deepcopy_VkPipelineTessellationStateCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineTessellationStateCreateInfo* from,
     VkPipelineTessellationStateCreateInfo* to);
 
 void deepcopy_VkViewport(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkViewport* from,
     VkViewport* to);
 
 void deepcopy_VkPipelineViewportStateCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineViewportStateCreateInfo* from,
     VkPipelineViewportStateCreateInfo* to);
 
 void deepcopy_VkPipelineRasterizationStateCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineRasterizationStateCreateInfo* from,
     VkPipelineRasterizationStateCreateInfo* to);
 
 void deepcopy_VkPipelineMultisampleStateCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineMultisampleStateCreateInfo* from,
     VkPipelineMultisampleStateCreateInfo* to);
 
 void deepcopy_VkStencilOpState(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkStencilOpState* from,
     VkStencilOpState* to);
 
 void deepcopy_VkPipelineDepthStencilStateCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineDepthStencilStateCreateInfo* from,
     VkPipelineDepthStencilStateCreateInfo* to);
 
 void deepcopy_VkPipelineColorBlendAttachmentState(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineColorBlendAttachmentState* from,
     VkPipelineColorBlendAttachmentState* to);
 
 void deepcopy_VkPipelineColorBlendStateCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineColorBlendStateCreateInfo* from,
     VkPipelineColorBlendStateCreateInfo* to);
 
 void deepcopy_VkPipelineDynamicStateCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineDynamicStateCreateInfo* from,
     VkPipelineDynamicStateCreateInfo* to);
 
 void deepcopy_VkGraphicsPipelineCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkGraphicsPipelineCreateInfo* from,
     VkGraphicsPipelineCreateInfo* to);
 
 void deepcopy_VkPushConstantRange(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPushConstantRange* from,
     VkPushConstantRange* to);
 
 void deepcopy_VkPipelineLayoutCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineLayoutCreateInfo* from,
     VkPipelineLayoutCreateInfo* to);
 
 void deepcopy_VkSamplerCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSamplerCreateInfo* from,
     VkSamplerCreateInfo* to);
 
 void deepcopy_VkCopyDescriptorSet(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCopyDescriptorSet* from,
     VkCopyDescriptorSet* to);
 
 void deepcopy_VkDescriptorBufferInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorBufferInfo* from,
     VkDescriptorBufferInfo* to);
 
 void deepcopy_VkDescriptorImageInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorImageInfo* from,
     VkDescriptorImageInfo* to);
 
 void deepcopy_VkDescriptorPoolSize(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorPoolSize* from,
     VkDescriptorPoolSize* to);
 
 void deepcopy_VkDescriptorPoolCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorPoolCreateInfo* from,
     VkDescriptorPoolCreateInfo* to);
 
 void deepcopy_VkDescriptorSetAllocateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorSetAllocateInfo* from,
     VkDescriptorSetAllocateInfo* to);
 
 void deepcopy_VkDescriptorSetLayoutBinding(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutBinding* from,
     VkDescriptorSetLayoutBinding* to);
 
 void deepcopy_VkDescriptorSetLayoutCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutCreateInfo* from,
     VkDescriptorSetLayoutCreateInfo* to);
 
 void deepcopy_VkWriteDescriptorSet(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkWriteDescriptorSet* from,
     VkWriteDescriptorSet* to);
 
 void deepcopy_VkAttachmentDescription(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAttachmentDescription* from,
     VkAttachmentDescription* to);
 
 void deepcopy_VkAttachmentReference(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAttachmentReference* from,
     VkAttachmentReference* to);
 
 void deepcopy_VkFramebufferCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkFramebufferCreateInfo* from,
     VkFramebufferCreateInfo* to);
 
 void deepcopy_VkSubpassDescription(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSubpassDescription* from,
     VkSubpassDescription* to);
 
 void deepcopy_VkSubpassDependency(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSubpassDependency* from,
     VkSubpassDependency* to);
 
 void deepcopy_VkRenderPassCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRenderPassCreateInfo* from,
     VkRenderPassCreateInfo* to);
 
 void deepcopy_VkCommandPoolCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCommandPoolCreateInfo* from,
     VkCommandPoolCreateInfo* to);
 
 void deepcopy_VkCommandBufferAllocateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCommandBufferAllocateInfo* from,
     VkCommandBufferAllocateInfo* to);
 
 void deepcopy_VkCommandBufferInheritanceInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCommandBufferInheritanceInfo* from,
     VkCommandBufferInheritanceInfo* to);
 
 void deepcopy_VkCommandBufferBeginInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCommandBufferBeginInfo* from,
     VkCommandBufferBeginInfo* to);
 
 void deepcopy_VkBufferCopy(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBufferCopy* from,
     VkBufferCopy* to);
 
 void deepcopy_VkImageSubresourceLayers(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageSubresourceLayers* from,
     VkImageSubresourceLayers* to);
 
 void deepcopy_VkBufferImageCopy(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBufferImageCopy* from,
     VkBufferImageCopy* to);
 
 void deepcopy_VkClearColorValue(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkClearColorValue* from,
     VkClearColorValue* to);
 
 void deepcopy_VkClearDepthStencilValue(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkClearDepthStencilValue* from,
     VkClearDepthStencilValue* to);
 
 void deepcopy_VkClearValue(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkClearValue* from,
     VkClearValue* to);
 
 void deepcopy_VkClearAttachment(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkClearAttachment* from,
     VkClearAttachment* to);
 
 void deepcopy_VkClearRect(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkClearRect* from,
     VkClearRect* to);
 
 void deepcopy_VkImageBlit(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageBlit* from,
     VkImageBlit* to);
 
 void deepcopy_VkImageCopy(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageCopy* from,
     VkImageCopy* to);
 
 void deepcopy_VkImageResolve(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageResolve* from,
     VkImageResolve* to);
 
 void deepcopy_VkRenderPassBeginInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRenderPassBeginInfo* from,
     VkRenderPassBeginInfo* to);
 
 #endif
 #ifdef VK_VERSION_1_1
 void deepcopy_VkPhysicalDeviceSubgroupProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceSubgroupProperties* from,
     VkPhysicalDeviceSubgroupProperties* to);
 
 void deepcopy_VkBindBufferMemoryInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBindBufferMemoryInfo* from,
     VkBindBufferMemoryInfo* to);
 
 void deepcopy_VkBindImageMemoryInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBindImageMemoryInfo* from,
     VkBindImageMemoryInfo* to);
 
 void deepcopy_VkPhysicalDevice16BitStorageFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDevice16BitStorageFeatures* from,
     VkPhysicalDevice16BitStorageFeatures* to);
 
 void deepcopy_VkMemoryDedicatedRequirements(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryDedicatedRequirements* from,
     VkMemoryDedicatedRequirements* to);
 
 void deepcopy_VkMemoryDedicatedAllocateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryDedicatedAllocateInfo* from,
     VkMemoryDedicatedAllocateInfo* to);
 
 void deepcopy_VkMemoryAllocateFlagsInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryAllocateFlagsInfo* from,
     VkMemoryAllocateFlagsInfo* to);
 
 void deepcopy_VkDeviceGroupRenderPassBeginInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceGroupRenderPassBeginInfo* from,
     VkDeviceGroupRenderPassBeginInfo* to);
 
 void deepcopy_VkDeviceGroupCommandBufferBeginInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceGroupCommandBufferBeginInfo* from,
     VkDeviceGroupCommandBufferBeginInfo* to);
 
 void deepcopy_VkDeviceGroupSubmitInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceGroupSubmitInfo* from,
     VkDeviceGroupSubmitInfo* to);
 
 void deepcopy_VkDeviceGroupBindSparseInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceGroupBindSparseInfo* from,
     VkDeviceGroupBindSparseInfo* to);
 
 void deepcopy_VkBindBufferMemoryDeviceGroupInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBindBufferMemoryDeviceGroupInfo* from,
     VkBindBufferMemoryDeviceGroupInfo* to);
 
 void deepcopy_VkBindImageMemoryDeviceGroupInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBindImageMemoryDeviceGroupInfo* from,
     VkBindImageMemoryDeviceGroupInfo* to);
 
 void deepcopy_VkPhysicalDeviceGroupProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceGroupProperties* from,
     VkPhysicalDeviceGroupProperties* to);
 
 void deepcopy_VkDeviceGroupDeviceCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceGroupDeviceCreateInfo* from,
     VkDeviceGroupDeviceCreateInfo* to);
 
 void deepcopy_VkBufferMemoryRequirementsInfo2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBufferMemoryRequirementsInfo2* from,
     VkBufferMemoryRequirementsInfo2* to);
 
 void deepcopy_VkImageMemoryRequirementsInfo2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageMemoryRequirementsInfo2* from,
     VkImageMemoryRequirementsInfo2* to);
 
 void deepcopy_VkImageSparseMemoryRequirementsInfo2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageSparseMemoryRequirementsInfo2* from,
     VkImageSparseMemoryRequirementsInfo2* to);
 
 void deepcopy_VkMemoryRequirements2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryRequirements2* from,
     VkMemoryRequirements2* to);
 
 void deepcopy_VkSparseImageMemoryRequirements2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSparseImageMemoryRequirements2* from,
     VkSparseImageMemoryRequirements2* to);
 
 void deepcopy_VkPhysicalDeviceFeatures2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceFeatures2* from,
     VkPhysicalDeviceFeatures2* to);
 
 void deepcopy_VkPhysicalDeviceProperties2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceProperties2* from,
     VkPhysicalDeviceProperties2* to);
 
 void deepcopy_VkFormatProperties2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkFormatProperties2* from,
     VkFormatProperties2* to);
 
 void deepcopy_VkImageFormatProperties2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageFormatProperties2* from,
     VkImageFormatProperties2* to);
 
 void deepcopy_VkPhysicalDeviceImageFormatInfo2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageFormatInfo2* from,
     VkPhysicalDeviceImageFormatInfo2* to);
 
 void deepcopy_VkQueueFamilyProperties2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkQueueFamilyProperties2* from,
     VkQueueFamilyProperties2* to);
 
 void deepcopy_VkPhysicalDeviceMemoryProperties2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryProperties2* from,
     VkPhysicalDeviceMemoryProperties2* to);
 
 void deepcopy_VkSparseImageFormatProperties2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSparseImageFormatProperties2* from,
     VkSparseImageFormatProperties2* to);
 
 void deepcopy_VkPhysicalDeviceSparseImageFormatInfo2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceSparseImageFormatInfo2* from,
     VkPhysicalDeviceSparseImageFormatInfo2* to);
 
 void deepcopy_VkPhysicalDevicePointClippingProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDevicePointClippingProperties* from,
     VkPhysicalDevicePointClippingProperties* to);
 
 void deepcopy_VkInputAttachmentAspectReference(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkInputAttachmentAspectReference* from,
     VkInputAttachmentAspectReference* to);
 
 void deepcopy_VkRenderPassInputAttachmentAspectCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRenderPassInputAttachmentAspectCreateInfo* from,
     VkRenderPassInputAttachmentAspectCreateInfo* to);
 
 void deepcopy_VkImageViewUsageCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageViewUsageCreateInfo* from,
     VkImageViewUsageCreateInfo* to);
 
 void deepcopy_VkPipelineTessellationDomainOriginStateCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineTessellationDomainOriginStateCreateInfo* from,
     VkPipelineTessellationDomainOriginStateCreateInfo* to);
 
 void deepcopy_VkRenderPassMultiviewCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRenderPassMultiviewCreateInfo* from,
     VkRenderPassMultiviewCreateInfo* to);
 
 void deepcopy_VkPhysicalDeviceMultiviewFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceMultiviewFeatures* from,
     VkPhysicalDeviceMultiviewFeatures* to);
 
 void deepcopy_VkPhysicalDeviceMultiviewProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceMultiviewProperties* from,
     VkPhysicalDeviceMultiviewProperties* to);
 
 void deepcopy_VkPhysicalDeviceVariablePointersFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceVariablePointersFeatures* from,
     VkPhysicalDeviceVariablePointersFeatures* to);
 
 DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceVariablePointersFeatures, deepcopy_VkPhysicalDeviceVariablePointerFeatures);
 
 void deepcopy_VkPhysicalDeviceProtectedMemoryFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceProtectedMemoryFeatures* from,
     VkPhysicalDeviceProtectedMemoryFeatures* to);
 
 void deepcopy_VkPhysicalDeviceProtectedMemoryProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceProtectedMemoryProperties* from,
     VkPhysicalDeviceProtectedMemoryProperties* to);
 
 void deepcopy_VkDeviceQueueInfo2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceQueueInfo2* from,
     VkDeviceQueueInfo2* to);
 
 void deepcopy_VkProtectedSubmitInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkProtectedSubmitInfo* from,
     VkProtectedSubmitInfo* to);
 
 void deepcopy_VkSamplerYcbcrConversionCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSamplerYcbcrConversionCreateInfo* from,
     VkSamplerYcbcrConversionCreateInfo* to);
 
 void deepcopy_VkSamplerYcbcrConversionInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSamplerYcbcrConversionInfo* from,
     VkSamplerYcbcrConversionInfo* to);
 
 void deepcopy_VkBindImagePlaneMemoryInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBindImagePlaneMemoryInfo* from,
     VkBindImagePlaneMemoryInfo* to);
 
 void deepcopy_VkImagePlaneMemoryRequirementsInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImagePlaneMemoryRequirementsInfo* from,
     VkImagePlaneMemoryRequirementsInfo* to);
 
 void deepcopy_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceSamplerYcbcrConversionFeatures* from,
     VkPhysicalDeviceSamplerYcbcrConversionFeatures* to);
 
 void deepcopy_VkSamplerYcbcrConversionImageFormatProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSamplerYcbcrConversionImageFormatProperties* from,
     VkSamplerYcbcrConversionImageFormatProperties* to);
 
 void deepcopy_VkDescriptorUpdateTemplateEntry(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorUpdateTemplateEntry* from,
     VkDescriptorUpdateTemplateEntry* to);
 
 void deepcopy_VkDescriptorUpdateTemplateCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorUpdateTemplateCreateInfo* from,
     VkDescriptorUpdateTemplateCreateInfo* to);
 
 void deepcopy_VkExternalMemoryProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExternalMemoryProperties* from,
     VkExternalMemoryProperties* to);
 
 void deepcopy_VkPhysicalDeviceExternalImageFormatInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalImageFormatInfo* from,
     VkPhysicalDeviceExternalImageFormatInfo* to);
 
 void deepcopy_VkExternalImageFormatProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExternalImageFormatProperties* from,
     VkExternalImageFormatProperties* to);
 
 void deepcopy_VkPhysicalDeviceExternalBufferInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalBufferInfo* from,
     VkPhysicalDeviceExternalBufferInfo* to);
 
 void deepcopy_VkExternalBufferProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExternalBufferProperties* from,
     VkExternalBufferProperties* to);
 
 void deepcopy_VkPhysicalDeviceIDProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceIDProperties* from,
     VkPhysicalDeviceIDProperties* to);
 
 void deepcopy_VkExternalMemoryImageCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExternalMemoryImageCreateInfo* from,
     VkExternalMemoryImageCreateInfo* to);
 
 void deepcopy_VkExternalMemoryBufferCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExternalMemoryBufferCreateInfo* from,
     VkExternalMemoryBufferCreateInfo* to);
 
 void deepcopy_VkExportMemoryAllocateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExportMemoryAllocateInfo* from,
     VkExportMemoryAllocateInfo* to);
 
 void deepcopy_VkPhysicalDeviceExternalFenceInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalFenceInfo* from,
     VkPhysicalDeviceExternalFenceInfo* to);
 
 void deepcopy_VkExternalFenceProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExternalFenceProperties* from,
     VkExternalFenceProperties* to);
 
 void deepcopy_VkExportFenceCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExportFenceCreateInfo* from,
     VkExportFenceCreateInfo* to);
 
 void deepcopy_VkExportSemaphoreCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExportSemaphoreCreateInfo* from,
     VkExportSemaphoreCreateInfo* to);
 
 void deepcopy_VkPhysicalDeviceExternalSemaphoreInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalSemaphoreInfo* from,
     VkPhysicalDeviceExternalSemaphoreInfo* to);
 
 void deepcopy_VkExternalSemaphoreProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExternalSemaphoreProperties* from,
     VkExternalSemaphoreProperties* to);
 
 void deepcopy_VkPhysicalDeviceMaintenance3Properties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceMaintenance3Properties* from,
     VkPhysicalDeviceMaintenance3Properties* to);
 
 void deepcopy_VkDescriptorSetLayoutSupport(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutSupport* from,
     VkDescriptorSetLayoutSupport* to);
 
 void deepcopy_VkPhysicalDeviceShaderDrawParametersFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderDrawParametersFeatures* from,
     VkPhysicalDeviceShaderDrawParametersFeatures* to);
 
@@ -937,390 +1115,464 @@
 #endif
 #ifdef VK_VERSION_1_2
 void deepcopy_VkPhysicalDeviceVulkan11Features(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan11Features* from,
     VkPhysicalDeviceVulkan11Features* to);
 
 void deepcopy_VkPhysicalDeviceVulkan11Properties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan11Properties* from,
     VkPhysicalDeviceVulkan11Properties* to);
 
 void deepcopy_VkPhysicalDeviceVulkan12Features(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan12Features* from,
     VkPhysicalDeviceVulkan12Features* to);
 
 void deepcopy_VkConformanceVersion(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkConformanceVersion* from,
     VkConformanceVersion* to);
 
 void deepcopy_VkPhysicalDeviceVulkan12Properties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan12Properties* from,
     VkPhysicalDeviceVulkan12Properties* to);
 
 void deepcopy_VkImageFormatListCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageFormatListCreateInfo* from,
     VkImageFormatListCreateInfo* to);
 
 void deepcopy_VkAttachmentDescription2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAttachmentDescription2* from,
     VkAttachmentDescription2* to);
 
 void deepcopy_VkAttachmentReference2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAttachmentReference2* from,
     VkAttachmentReference2* to);
 
 void deepcopy_VkSubpassDescription2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSubpassDescription2* from,
     VkSubpassDescription2* to);
 
 void deepcopy_VkSubpassDependency2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSubpassDependency2* from,
     VkSubpassDependency2* to);
 
 void deepcopy_VkRenderPassCreateInfo2(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRenderPassCreateInfo2* from,
     VkRenderPassCreateInfo2* to);
 
 void deepcopy_VkSubpassBeginInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSubpassBeginInfo* from,
     VkSubpassBeginInfo* to);
 
 void deepcopy_VkSubpassEndInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSubpassEndInfo* from,
     VkSubpassEndInfo* to);
 
 void deepcopy_VkPhysicalDevice8BitStorageFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDevice8BitStorageFeatures* from,
     VkPhysicalDevice8BitStorageFeatures* to);
 
 void deepcopy_VkPhysicalDeviceDriverProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceDriverProperties* from,
     VkPhysicalDeviceDriverProperties* to);
 
 void deepcopy_VkPhysicalDeviceShaderAtomicInt64Features(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderAtomicInt64Features* from,
     VkPhysicalDeviceShaderAtomicInt64Features* to);
 
 void deepcopy_VkPhysicalDeviceShaderFloat16Int8Features(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderFloat16Int8Features* from,
     VkPhysicalDeviceShaderFloat16Int8Features* to);
 
 void deepcopy_VkPhysicalDeviceFloatControlsProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceFloatControlsProperties* from,
     VkPhysicalDeviceFloatControlsProperties* to);
 
 void deepcopy_VkDescriptorSetLayoutBindingFlagsCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutBindingFlagsCreateInfo* from,
     VkDescriptorSetLayoutBindingFlagsCreateInfo* to);
 
 void deepcopy_VkPhysicalDeviceDescriptorIndexingFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceDescriptorIndexingFeatures* from,
     VkPhysicalDeviceDescriptorIndexingFeatures* to);
 
 void deepcopy_VkPhysicalDeviceDescriptorIndexingProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceDescriptorIndexingProperties* from,
     VkPhysicalDeviceDescriptorIndexingProperties* to);
 
 void deepcopy_VkDescriptorSetVariableDescriptorCountAllocateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorSetVariableDescriptorCountAllocateInfo* from,
     VkDescriptorSetVariableDescriptorCountAllocateInfo* to);
 
 void deepcopy_VkDescriptorSetVariableDescriptorCountLayoutSupport(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorSetVariableDescriptorCountLayoutSupport* from,
     VkDescriptorSetVariableDescriptorCountLayoutSupport* to);
 
 void deepcopy_VkSubpassDescriptionDepthStencilResolve(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSubpassDescriptionDepthStencilResolve* from,
     VkSubpassDescriptionDepthStencilResolve* to);
 
 void deepcopy_VkPhysicalDeviceDepthStencilResolveProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceDepthStencilResolveProperties* from,
     VkPhysicalDeviceDepthStencilResolveProperties* to);
 
 void deepcopy_VkPhysicalDeviceScalarBlockLayoutFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceScalarBlockLayoutFeatures* from,
     VkPhysicalDeviceScalarBlockLayoutFeatures* to);
 
 void deepcopy_VkImageStencilUsageCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageStencilUsageCreateInfo* from,
     VkImageStencilUsageCreateInfo* to);
 
 void deepcopy_VkSamplerReductionModeCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSamplerReductionModeCreateInfo* from,
     VkSamplerReductionModeCreateInfo* to);
 
 void deepcopy_VkPhysicalDeviceSamplerFilterMinmaxProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceSamplerFilterMinmaxProperties* from,
     VkPhysicalDeviceSamplerFilterMinmaxProperties* to);
 
 void deepcopy_VkPhysicalDeviceVulkanMemoryModelFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkanMemoryModelFeatures* from,
     VkPhysicalDeviceVulkanMemoryModelFeatures* to);
 
 void deepcopy_VkPhysicalDeviceImagelessFramebufferFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceImagelessFramebufferFeatures* from,
     VkPhysicalDeviceImagelessFramebufferFeatures* to);
 
 void deepcopy_VkFramebufferAttachmentImageInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkFramebufferAttachmentImageInfo* from,
     VkFramebufferAttachmentImageInfo* to);
 
 void deepcopy_VkFramebufferAttachmentsCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkFramebufferAttachmentsCreateInfo* from,
     VkFramebufferAttachmentsCreateInfo* to);
 
 void deepcopy_VkRenderPassAttachmentBeginInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRenderPassAttachmentBeginInfo* from,
     VkRenderPassAttachmentBeginInfo* to);
 
 void deepcopy_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceUniformBufferStandardLayoutFeatures* from,
     VkPhysicalDeviceUniformBufferStandardLayoutFeatures* to);
 
 void deepcopy_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* from,
     VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* to);
 
 void deepcopy_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* from,
     VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* to);
 
 void deepcopy_VkAttachmentReferenceStencilLayout(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAttachmentReferenceStencilLayout* from,
     VkAttachmentReferenceStencilLayout* to);
 
 void deepcopy_VkAttachmentDescriptionStencilLayout(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAttachmentDescriptionStencilLayout* from,
     VkAttachmentDescriptionStencilLayout* to);
 
 void deepcopy_VkPhysicalDeviceHostQueryResetFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceHostQueryResetFeatures* from,
     VkPhysicalDeviceHostQueryResetFeatures* to);
 
 void deepcopy_VkPhysicalDeviceTimelineSemaphoreFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceTimelineSemaphoreFeatures* from,
     VkPhysicalDeviceTimelineSemaphoreFeatures* to);
 
 void deepcopy_VkPhysicalDeviceTimelineSemaphoreProperties(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceTimelineSemaphoreProperties* from,
     VkPhysicalDeviceTimelineSemaphoreProperties* to);
 
 void deepcopy_VkSemaphoreTypeCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSemaphoreTypeCreateInfo* from,
     VkSemaphoreTypeCreateInfo* to);
 
 void deepcopy_VkTimelineSemaphoreSubmitInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkTimelineSemaphoreSubmitInfo* from,
     VkTimelineSemaphoreSubmitInfo* to);
 
 void deepcopy_VkSemaphoreWaitInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSemaphoreWaitInfo* from,
     VkSemaphoreWaitInfo* to);
 
 void deepcopy_VkSemaphoreSignalInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSemaphoreSignalInfo* from,
     VkSemaphoreSignalInfo* to);
 
 void deepcopy_VkPhysicalDeviceBufferDeviceAddressFeatures(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceBufferDeviceAddressFeatures* from,
     VkPhysicalDeviceBufferDeviceAddressFeatures* to);
 
 void deepcopy_VkBufferDeviceAddressInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBufferDeviceAddressInfo* from,
     VkBufferDeviceAddressInfo* to);
 
 void deepcopy_VkBufferOpaqueCaptureAddressCreateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBufferOpaqueCaptureAddressCreateInfo* from,
     VkBufferOpaqueCaptureAddressCreateInfo* to);
 
 void deepcopy_VkMemoryOpaqueCaptureAddressAllocateInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryOpaqueCaptureAddressAllocateInfo* from,
     VkMemoryOpaqueCaptureAddressAllocateInfo* to);
 
 void deepcopy_VkDeviceMemoryOpaqueCaptureAddressInfo(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceMemoryOpaqueCaptureAddressInfo* from,
     VkDeviceMemoryOpaqueCaptureAddressInfo* to);
 
 #endif
 #ifdef VK_KHR_surface
 void deepcopy_VkSurfaceCapabilitiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSurfaceCapabilitiesKHR* from,
     VkSurfaceCapabilitiesKHR* to);
 
 void deepcopy_VkSurfaceFormatKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSurfaceFormatKHR* from,
     VkSurfaceFormatKHR* to);
 
 #endif
 #ifdef VK_KHR_swapchain
 void deepcopy_VkSwapchainCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSwapchainCreateInfoKHR* from,
     VkSwapchainCreateInfoKHR* to);
 
 void deepcopy_VkPresentInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPresentInfoKHR* from,
     VkPresentInfoKHR* to);
 
 void deepcopy_VkImageSwapchainCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageSwapchainCreateInfoKHR* from,
     VkImageSwapchainCreateInfoKHR* to);
 
 void deepcopy_VkBindImageMemorySwapchainInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBindImageMemorySwapchainInfoKHR* from,
     VkBindImageMemorySwapchainInfoKHR* to);
 
 void deepcopy_VkAcquireNextImageInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAcquireNextImageInfoKHR* from,
     VkAcquireNextImageInfoKHR* to);
 
 void deepcopy_VkDeviceGroupPresentCapabilitiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceGroupPresentCapabilitiesKHR* from,
     VkDeviceGroupPresentCapabilitiesKHR* to);
 
 void deepcopy_VkDeviceGroupPresentInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceGroupPresentInfoKHR* from,
     VkDeviceGroupPresentInfoKHR* to);
 
 void deepcopy_VkDeviceGroupSwapchainCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceGroupSwapchainCreateInfoKHR* from,
     VkDeviceGroupSwapchainCreateInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_display
 void deepcopy_VkDisplayModeParametersKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayModeParametersKHR* from,
     VkDisplayModeParametersKHR* to);
 
 void deepcopy_VkDisplayModeCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayModeCreateInfoKHR* from,
     VkDisplayModeCreateInfoKHR* to);
 
 void deepcopy_VkDisplayModePropertiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayModePropertiesKHR* from,
     VkDisplayModePropertiesKHR* to);
 
 void deepcopy_VkDisplayPlaneCapabilitiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayPlaneCapabilitiesKHR* from,
     VkDisplayPlaneCapabilitiesKHR* to);
 
 void deepcopy_VkDisplayPlanePropertiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayPlanePropertiesKHR* from,
     VkDisplayPlanePropertiesKHR* to);
 
 void deepcopy_VkDisplayPropertiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayPropertiesKHR* from,
     VkDisplayPropertiesKHR* to);
 
 void deepcopy_VkDisplaySurfaceCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplaySurfaceCreateInfoKHR* from,
     VkDisplaySurfaceCreateInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_display_swapchain
 void deepcopy_VkDisplayPresentInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayPresentInfoKHR* from,
     VkDisplayPresentInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_xlib_surface
 void deepcopy_VkXlibSurfaceCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkXlibSurfaceCreateInfoKHR* from,
     VkXlibSurfaceCreateInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_xcb_surface
 void deepcopy_VkXcbSurfaceCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkXcbSurfaceCreateInfoKHR* from,
     VkXcbSurfaceCreateInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_wayland_surface
 void deepcopy_VkWaylandSurfaceCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkWaylandSurfaceCreateInfoKHR* from,
     VkWaylandSurfaceCreateInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_android_surface
 void deepcopy_VkAndroidSurfaceCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAndroidSurfaceCreateInfoKHR* from,
     VkAndroidSurfaceCreateInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_win32_surface
 void deepcopy_VkWin32SurfaceCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkWin32SurfaceCreateInfoKHR* from,
     VkWin32SurfaceCreateInfoKHR* to);
 
@@ -1405,46 +1657,54 @@
 #endif
 #ifdef VK_KHR_external_memory_win32
 void deepcopy_VkImportMemoryWin32HandleInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImportMemoryWin32HandleInfoKHR* from,
     VkImportMemoryWin32HandleInfoKHR* to);
 
 void deepcopy_VkExportMemoryWin32HandleInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExportMemoryWin32HandleInfoKHR* from,
     VkExportMemoryWin32HandleInfoKHR* to);
 
 void deepcopy_VkMemoryWin32HandlePropertiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryWin32HandlePropertiesKHR* from,
     VkMemoryWin32HandlePropertiesKHR* to);
 
 void deepcopy_VkMemoryGetWin32HandleInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryGetWin32HandleInfoKHR* from,
     VkMemoryGetWin32HandleInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_external_memory_fd
 void deepcopy_VkImportMemoryFdInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImportMemoryFdInfoKHR* from,
     VkImportMemoryFdInfoKHR* to);
 
 void deepcopy_VkMemoryFdPropertiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryFdPropertiesKHR* from,
     VkMemoryFdPropertiesKHR* to);
 
 void deepcopy_VkMemoryGetFdInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryGetFdInfoKHR* from,
     VkMemoryGetFdInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
 void deepcopy_VkWin32KeyedMutexAcquireReleaseInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkWin32KeyedMutexAcquireReleaseInfoKHR* from,
     VkWin32KeyedMutexAcquireReleaseInfoKHR* to);
 
@@ -1461,41 +1721,48 @@
 #endif
 #ifdef VK_KHR_external_semaphore_win32
 void deepcopy_VkImportSemaphoreWin32HandleInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImportSemaphoreWin32HandleInfoKHR* from,
     VkImportSemaphoreWin32HandleInfoKHR* to);
 
 void deepcopy_VkExportSemaphoreWin32HandleInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExportSemaphoreWin32HandleInfoKHR* from,
     VkExportSemaphoreWin32HandleInfoKHR* to);
 
 void deepcopy_VkD3D12FenceSubmitInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkD3D12FenceSubmitInfoKHR* from,
     VkD3D12FenceSubmitInfoKHR* to);
 
 void deepcopy_VkSemaphoreGetWin32HandleInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSemaphoreGetWin32HandleInfoKHR* from,
     VkSemaphoreGetWin32HandleInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_external_semaphore_fd
 void deepcopy_VkImportSemaphoreFdInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImportSemaphoreFdInfoKHR* from,
     VkImportSemaphoreFdInfoKHR* to);
 
 void deepcopy_VkSemaphoreGetFdInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSemaphoreGetFdInfoKHR* from,
     VkSemaphoreGetFdInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_push_descriptor
 void deepcopy_VkPhysicalDevicePushDescriptorPropertiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDevicePushDescriptorPropertiesKHR* from,
     VkPhysicalDevicePushDescriptorPropertiesKHR* to);
 
@@ -1512,17 +1779,20 @@
 #endif
 #ifdef VK_KHR_incremental_present
 void deepcopy_VkRectLayerKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRectLayerKHR* from,
     VkRectLayerKHR* to);
 
 void deepcopy_VkPresentRegionKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPresentRegionKHR* from,
     VkPresentRegionKHR* to);
 
 void deepcopy_VkPresentRegionsKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPresentRegionsKHR* from,
     VkPresentRegionsKHR* to);
 
@@ -1561,7 +1831,8 @@
 #endif
 #ifdef VK_KHR_shared_presentable_image
 void deepcopy_VkSharedPresentSurfaceCapabilitiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSharedPresentSurfaceCapabilitiesKHR* from,
     VkSharedPresentSurfaceCapabilitiesKHR* to);
 
@@ -1578,71 +1849,84 @@
 #endif
 #ifdef VK_KHR_external_fence_win32
 void deepcopy_VkImportFenceWin32HandleInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImportFenceWin32HandleInfoKHR* from,
     VkImportFenceWin32HandleInfoKHR* to);
 
 void deepcopy_VkExportFenceWin32HandleInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExportFenceWin32HandleInfoKHR* from,
     VkExportFenceWin32HandleInfoKHR* to);
 
 void deepcopy_VkFenceGetWin32HandleInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkFenceGetWin32HandleInfoKHR* from,
     VkFenceGetWin32HandleInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_external_fence_fd
 void deepcopy_VkImportFenceFdInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImportFenceFdInfoKHR* from,
     VkImportFenceFdInfoKHR* to);
 
 void deepcopy_VkFenceGetFdInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkFenceGetFdInfoKHR* from,
     VkFenceGetFdInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_performance_query
 void deepcopy_VkPhysicalDevicePerformanceQueryFeaturesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDevicePerformanceQueryFeaturesKHR* from,
     VkPhysicalDevicePerformanceQueryFeaturesKHR* to);
 
 void deepcopy_VkPhysicalDevicePerformanceQueryPropertiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDevicePerformanceQueryPropertiesKHR* from,
     VkPhysicalDevicePerformanceQueryPropertiesKHR* to);
 
 void deepcopy_VkPerformanceCounterKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPerformanceCounterKHR* from,
     VkPerformanceCounterKHR* to);
 
 void deepcopy_VkPerformanceCounterDescriptionKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPerformanceCounterDescriptionKHR* from,
     VkPerformanceCounterDescriptionKHR* to);
 
 void deepcopy_VkQueryPoolPerformanceCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkQueryPoolPerformanceCreateInfoKHR* from,
     VkQueryPoolPerformanceCreateInfoKHR* to);
 
 void deepcopy_VkPerformanceCounterResultKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPerformanceCounterResultKHR* from,
     VkPerformanceCounterResultKHR* to);
 
 void deepcopy_VkAcquireProfilingLockInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAcquireProfilingLockInfoKHR* from,
     VkAcquireProfilingLockInfoKHR* to);
 
 void deepcopy_VkPerformanceQuerySubmitInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPerformanceQuerySubmitInfoKHR* from,
     VkPerformanceQuerySubmitInfoKHR* to);
 
@@ -1661,17 +1945,20 @@
 #endif
 #ifdef VK_KHR_get_surface_capabilities2
 void deepcopy_VkPhysicalDeviceSurfaceInfo2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceSurfaceInfo2KHR* from,
     VkPhysicalDeviceSurfaceInfo2KHR* to);
 
 void deepcopy_VkSurfaceCapabilities2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSurfaceCapabilities2KHR* from,
     VkSurfaceCapabilities2KHR* to);
 
 void deepcopy_VkSurfaceFormat2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSurfaceFormat2KHR* from,
     VkSurfaceFormat2KHR* to);
 
@@ -1684,27 +1971,32 @@
 #endif
 #ifdef VK_KHR_get_display_properties2
 void deepcopy_VkDisplayProperties2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayProperties2KHR* from,
     VkDisplayProperties2KHR* to);
 
 void deepcopy_VkDisplayPlaneProperties2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayPlaneProperties2KHR* from,
     VkDisplayPlaneProperties2KHR* to);
 
 void deepcopy_VkDisplayModeProperties2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayModeProperties2KHR* from,
     VkDisplayModeProperties2KHR* to);
 
 void deepcopy_VkDisplayPlaneInfo2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayPlaneInfo2KHR* from,
     VkDisplayPlaneInfo2KHR* to);
 
 void deepcopy_VkDisplayPlaneCapabilities2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayPlaneCapabilities2KHR* from,
     VkDisplayPlaneCapabilities2KHR* to);
 
@@ -1757,12 +2049,14 @@
 #endif
 #ifdef VK_KHR_portability_subset
 void deepcopy_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDevicePortabilitySubsetFeaturesKHR* from,
     VkPhysicalDevicePortabilitySubsetFeaturesKHR* to);
 
 void deepcopy_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDevicePortabilitySubsetPropertiesKHR* from,
     VkPhysicalDevicePortabilitySubsetPropertiesKHR* to);
 
@@ -1789,7 +2083,8 @@
 #endif
 #ifdef VK_KHR_shader_clock
 void deepcopy_VkPhysicalDeviceShaderClockFeaturesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderClockFeaturesKHR* from,
     VkPhysicalDeviceShaderClockFeaturesKHR* to);
 
@@ -1832,34 +2127,40 @@
 #endif
 #ifdef VK_KHR_shader_terminate_invocation
 void deepcopy_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* from,
     VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* to);
 
 #endif
 #ifdef VK_KHR_fragment_shading_rate
 void deepcopy_VkFragmentShadingRateAttachmentInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkFragmentShadingRateAttachmentInfoKHR* from,
     VkFragmentShadingRateAttachmentInfoKHR* to);
 
 void deepcopy_VkPipelineFragmentShadingRateStateCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineFragmentShadingRateStateCreateInfoKHR* from,
     VkPipelineFragmentShadingRateStateCreateInfoKHR* to);
 
 void deepcopy_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateFeaturesKHR* from,
     VkPhysicalDeviceFragmentShadingRateFeaturesKHR* to);
 
 void deepcopy_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRatePropertiesKHR* from,
     VkPhysicalDeviceFragmentShadingRatePropertiesKHR* to);
 
 void deepcopy_VkPhysicalDeviceFragmentShadingRateKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateKHR* from,
     VkPhysicalDeviceFragmentShadingRateKHR* to);
 
@@ -1868,7 +2169,8 @@
 #endif
 #ifdef VK_KHR_surface_protected_capabilities
 void deepcopy_VkSurfaceProtectedCapabilitiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSurfaceProtectedCapabilitiesKHR* from,
     VkSurfaceProtectedCapabilitiesKHR* to);
 
@@ -1901,44 +2203,52 @@
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
 void deepcopy_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* from,
     VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* to);
 
 void deepcopy_VkPipelineInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineInfoKHR* from,
     VkPipelineInfoKHR* to);
 
 void deepcopy_VkPipelineExecutablePropertiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineExecutablePropertiesKHR* from,
     VkPipelineExecutablePropertiesKHR* to);
 
 void deepcopy_VkPipelineExecutableInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineExecutableInfoKHR* from,
     VkPipelineExecutableInfoKHR* to);
 
 void deepcopy_VkPipelineExecutableStatisticValueKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineExecutableStatisticValueKHR* from,
     VkPipelineExecutableStatisticValueKHR* to);
 
 void deepcopy_VkPipelineExecutableStatisticKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineExecutableStatisticKHR* from,
     VkPipelineExecutableStatisticKHR* to);
 
 void deepcopy_VkPipelineExecutableInternalRepresentationKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineExecutableInternalRepresentationKHR* from,
     VkPipelineExecutableInternalRepresentationKHR* to);
 
 #endif
 #ifdef VK_KHR_pipeline_library
 void deepcopy_VkPipelineLibraryCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineLibraryCreateInfoKHR* from,
     VkPipelineLibraryCreateInfoKHR* to);
 
@@ -1947,71 +2257,84 @@
 #endif
 #ifdef VK_KHR_copy_commands2
 void deepcopy_VkBufferCopy2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBufferCopy2KHR* from,
     VkBufferCopy2KHR* to);
 
 void deepcopy_VkCopyBufferInfo2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCopyBufferInfo2KHR* from,
     VkCopyBufferInfo2KHR* to);
 
 void deepcopy_VkImageCopy2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageCopy2KHR* from,
     VkImageCopy2KHR* to);
 
 void deepcopy_VkCopyImageInfo2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCopyImageInfo2KHR* from,
     VkCopyImageInfo2KHR* to);
 
 void deepcopy_VkBufferImageCopy2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBufferImageCopy2KHR* from,
     VkBufferImageCopy2KHR* to);
 
 void deepcopy_VkCopyBufferToImageInfo2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCopyBufferToImageInfo2KHR* from,
     VkCopyBufferToImageInfo2KHR* to);
 
 void deepcopy_VkCopyImageToBufferInfo2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCopyImageToBufferInfo2KHR* from,
     VkCopyImageToBufferInfo2KHR* to);
 
 void deepcopy_VkImageBlit2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageBlit2KHR* from,
     VkImageBlit2KHR* to);
 
 void deepcopy_VkBlitImageInfo2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBlitImageInfo2KHR* from,
     VkBlitImageInfo2KHR* to);
 
 void deepcopy_VkImageResolve2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageResolve2KHR* from,
     VkImageResolve2KHR* to);
 
 void deepcopy_VkResolveImageInfo2KHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkResolveImageInfo2KHR* from,
     VkResolveImageInfo2KHR* to);
 
 #endif
 #ifdef VK_ANDROID_native_buffer
 void deepcopy_VkNativeBufferANDROID(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkNativeBufferANDROID* from,
     VkNativeBufferANDROID* to);
 
 #endif
 #ifdef VK_EXT_debug_report
 void deepcopy_VkDebugReportCallbackCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDebugReportCallbackCreateInfoEXT* from,
     VkDebugReportCallbackCreateInfoEXT* to);
 
@@ -2024,7 +2347,8 @@
 #endif
 #ifdef VK_AMD_rasterization_order
 void deepcopy_VkPipelineRasterizationStateRasterizationOrderAMD(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineRasterizationStateRasterizationOrderAMD* from,
     VkPipelineRasterizationStateRasterizationOrderAMD* to);
 
@@ -2035,17 +2359,20 @@
 #endif
 #ifdef VK_EXT_debug_marker
 void deepcopy_VkDebugMarkerObjectNameInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDebugMarkerObjectNameInfoEXT* from,
     VkDebugMarkerObjectNameInfoEXT* to);
 
 void deepcopy_VkDebugMarkerObjectTagInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDebugMarkerObjectTagInfoEXT* from,
     VkDebugMarkerObjectTagInfoEXT* to);
 
 void deepcopy_VkDebugMarkerMarkerInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDebugMarkerMarkerInfoEXT* from,
     VkDebugMarkerMarkerInfoEXT* to);
 
@@ -2054,46 +2381,54 @@
 #endif
 #ifdef VK_NV_dedicated_allocation
 void deepcopy_VkDedicatedAllocationImageCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDedicatedAllocationImageCreateInfoNV* from,
     VkDedicatedAllocationImageCreateInfoNV* to);
 
 void deepcopy_VkDedicatedAllocationBufferCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDedicatedAllocationBufferCreateInfoNV* from,
     VkDedicatedAllocationBufferCreateInfoNV* to);
 
 void deepcopy_VkDedicatedAllocationMemoryAllocateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDedicatedAllocationMemoryAllocateInfoNV* from,
     VkDedicatedAllocationMemoryAllocateInfoNV* to);
 
 #endif
 #ifdef VK_EXT_transform_feedback
 void deepcopy_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceTransformFeedbackFeaturesEXT* from,
     VkPhysicalDeviceTransformFeedbackFeaturesEXT* to);
 
 void deepcopy_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceTransformFeedbackPropertiesEXT* from,
     VkPhysicalDeviceTransformFeedbackPropertiesEXT* to);
 
 void deepcopy_VkPipelineRasterizationStateStreamCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineRasterizationStateStreamCreateInfoEXT* from,
     VkPipelineRasterizationStateStreamCreateInfoEXT* to);
 
 #endif
 #ifdef VK_NVX_image_view_handle
 void deepcopy_VkImageViewHandleInfoNVX(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageViewHandleInfoNVX* from,
     VkImageViewHandleInfoNVX* to);
 
 void deepcopy_VkImageViewAddressPropertiesNVX(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageViewAddressPropertiesNVX* from,
     VkImageViewAddressPropertiesNVX* to);
 
@@ -2108,19 +2443,22 @@
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
 void deepcopy_VkTextureLODGatherFormatPropertiesAMD(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkTextureLODGatherFormatPropertiesAMD* from,
     VkTextureLODGatherFormatPropertiesAMD* to);
 
 #endif
 #ifdef VK_AMD_shader_info
 void deepcopy_VkShaderResourceUsageAMD(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkShaderResourceUsageAMD* from,
     VkShaderResourceUsageAMD* to);
 
 void deepcopy_VkShaderStatisticsInfoAMD(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkShaderStatisticsInfoAMD* from,
     VkShaderStatisticsInfoAMD* to);
 
@@ -2129,14 +2467,16 @@
 #endif
 #ifdef VK_GGP_stream_descriptor_surface
 void deepcopy_VkStreamDescriptorSurfaceCreateInfoGGP(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkStreamDescriptorSurfaceCreateInfoGGP* from,
     VkStreamDescriptorSurfaceCreateInfoGGP* to);
 
 #endif
 #ifdef VK_NV_corner_sampled_image
 void deepcopy_VkPhysicalDeviceCornerSampledImageFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceCornerSampledImageFeaturesNV* from,
     VkPhysicalDeviceCornerSampledImageFeaturesNV* to);
 
@@ -2145,52 +2485,60 @@
 #endif
 #ifdef VK_NV_external_memory_capabilities
 void deepcopy_VkExternalImageFormatPropertiesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExternalImageFormatPropertiesNV* from,
     VkExternalImageFormatPropertiesNV* to);
 
 #endif
 #ifdef VK_NV_external_memory
 void deepcopy_VkExternalMemoryImageCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExternalMemoryImageCreateInfoNV* from,
     VkExternalMemoryImageCreateInfoNV* to);
 
 void deepcopy_VkExportMemoryAllocateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExportMemoryAllocateInfoNV* from,
     VkExportMemoryAllocateInfoNV* to);
 
 #endif
 #ifdef VK_NV_external_memory_win32
 void deepcopy_VkImportMemoryWin32HandleInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImportMemoryWin32HandleInfoNV* from,
     VkImportMemoryWin32HandleInfoNV* to);
 
 void deepcopy_VkExportMemoryWin32HandleInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExportMemoryWin32HandleInfoNV* from,
     VkExportMemoryWin32HandleInfoNV* to);
 
 #endif
 #ifdef VK_NV_win32_keyed_mutex
 void deepcopy_VkWin32KeyedMutexAcquireReleaseInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkWin32KeyedMutexAcquireReleaseInfoNV* from,
     VkWin32KeyedMutexAcquireReleaseInfoNV* to);
 
 #endif
 #ifdef VK_EXT_validation_flags
 void deepcopy_VkValidationFlagsEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkValidationFlagsEXT* from,
     VkValidationFlagsEXT* to);
 
 #endif
 #ifdef VK_NN_vi_surface
 void deepcopy_VkViSurfaceCreateInfoNN(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkViSurfaceCreateInfoNN* from,
     VkViSurfaceCreateInfoNN* to);
 
@@ -2201,48 +2549,56 @@
 #endif
 #ifdef VK_EXT_texture_compression_astc_hdr
 void deepcopy_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* from,
     VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* to);
 
 #endif
 #ifdef VK_EXT_astc_decode_mode
 void deepcopy_VkImageViewASTCDecodeModeEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageViewASTCDecodeModeEXT* from,
     VkImageViewASTCDecodeModeEXT* to);
 
 void deepcopy_VkPhysicalDeviceASTCDecodeFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceASTCDecodeFeaturesEXT* from,
     VkPhysicalDeviceASTCDecodeFeaturesEXT* to);
 
 #endif
 #ifdef VK_EXT_conditional_rendering
 void deepcopy_VkConditionalRenderingBeginInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkConditionalRenderingBeginInfoEXT* from,
     VkConditionalRenderingBeginInfoEXT* to);
 
 void deepcopy_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceConditionalRenderingFeaturesEXT* from,
     VkPhysicalDeviceConditionalRenderingFeaturesEXT* to);
 
 void deepcopy_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCommandBufferInheritanceConditionalRenderingInfoEXT* from,
     VkCommandBufferInheritanceConditionalRenderingInfoEXT* to);
 
 #endif
 #ifdef VK_NV_clip_space_w_scaling
 void deepcopy_VkViewportWScalingNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkViewportWScalingNV* from,
     VkViewportWScalingNV* to);
 
 void deepcopy_VkPipelineViewportWScalingStateCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineViewportWScalingStateCreateInfoNV* from,
     VkPipelineViewportWScalingStateCreateInfoNV* to);
 
@@ -2253,51 +2609,60 @@
 #endif
 #ifdef VK_EXT_display_surface_counter
 void deepcopy_VkSurfaceCapabilities2EXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSurfaceCapabilities2EXT* from,
     VkSurfaceCapabilities2EXT* to);
 
 #endif
 #ifdef VK_EXT_display_control
 void deepcopy_VkDisplayPowerInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayPowerInfoEXT* from,
     VkDisplayPowerInfoEXT* to);
 
 void deepcopy_VkDeviceEventInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceEventInfoEXT* from,
     VkDeviceEventInfoEXT* to);
 
 void deepcopy_VkDisplayEventInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayEventInfoEXT* from,
     VkDisplayEventInfoEXT* to);
 
 void deepcopy_VkSwapchainCounterCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSwapchainCounterCreateInfoEXT* from,
     VkSwapchainCounterCreateInfoEXT* to);
 
 #endif
 #ifdef VK_GOOGLE_display_timing
 void deepcopy_VkRefreshCycleDurationGOOGLE(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRefreshCycleDurationGOOGLE* from,
     VkRefreshCycleDurationGOOGLE* to);
 
 void deepcopy_VkPastPresentationTimingGOOGLE(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPastPresentationTimingGOOGLE* from,
     VkPastPresentationTimingGOOGLE* to);
 
 void deepcopy_VkPresentTimeGOOGLE(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPresentTimeGOOGLE* from,
     VkPresentTimeGOOGLE* to);
 
 void deepcopy_VkPresentTimesInfoGOOGLE(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPresentTimesInfoGOOGLE* from,
     VkPresentTimesInfoGOOGLE* to);
 
@@ -2310,55 +2675,64 @@
 #endif
 #ifdef VK_NVX_multiview_per_view_attributes
 void deepcopy_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* from,
     VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* to);
 
 #endif
 #ifdef VK_NV_viewport_swizzle
 void deepcopy_VkViewportSwizzleNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkViewportSwizzleNV* from,
     VkViewportSwizzleNV* to);
 
 void deepcopy_VkPipelineViewportSwizzleStateCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineViewportSwizzleStateCreateInfoNV* from,
     VkPipelineViewportSwizzleStateCreateInfoNV* to);
 
 #endif
 #ifdef VK_EXT_discard_rectangles
 void deepcopy_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceDiscardRectanglePropertiesEXT* from,
     VkPhysicalDeviceDiscardRectanglePropertiesEXT* to);
 
 void deepcopy_VkPipelineDiscardRectangleStateCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineDiscardRectangleStateCreateInfoEXT* from,
     VkPipelineDiscardRectangleStateCreateInfoEXT* to);
 
 #endif
 #ifdef VK_EXT_conservative_rasterization
 void deepcopy_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceConservativeRasterizationPropertiesEXT* from,
     VkPhysicalDeviceConservativeRasterizationPropertiesEXT* to);
 
 void deepcopy_VkPipelineRasterizationConservativeStateCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineRasterizationConservativeStateCreateInfoEXT* from,
     VkPipelineRasterizationConservativeStateCreateInfoEXT* to);
 
 #endif
 #ifdef VK_EXT_depth_clip_enable
 void deepcopy_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceDepthClipEnableFeaturesEXT* from,
     VkPhysicalDeviceDepthClipEnableFeaturesEXT* to);
 
 void deepcopy_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineRasterizationDepthClipStateCreateInfoEXT* from,
     VkPipelineRasterizationDepthClipStateCreateInfoEXT* to);
 
@@ -2367,26 +2741,30 @@
 #endif
 #ifdef VK_EXT_hdr_metadata
 void deepcopy_VkXYColorEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkXYColorEXT* from,
     VkXYColorEXT* to);
 
 void deepcopy_VkHdrMetadataEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkHdrMetadataEXT* from,
     VkHdrMetadataEXT* to);
 
 #endif
 #ifdef VK_MVK_ios_surface
 void deepcopy_VkIOSSurfaceCreateInfoMVK(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkIOSSurfaceCreateInfoMVK* from,
     VkIOSSurfaceCreateInfoMVK* to);
 
 #endif
 #ifdef VK_MVK_macos_surface
 void deepcopy_VkMacOSSurfaceCreateInfoMVK(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMacOSSurfaceCreateInfoMVK* from,
     VkMacOSSurfaceCreateInfoMVK* to);
 
@@ -2399,59 +2777,70 @@
 #endif
 #ifdef VK_EXT_debug_utils
 void deepcopy_VkDebugUtilsLabelEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDebugUtilsLabelEXT* from,
     VkDebugUtilsLabelEXT* to);
 
 void deepcopy_VkDebugUtilsObjectNameInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDebugUtilsObjectNameInfoEXT* from,
     VkDebugUtilsObjectNameInfoEXT* to);
 
 void deepcopy_VkDebugUtilsMessengerCallbackDataEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDebugUtilsMessengerCallbackDataEXT* from,
     VkDebugUtilsMessengerCallbackDataEXT* to);
 
 void deepcopy_VkDebugUtilsMessengerCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDebugUtilsMessengerCreateInfoEXT* from,
     VkDebugUtilsMessengerCreateInfoEXT* to);
 
 void deepcopy_VkDebugUtilsObjectTagInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDebugUtilsObjectTagInfoEXT* from,
     VkDebugUtilsObjectTagInfoEXT* to);
 
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
 void deepcopy_VkAndroidHardwareBufferUsageANDROID(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAndroidHardwareBufferUsageANDROID* from,
     VkAndroidHardwareBufferUsageANDROID* to);
 
 void deepcopy_VkAndroidHardwareBufferPropertiesANDROID(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAndroidHardwareBufferPropertiesANDROID* from,
     VkAndroidHardwareBufferPropertiesANDROID* to);
 
 void deepcopy_VkAndroidHardwareBufferFormatPropertiesANDROID(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAndroidHardwareBufferFormatPropertiesANDROID* from,
     VkAndroidHardwareBufferFormatPropertiesANDROID* to);
 
 void deepcopy_VkImportAndroidHardwareBufferInfoANDROID(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImportAndroidHardwareBufferInfoANDROID* from,
     VkImportAndroidHardwareBufferInfoANDROID* to);
 
 void deepcopy_VkMemoryGetAndroidHardwareBufferInfoANDROID(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryGetAndroidHardwareBufferInfoANDROID* from,
     VkMemoryGetAndroidHardwareBufferInfoANDROID* to);
 
 void deepcopy_VkExternalFormatANDROID(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkExternalFormatANDROID* from,
     VkExternalFormatANDROID* to);
 
@@ -2470,22 +2859,26 @@
 #endif
 #ifdef VK_EXT_inline_uniform_block
 void deepcopy_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceInlineUniformBlockFeaturesEXT* from,
     VkPhysicalDeviceInlineUniformBlockFeaturesEXT* to);
 
 void deepcopy_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceInlineUniformBlockPropertiesEXT* from,
     VkPhysicalDeviceInlineUniformBlockPropertiesEXT* to);
 
 void deepcopy_VkWriteDescriptorSetInlineUniformBlockEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkWriteDescriptorSetInlineUniformBlockEXT* from,
     VkWriteDescriptorSetInlineUniformBlockEXT* to);
 
 void deepcopy_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDescriptorPoolInlineUniformBlockCreateInfoEXT* from,
     VkDescriptorPoolInlineUniformBlockCreateInfoEXT* to);
 
@@ -2494,73 +2887,86 @@
 #endif
 #ifdef VK_EXT_sample_locations
 void deepcopy_VkSampleLocationEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSampleLocationEXT* from,
     VkSampleLocationEXT* to);
 
 void deepcopy_VkSampleLocationsInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSampleLocationsInfoEXT* from,
     VkSampleLocationsInfoEXT* to);
 
 void deepcopy_VkAttachmentSampleLocationsEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAttachmentSampleLocationsEXT* from,
     VkAttachmentSampleLocationsEXT* to);
 
 void deepcopy_VkSubpassSampleLocationsEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSubpassSampleLocationsEXT* from,
     VkSubpassSampleLocationsEXT* to);
 
 void deepcopy_VkRenderPassSampleLocationsBeginInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRenderPassSampleLocationsBeginInfoEXT* from,
     VkRenderPassSampleLocationsBeginInfoEXT* to);
 
 void deepcopy_VkPipelineSampleLocationsStateCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineSampleLocationsStateCreateInfoEXT* from,
     VkPipelineSampleLocationsStateCreateInfoEXT* to);
 
 void deepcopy_VkPhysicalDeviceSampleLocationsPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceSampleLocationsPropertiesEXT* from,
     VkPhysicalDeviceSampleLocationsPropertiesEXT* to);
 
 void deepcopy_VkMultisamplePropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMultisamplePropertiesEXT* from,
     VkMultisamplePropertiesEXT* to);
 
 #endif
 #ifdef VK_EXT_blend_operation_advanced
 void deepcopy_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* from,
     VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* to);
 
 void deepcopy_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* from,
     VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* to);
 
 void deepcopy_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineColorBlendAdvancedStateCreateInfoEXT* from,
     VkPipelineColorBlendAdvancedStateCreateInfoEXT* to);
 
 #endif
 #ifdef VK_NV_fragment_coverage_to_color
 void deepcopy_VkPipelineCoverageToColorStateCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineCoverageToColorStateCreateInfoNV* from,
     VkPipelineCoverageToColorStateCreateInfoNV* to);
 
 #endif
 #ifdef VK_NV_framebuffer_mixed_samples
 void deepcopy_VkPipelineCoverageModulationStateCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineCoverageModulationStateCreateInfoNV* from,
     VkPipelineCoverageModulationStateCreateInfoNV* to);
 
@@ -2569,12 +2975,14 @@
 #endif
 #ifdef VK_NV_shader_sm_builtins
 void deepcopy_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* from,
     VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* to);
 
 void deepcopy_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* from,
     VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* to);
 
@@ -2583,44 +2991,52 @@
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
 void deepcopy_VkDrmFormatModifierPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDrmFormatModifierPropertiesEXT* from,
     VkDrmFormatModifierPropertiesEXT* to);
 
 void deepcopy_VkDrmFormatModifierPropertiesListEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDrmFormatModifierPropertiesListEXT* from,
     VkDrmFormatModifierPropertiesListEXT* to);
 
 void deepcopy_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageDrmFormatModifierInfoEXT* from,
     VkPhysicalDeviceImageDrmFormatModifierInfoEXT* to);
 
 void deepcopy_VkImageDrmFormatModifierListCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageDrmFormatModifierListCreateInfoEXT* from,
     VkImageDrmFormatModifierListCreateInfoEXT* to);
 
 void deepcopy_VkImageDrmFormatModifierExplicitCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageDrmFormatModifierExplicitCreateInfoEXT* from,
     VkImageDrmFormatModifierExplicitCreateInfoEXT* to);
 
 void deepcopy_VkImageDrmFormatModifierPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImageDrmFormatModifierPropertiesEXT* from,
     VkImageDrmFormatModifierPropertiesEXT* to);
 
 #endif
 #ifdef VK_EXT_validation_cache
 void deepcopy_VkValidationCacheCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkValidationCacheCreateInfoEXT* from,
     VkValidationCacheCreateInfoEXT* to);
 
 void deepcopy_VkShaderModuleValidationCacheCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkShaderModuleValidationCacheCreateInfoEXT* from,
     VkShaderModuleValidationCacheCreateInfoEXT* to);
 
@@ -2641,118 +3057,140 @@
 #endif
 #ifdef VK_NV_shading_rate_image
 void deepcopy_VkShadingRatePaletteNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkShadingRatePaletteNV* from,
     VkShadingRatePaletteNV* to);
 
 void deepcopy_VkPipelineViewportShadingRateImageStateCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineViewportShadingRateImageStateCreateInfoNV* from,
     VkPipelineViewportShadingRateImageStateCreateInfoNV* to);
 
 void deepcopy_VkPhysicalDeviceShadingRateImageFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShadingRateImageFeaturesNV* from,
     VkPhysicalDeviceShadingRateImageFeaturesNV* to);
 
 void deepcopy_VkPhysicalDeviceShadingRateImagePropertiesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShadingRateImagePropertiesNV* from,
     VkPhysicalDeviceShadingRateImagePropertiesNV* to);
 
 void deepcopy_VkCoarseSampleLocationNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCoarseSampleLocationNV* from,
     VkCoarseSampleLocationNV* to);
 
 void deepcopy_VkCoarseSampleOrderCustomNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCoarseSampleOrderCustomNV* from,
     VkCoarseSampleOrderCustomNV* to);
 
 void deepcopy_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* from,
     VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* to);
 
 #endif
 #ifdef VK_NV_ray_tracing
 void deepcopy_VkRayTracingShaderGroupCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRayTracingShaderGroupCreateInfoNV* from,
     VkRayTracingShaderGroupCreateInfoNV* to);
 
 void deepcopy_VkRayTracingPipelineCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRayTracingPipelineCreateInfoNV* from,
     VkRayTracingPipelineCreateInfoNV* to);
 
 void deepcopy_VkGeometryTrianglesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkGeometryTrianglesNV* from,
     VkGeometryTrianglesNV* to);
 
 void deepcopy_VkGeometryAABBNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkGeometryAABBNV* from,
     VkGeometryAABBNV* to);
 
 void deepcopy_VkGeometryDataNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkGeometryDataNV* from,
     VkGeometryDataNV* to);
 
 void deepcopy_VkGeometryNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkGeometryNV* from,
     VkGeometryNV* to);
 
 void deepcopy_VkAccelerationStructureInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureInfoNV* from,
     VkAccelerationStructureInfoNV* to);
 
 void deepcopy_VkAccelerationStructureCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureCreateInfoNV* from,
     VkAccelerationStructureCreateInfoNV* to);
 
 void deepcopy_VkBindAccelerationStructureMemoryInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBindAccelerationStructureMemoryInfoNV* from,
     VkBindAccelerationStructureMemoryInfoNV* to);
 
 void deepcopy_VkWriteDescriptorSetAccelerationStructureNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkWriteDescriptorSetAccelerationStructureNV* from,
     VkWriteDescriptorSetAccelerationStructureNV* to);
 
 void deepcopy_VkAccelerationStructureMemoryRequirementsInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureMemoryRequirementsInfoNV* from,
     VkAccelerationStructureMemoryRequirementsInfoNV* to);
 
 void deepcopy_VkPhysicalDeviceRayTracingPropertiesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPropertiesNV* from,
     VkPhysicalDeviceRayTracingPropertiesNV* to);
 
 void deepcopy_VkTransformMatrixKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkTransformMatrixKHR* from,
     VkTransformMatrixKHR* to);
 
 DEFINE_ALIAS_FUNCTION(deepcopy_VkTransformMatrixKHR, deepcopy_VkTransformMatrixNV);
 
 void deepcopy_VkAabbPositionsKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAabbPositionsKHR* from,
     VkAabbPositionsKHR* to);
 
 DEFINE_ALIAS_FUNCTION(deepcopy_VkAabbPositionsKHR, deepcopy_VkAabbPositionsNV);
 
 void deepcopy_VkAccelerationStructureInstanceKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureInstanceKHR* from,
     VkAccelerationStructureInstanceKHR* to);
 
@@ -2761,24 +3199,28 @@
 #endif
 #ifdef VK_NV_representative_fragment_test
 void deepcopy_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* from,
     VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* to);
 
 void deepcopy_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineRepresentativeFragmentTestStateCreateInfoNV* from,
     VkPipelineRepresentativeFragmentTestStateCreateInfoNV* to);
 
 #endif
 #ifdef VK_EXT_filter_cubic
 void deepcopy_VkPhysicalDeviceImageViewImageFormatInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageViewImageFormatInfoEXT* from,
     VkPhysicalDeviceImageViewImageFormatInfoEXT* to);
 
 void deepcopy_VkFilterCubicImageViewImageFormatPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkFilterCubicImageViewImageFormatPropertiesEXT* from,
     VkFilterCubicImageViewImageFormatPropertiesEXT* to);
 
@@ -2787,24 +3229,28 @@
 #endif
 #ifdef VK_EXT_global_priority
 void deepcopy_VkDeviceQueueGlobalPriorityCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceQueueGlobalPriorityCreateInfoEXT* from,
     VkDeviceQueueGlobalPriorityCreateInfoEXT* to);
 
 #endif
 #ifdef VK_EXT_external_memory_host
 void deepcopy_VkImportMemoryHostPointerInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImportMemoryHostPointerInfoEXT* from,
     VkImportMemoryHostPointerInfoEXT* to);
 
 void deepcopy_VkMemoryHostPointerPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryHostPointerPropertiesEXT* from,
     VkMemoryHostPointerPropertiesEXT* to);
 
 void deepcopy_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalMemoryHostPropertiesEXT* from,
     VkPhysicalDeviceExternalMemoryHostPropertiesEXT* to);
 
@@ -2813,69 +3259,80 @@
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
 void deepcopy_VkPipelineCompilerControlCreateInfoAMD(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineCompilerControlCreateInfoAMD* from,
     VkPipelineCompilerControlCreateInfoAMD* to);
 
 #endif
 #ifdef VK_EXT_calibrated_timestamps
 void deepcopy_VkCalibratedTimestampInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCalibratedTimestampInfoEXT* from,
     VkCalibratedTimestampInfoEXT* to);
 
 #endif
 #ifdef VK_AMD_shader_core_properties
 void deepcopy_VkPhysicalDeviceShaderCorePropertiesAMD(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderCorePropertiesAMD* from,
     VkPhysicalDeviceShaderCorePropertiesAMD* to);
 
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
 void deepcopy_VkDeviceMemoryOverallocationCreateInfoAMD(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceMemoryOverallocationCreateInfoAMD* from,
     VkDeviceMemoryOverallocationCreateInfoAMD* to);
 
 #endif
 #ifdef VK_EXT_vertex_attribute_divisor
 void deepcopy_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* from,
     VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* to);
 
 void deepcopy_VkVertexInputBindingDivisorDescriptionEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkVertexInputBindingDivisorDescriptionEXT* from,
     VkVertexInputBindingDivisorDescriptionEXT* to);
 
 void deepcopy_VkPipelineVertexInputDivisorStateCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineVertexInputDivisorStateCreateInfoEXT* from,
     VkPipelineVertexInputDivisorStateCreateInfoEXT* to);
 
 void deepcopy_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* from,
     VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* to);
 
 #endif
 #ifdef VK_GGP_frame_token
 void deepcopy_VkPresentFrameTokenGGP(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPresentFrameTokenGGP* from,
     VkPresentFrameTokenGGP* to);
 
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
 void deepcopy_VkPipelineCreationFeedbackEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineCreationFeedbackEXT* from,
     VkPipelineCreationFeedbackEXT* to);
 
 void deepcopy_VkPipelineCreationFeedbackCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineCreationFeedbackCreateInfoEXT* from,
     VkPipelineCreationFeedbackCreateInfoEXT* to);
 
@@ -2884,165 +3341,192 @@
 #endif
 #ifdef VK_NV_compute_shader_derivatives
 void deepcopy_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* from,
     VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* to);
 
 #endif
 #ifdef VK_NV_mesh_shader
 void deepcopy_VkPhysicalDeviceMeshShaderFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceMeshShaderFeaturesNV* from,
     VkPhysicalDeviceMeshShaderFeaturesNV* to);
 
 void deepcopy_VkPhysicalDeviceMeshShaderPropertiesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceMeshShaderPropertiesNV* from,
     VkPhysicalDeviceMeshShaderPropertiesNV* to);
 
 void deepcopy_VkDrawMeshTasksIndirectCommandNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDrawMeshTasksIndirectCommandNV* from,
     VkDrawMeshTasksIndirectCommandNV* to);
 
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
 void deepcopy_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* from,
     VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* to);
 
 #endif
 #ifdef VK_NV_shader_image_footprint
 void deepcopy_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderImageFootprintFeaturesNV* from,
     VkPhysicalDeviceShaderImageFootprintFeaturesNV* to);
 
 #endif
 #ifdef VK_NV_scissor_exclusive
 void deepcopy_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineViewportExclusiveScissorStateCreateInfoNV* from,
     VkPipelineViewportExclusiveScissorStateCreateInfoNV* to);
 
 void deepcopy_VkPhysicalDeviceExclusiveScissorFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceExclusiveScissorFeaturesNV* from,
     VkPhysicalDeviceExclusiveScissorFeaturesNV* to);
 
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
 void deepcopy_VkQueueFamilyCheckpointPropertiesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkQueueFamilyCheckpointPropertiesNV* from,
     VkQueueFamilyCheckpointPropertiesNV* to);
 
 void deepcopy_VkCheckpointDataNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCheckpointDataNV* from,
     VkCheckpointDataNV* to);
 
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
 void deepcopy_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* from,
     VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* to);
 
 #endif
 #ifdef VK_INTEL_performance_query
 void deepcopy_VkPerformanceValueDataINTEL(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPerformanceValueDataINTEL* from,
     VkPerformanceValueDataINTEL* to);
 
 void deepcopy_VkPerformanceValueINTEL(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPerformanceValueINTEL* from,
     VkPerformanceValueINTEL* to);
 
 void deepcopy_VkInitializePerformanceApiInfoINTEL(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkInitializePerformanceApiInfoINTEL* from,
     VkInitializePerformanceApiInfoINTEL* to);
 
 void deepcopy_VkQueryPoolPerformanceQueryCreateInfoINTEL(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkQueryPoolPerformanceQueryCreateInfoINTEL* from,
     VkQueryPoolPerformanceQueryCreateInfoINTEL* to);
 
 DEFINE_ALIAS_FUNCTION(deepcopy_VkQueryPoolPerformanceQueryCreateInfoINTEL, deepcopy_VkQueryPoolCreateInfoINTEL);
 
 void deepcopy_VkPerformanceMarkerInfoINTEL(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPerformanceMarkerInfoINTEL* from,
     VkPerformanceMarkerInfoINTEL* to);
 
 void deepcopy_VkPerformanceStreamMarkerInfoINTEL(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPerformanceStreamMarkerInfoINTEL* from,
     VkPerformanceStreamMarkerInfoINTEL* to);
 
 void deepcopy_VkPerformanceOverrideInfoINTEL(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPerformanceOverrideInfoINTEL* from,
     VkPerformanceOverrideInfoINTEL* to);
 
 void deepcopy_VkPerformanceConfigurationAcquireInfoINTEL(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPerformanceConfigurationAcquireInfoINTEL* from,
     VkPerformanceConfigurationAcquireInfoINTEL* to);
 
 #endif
 #ifdef VK_EXT_pci_bus_info
 void deepcopy_VkPhysicalDevicePCIBusInfoPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDevicePCIBusInfoPropertiesEXT* from,
     VkPhysicalDevicePCIBusInfoPropertiesEXT* to);
 
 #endif
 #ifdef VK_AMD_display_native_hdr
 void deepcopy_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDisplayNativeHdrSurfaceCapabilitiesAMD* from,
     VkDisplayNativeHdrSurfaceCapabilitiesAMD* to);
 
 void deepcopy_VkSwapchainDisplayNativeHdrCreateInfoAMD(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSwapchainDisplayNativeHdrCreateInfoAMD* from,
     VkSwapchainDisplayNativeHdrCreateInfoAMD* to);
 
 #endif
 #ifdef VK_FUCHSIA_imagepipe_surface
 void deepcopy_VkImagePipeSurfaceCreateInfoFUCHSIA(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkImagePipeSurfaceCreateInfoFUCHSIA* from,
     VkImagePipeSurfaceCreateInfoFUCHSIA* to);
 
 #endif
 #ifdef VK_EXT_metal_surface
 void deepcopy_VkMetalSurfaceCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMetalSurfaceCreateInfoEXT* from,
     VkMetalSurfaceCreateInfoEXT* to);
 
 #endif
-#ifdef VK_GOOGLE_color_buffer
-void deepcopy_VkImportColorBufferGOOGLE(
-    BumpPool* pool,
-    const VkImportColorBufferGOOGLE* from,
-    VkImportColorBufferGOOGLE* to);
+#ifdef VK_EXT_fragment_density_map
+void deepcopy_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
+    Allocator* alloc,
+    VkStructureType rootType,
+    const VkPhysicalDeviceFragmentDensityMapFeaturesEXT* from,
+    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* to);
 
-void deepcopy_VkImportBufferGOOGLE(
-    BumpPool* pool,
-    const VkImportBufferGOOGLE* from,
-    VkImportBufferGOOGLE* to);
+void deepcopy_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
+    Allocator* alloc,
+    VkStructureType rootType,
+    const VkPhysicalDeviceFragmentDensityMapPropertiesEXT* from,
+    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* to);
 
-void deepcopy_VkImportPhysicalAddressGOOGLE(
-    BumpPool* pool,
-    const VkImportPhysicalAddressGOOGLE* from,
-    VkImportPhysicalAddressGOOGLE* to);
+void deepcopy_VkRenderPassFragmentDensityMapCreateInfoEXT(
+    Allocator* alloc,
+    VkStructureType rootType,
+    const VkRenderPassFragmentDensityMapCreateInfoEXT* from,
+    VkRenderPassFragmentDensityMapCreateInfoEXT* to);
 
 #endif
 #ifdef VK_EXT_scalar_block_layout
@@ -3055,71 +3539,82 @@
 #endif
 #ifdef VK_EXT_subgroup_size_control
 void deepcopy_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* from,
     VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* to);
 
 void deepcopy_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* from,
     VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* to);
 
 void deepcopy_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* from,
     VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* to);
 
 #endif
 #ifdef VK_AMD_shader_core_properties2
 void deepcopy_VkPhysicalDeviceShaderCoreProperties2AMD(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderCoreProperties2AMD* from,
     VkPhysicalDeviceShaderCoreProperties2AMD* to);
 
 #endif
 #ifdef VK_AMD_device_coherent_memory
 void deepcopy_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceCoherentMemoryFeaturesAMD* from,
     VkPhysicalDeviceCoherentMemoryFeaturesAMD* to);
 
 #endif
 #ifdef VK_EXT_shader_image_atomic_int64
 void deepcopy_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* from,
     VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* to);
 
 #endif
 #ifdef VK_EXT_memory_budget
 void deepcopy_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryBudgetPropertiesEXT* from,
     VkPhysicalDeviceMemoryBudgetPropertiesEXT* to);
 
 #endif
 #ifdef VK_EXT_memory_priority
 void deepcopy_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryPriorityFeaturesEXT* from,
     VkPhysicalDeviceMemoryPriorityFeaturesEXT* to);
 
 void deepcopy_VkMemoryPriorityAllocateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkMemoryPriorityAllocateInfoEXT* from,
     VkMemoryPriorityAllocateInfoEXT* to);
 
 #endif
 #ifdef VK_NV_dedicated_allocation_image_aliasing
 void deepcopy_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* from,
     VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* to);
 
 #endif
 #ifdef VK_EXT_buffer_device_address
 void deepcopy_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* from,
     VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* to);
 
@@ -3128,14 +3623,16 @@
 DEFINE_ALIAS_FUNCTION(deepcopy_VkBufferDeviceAddressInfo, deepcopy_VkBufferDeviceAddressInfoEXT);
 
 void deepcopy_VkBufferDeviceAddressCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBufferDeviceAddressCreateInfoEXT* from,
     VkBufferDeviceAddressCreateInfoEXT* to);
 
 #endif
 #ifdef VK_EXT_tooling_info
 void deepcopy_VkPhysicalDeviceToolPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceToolPropertiesEXT* from,
     VkPhysicalDeviceToolPropertiesEXT* to);
 
@@ -3146,103 +3643,120 @@
 #endif
 #ifdef VK_EXT_validation_features
 void deepcopy_VkValidationFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkValidationFeaturesEXT* from,
     VkValidationFeaturesEXT* to);
 
 #endif
 #ifdef VK_NV_cooperative_matrix
 void deepcopy_VkCooperativeMatrixPropertiesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCooperativeMatrixPropertiesNV* from,
     VkCooperativeMatrixPropertiesNV* to);
 
 void deepcopy_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceCooperativeMatrixFeaturesNV* from,
     VkPhysicalDeviceCooperativeMatrixFeaturesNV* to);
 
 void deepcopy_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceCooperativeMatrixPropertiesNV* from,
     VkPhysicalDeviceCooperativeMatrixPropertiesNV* to);
 
 #endif
 #ifdef VK_NV_coverage_reduction_mode
 void deepcopy_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceCoverageReductionModeFeaturesNV* from,
     VkPhysicalDeviceCoverageReductionModeFeaturesNV* to);
 
 void deepcopy_VkPipelineCoverageReductionStateCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineCoverageReductionStateCreateInfoNV* from,
     VkPipelineCoverageReductionStateCreateInfoNV* to);
 
 void deepcopy_VkFramebufferMixedSamplesCombinationNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkFramebufferMixedSamplesCombinationNV* from,
     VkFramebufferMixedSamplesCombinationNV* to);
 
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
 void deepcopy_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* from,
     VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* to);
 
 #endif
 #ifdef VK_EXT_ycbcr_image_arrays
 void deepcopy_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* from,
     VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* to);
 
 #endif
 #ifdef VK_EXT_full_screen_exclusive
 void deepcopy_VkSurfaceFullScreenExclusiveInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSurfaceFullScreenExclusiveInfoEXT* from,
     VkSurfaceFullScreenExclusiveInfoEXT* to);
 
 void deepcopy_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSurfaceCapabilitiesFullScreenExclusiveEXT* from,
     VkSurfaceCapabilitiesFullScreenExclusiveEXT* to);
 
 void deepcopy_VkSurfaceFullScreenExclusiveWin32InfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSurfaceFullScreenExclusiveWin32InfoEXT* from,
     VkSurfaceFullScreenExclusiveWin32InfoEXT* to);
 
 #endif
 #ifdef VK_EXT_headless_surface
 void deepcopy_VkHeadlessSurfaceCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkHeadlessSurfaceCreateInfoEXT* from,
     VkHeadlessSurfaceCreateInfoEXT* to);
 
 #endif
 #ifdef VK_EXT_line_rasterization
 void deepcopy_VkPhysicalDeviceLineRasterizationFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceLineRasterizationFeaturesEXT* from,
     VkPhysicalDeviceLineRasterizationFeaturesEXT* to);
 
 void deepcopy_VkPhysicalDeviceLineRasterizationPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceLineRasterizationPropertiesEXT* from,
     VkPhysicalDeviceLineRasterizationPropertiesEXT* to);
 
 void deepcopy_VkPipelineRasterizationLineStateCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineRasterizationLineStateCreateInfoEXT* from,
     VkPipelineRasterizationLineStateCreateInfoEXT* to);
 
 #endif
 #ifdef VK_EXT_shader_atomic_float
 void deepcopy_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* from,
     VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* to);
 
@@ -3253,158 +3767,186 @@
 #endif
 #ifdef VK_EXT_index_type_uint8
 void deepcopy_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceIndexTypeUint8FeaturesEXT* from,
     VkPhysicalDeviceIndexTypeUint8FeaturesEXT* to);
 
 #endif
 #ifdef VK_EXT_extended_dynamic_state
 void deepcopy_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* from,
     VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* to);
 
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 void deepcopy_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* from,
     VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* to);
 
 #endif
 #ifdef VK_NV_device_generated_commands
 void deepcopy_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* from,
     VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* to);
 
 void deepcopy_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* from,
     VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* to);
 
 void deepcopy_VkGraphicsShaderGroupCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkGraphicsShaderGroupCreateInfoNV* from,
     VkGraphicsShaderGroupCreateInfoNV* to);
 
 void deepcopy_VkGraphicsPipelineShaderGroupsCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkGraphicsPipelineShaderGroupsCreateInfoNV* from,
     VkGraphicsPipelineShaderGroupsCreateInfoNV* to);
 
 void deepcopy_VkBindShaderGroupIndirectCommandNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBindShaderGroupIndirectCommandNV* from,
     VkBindShaderGroupIndirectCommandNV* to);
 
 void deepcopy_VkBindIndexBufferIndirectCommandNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBindIndexBufferIndirectCommandNV* from,
     VkBindIndexBufferIndirectCommandNV* to);
 
 void deepcopy_VkBindVertexBufferIndirectCommandNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkBindVertexBufferIndirectCommandNV* from,
     VkBindVertexBufferIndirectCommandNV* to);
 
 void deepcopy_VkSetStateFlagsIndirectCommandNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSetStateFlagsIndirectCommandNV* from,
     VkSetStateFlagsIndirectCommandNV* to);
 
 void deepcopy_VkIndirectCommandsStreamNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkIndirectCommandsStreamNV* from,
     VkIndirectCommandsStreamNV* to);
 
 void deepcopy_VkIndirectCommandsLayoutTokenNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkIndirectCommandsLayoutTokenNV* from,
     VkIndirectCommandsLayoutTokenNV* to);
 
 void deepcopy_VkIndirectCommandsLayoutCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkIndirectCommandsLayoutCreateInfoNV* from,
     VkIndirectCommandsLayoutCreateInfoNV* to);
 
 void deepcopy_VkGeneratedCommandsInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkGeneratedCommandsInfoNV* from,
     VkGeneratedCommandsInfoNV* to);
 
 void deepcopy_VkGeneratedCommandsMemoryRequirementsInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkGeneratedCommandsMemoryRequirementsInfoNV* from,
     VkGeneratedCommandsMemoryRequirementsInfoNV* to);
 
 #endif
 #ifdef VK_EXT_texel_buffer_alignment
 void deepcopy_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* from,
     VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* to);
 
 void deepcopy_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* from,
     VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* to);
 
 #endif
 #ifdef VK_QCOM_render_pass_transform
 void deepcopy_VkRenderPassTransformBeginInfoQCOM(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRenderPassTransformBeginInfoQCOM* from,
     VkRenderPassTransformBeginInfoQCOM* to);
 
 void deepcopy_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCommandBufferInheritanceRenderPassTransformInfoQCOM* from,
     VkCommandBufferInheritanceRenderPassTransformInfoQCOM* to);
 
 #endif
 #ifdef VK_EXT_device_memory_report
 void deepcopy_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* from,
     VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* to);
 
 void deepcopy_VkDeviceMemoryReportCallbackDataEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceMemoryReportCallbackDataEXT* from,
     VkDeviceMemoryReportCallbackDataEXT* to);
 
 void deepcopy_VkDeviceDeviceMemoryReportCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceDeviceMemoryReportCreateInfoEXT* from,
     VkDeviceDeviceMemoryReportCreateInfoEXT* to);
 
 #endif
 #ifdef VK_EXT_robustness2
 void deepcopy_VkPhysicalDeviceRobustness2FeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceRobustness2FeaturesEXT* from,
     VkPhysicalDeviceRobustness2FeaturesEXT* to);
 
 void deepcopy_VkPhysicalDeviceRobustness2PropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceRobustness2PropertiesEXT* from,
     VkPhysicalDeviceRobustness2PropertiesEXT* to);
 
 #endif
 #ifdef VK_EXT_custom_border_color
 void deepcopy_VkSamplerCustomBorderColorCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkSamplerCustomBorderColorCreateInfoEXT* from,
     VkSamplerCustomBorderColorCreateInfoEXT* to);
 
 void deepcopy_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceCustomBorderColorPropertiesEXT* from,
     VkPhysicalDeviceCustomBorderColorPropertiesEXT* to);
 
 void deepcopy_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceCustomBorderColorFeaturesEXT* from,
     VkPhysicalDeviceCustomBorderColorFeaturesEXT* to);
 
@@ -3413,36 +3955,42 @@
 #endif
 #ifdef VK_EXT_private_data
 void deepcopy_VkPhysicalDevicePrivateDataFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDevicePrivateDataFeaturesEXT* from,
     VkPhysicalDevicePrivateDataFeaturesEXT* to);
 
 void deepcopy_VkDevicePrivateDataCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDevicePrivateDataCreateInfoEXT* from,
     VkDevicePrivateDataCreateInfoEXT* to);
 
 void deepcopy_VkPrivateDataSlotCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPrivateDataSlotCreateInfoEXT* from,
     VkPrivateDataSlotCreateInfoEXT* to);
 
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
 void deepcopy_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* from,
     VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* to);
 
 #endif
 #ifdef VK_NV_device_diagnostics_config
 void deepcopy_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceDiagnosticsConfigFeaturesNV* from,
     VkPhysicalDeviceDiagnosticsConfigFeaturesNV* to);
 
 void deepcopy_VkDeviceDiagnosticsConfigCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceDiagnosticsConfigCreateInfoNV* from,
     VkDeviceDiagnosticsConfigCreateInfoNV* to);
 
@@ -3451,200 +3999,254 @@
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
 void deepcopy_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* from,
     VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* to);
 
 void deepcopy_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* from,
     VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* to);
 
 void deepcopy_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPipelineFragmentShadingRateEnumStateCreateInfoNV* from,
     VkPipelineFragmentShadingRateEnumStateCreateInfoNV* to);
 
 #endif
 #ifdef VK_EXT_fragment_density_map2
 void deepcopy_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* from,
     VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* to);
 
 void deepcopy_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* from,
     VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* to);
 
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
 void deepcopy_VkCopyCommandTransformInfoQCOM(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCopyCommandTransformInfoQCOM* from,
     VkCopyCommandTransformInfoQCOM* to);
 
 #endif
 #ifdef VK_EXT_image_robustness
 void deepcopy_VkPhysicalDeviceImageRobustnessFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageRobustnessFeaturesEXT* from,
     VkPhysicalDeviceImageRobustnessFeaturesEXT* to);
 
 #endif
 #ifdef VK_EXT_4444_formats
 void deepcopy_VkPhysicalDevice4444FormatsFeaturesEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDevice4444FormatsFeaturesEXT* from,
     VkPhysicalDevice4444FormatsFeaturesEXT* to);
 
 #endif
 #ifdef VK_EXT_directfb_surface
 void deepcopy_VkDirectFBSurfaceCreateInfoEXT(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDirectFBSurfaceCreateInfoEXT* from,
     VkDirectFBSurfaceCreateInfoEXT* to);
 
 #endif
 #ifdef VK_GOOGLE_gfxstream
+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_VkImportPhysicalAddressGOOGLE(
+    Allocator* alloc,
+    VkStructureType rootType,
+    const VkImportPhysicalAddressGOOGLE* from,
+    VkImportPhysicalAddressGOOGLE* to);
+
 #endif
 #ifdef VK_KHR_acceleration_structure
 void deepcopy_VkDeviceOrHostAddressKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceOrHostAddressKHR* from,
     VkDeviceOrHostAddressKHR* to);
 
 void deepcopy_VkDeviceOrHostAddressConstKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkDeviceOrHostAddressConstKHR* from,
     VkDeviceOrHostAddressConstKHR* to);
 
 void deepcopy_VkAccelerationStructureBuildRangeInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureBuildRangeInfoKHR* from,
     VkAccelerationStructureBuildRangeInfoKHR* to);
 
 void deepcopy_VkAccelerationStructureGeometryTrianglesDataKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryTrianglesDataKHR* from,
     VkAccelerationStructureGeometryTrianglesDataKHR* to);
 
 void deepcopy_VkAccelerationStructureGeometryAabbsDataKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryAabbsDataKHR* from,
     VkAccelerationStructureGeometryAabbsDataKHR* to);
 
 void deepcopy_VkAccelerationStructureGeometryInstancesDataKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryInstancesDataKHR* from,
     VkAccelerationStructureGeometryInstancesDataKHR* to);
 
 void deepcopy_VkAccelerationStructureGeometryDataKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryDataKHR* from,
     VkAccelerationStructureGeometryDataKHR* to);
 
 void deepcopy_VkAccelerationStructureGeometryKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryKHR* from,
     VkAccelerationStructureGeometryKHR* to);
 
 void deepcopy_VkAccelerationStructureBuildGeometryInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureBuildGeometryInfoKHR* from,
     VkAccelerationStructureBuildGeometryInfoKHR* to);
 
 void deepcopy_VkAccelerationStructureCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureCreateInfoKHR* from,
     VkAccelerationStructureCreateInfoKHR* to);
 
 void deepcopy_VkWriteDescriptorSetAccelerationStructureKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkWriteDescriptorSetAccelerationStructureKHR* from,
     VkWriteDescriptorSetAccelerationStructureKHR* to);
 
 void deepcopy_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceAccelerationStructureFeaturesKHR* from,
     VkPhysicalDeviceAccelerationStructureFeaturesKHR* to);
 
 void deepcopy_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceAccelerationStructurePropertiesKHR* from,
     VkPhysicalDeviceAccelerationStructurePropertiesKHR* to);
 
 void deepcopy_VkAccelerationStructureDeviceAddressInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureDeviceAddressInfoKHR* from,
     VkAccelerationStructureDeviceAddressInfoKHR* to);
 
 void deepcopy_VkAccelerationStructureVersionInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureVersionInfoKHR* from,
     VkAccelerationStructureVersionInfoKHR* to);
 
 void deepcopy_VkCopyAccelerationStructureToMemoryInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCopyAccelerationStructureToMemoryInfoKHR* from,
     VkCopyAccelerationStructureToMemoryInfoKHR* to);
 
 void deepcopy_VkCopyMemoryToAccelerationStructureInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCopyMemoryToAccelerationStructureInfoKHR* from,
     VkCopyMemoryToAccelerationStructureInfoKHR* to);
 
 void deepcopy_VkCopyAccelerationStructureInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkCopyAccelerationStructureInfoKHR* from,
     VkCopyAccelerationStructureInfoKHR* to);
 
 void deepcopy_VkAccelerationStructureBuildSizesInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkAccelerationStructureBuildSizesInfoKHR* from,
     VkAccelerationStructureBuildSizesInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
 void deepcopy_VkRayTracingShaderGroupCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRayTracingShaderGroupCreateInfoKHR* from,
     VkRayTracingShaderGroupCreateInfoKHR* to);
 
 void deepcopy_VkRayTracingPipelineInterfaceCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRayTracingPipelineInterfaceCreateInfoKHR* from,
     VkRayTracingPipelineInterfaceCreateInfoKHR* to);
 
 void deepcopy_VkRayTracingPipelineCreateInfoKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkRayTracingPipelineCreateInfoKHR* from,
     VkRayTracingPipelineCreateInfoKHR* to);
 
 void deepcopy_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPipelineFeaturesKHR* from,
     VkPhysicalDeviceRayTracingPipelineFeaturesKHR* to);
 
 void deepcopy_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPipelinePropertiesKHR* from,
     VkPhysicalDeviceRayTracingPipelinePropertiesKHR* to);
 
 void deepcopy_VkStridedDeviceAddressRegionKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkStridedDeviceAddressRegionKHR* from,
     VkStridedDeviceAddressRegionKHR* to);
 
 void deepcopy_VkTraceRaysIndirectCommandKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkTraceRaysIndirectCommandKHR* from,
     VkTraceRaysIndirectCommandKHR* to);
 
 #endif
 #ifdef VK_KHR_ray_query
 void deepcopy_VkPhysicalDeviceRayQueryFeaturesKHR(
-    BumpPool* pool,
+    Allocator* alloc,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayQueryFeaturesKHR* from,
     VkPhysicalDeviceRayQueryFeaturesKHR* to);
 
diff --git a/system/vulkan_enc/goldfish_vk_extension_structs_guest.cpp b/system/vulkan_enc/goldfish_vk_extension_structs_guest.cpp
index 9169a98..5984b4d 100644
--- a/system/vulkan_enc/goldfish_vk_extension_structs_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_extension_structs_guest.cpp
@@ -386,7 +386,7 @@
 #endif
 #ifdef VK_EXT_metal_surface
 #endif
-#ifdef VK_GOOGLE_color_buffer
+#ifdef VK_EXT_fragment_density_map
 #endif
 #ifdef VK_EXT_scalar_block_layout
 #endif
@@ -490,6 +490,7 @@
 }
 
 size_t goldfish_vk_extension_struct_size(
+    VkStructureType rootType,
     const void* structExtension)
 {
     if (!structExtension)
@@ -1437,18 +1438,79 @@
             return sizeof(VkSwapchainDisplayNativeHdrCreateInfoAMD);
         }
 #endif
-#ifdef VK_GOOGLE_color_buffer
-        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE:
+#ifdef VK_EXT_fragment_density_map
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT:
         {
-            return sizeof(VkImportColorBufferGOOGLE);
+            switch(rootType)
+            {
+                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
+                {
+                    return sizeof(VkPhysicalDeviceFragmentDensityMapFeaturesEXT);
+                    break;
+                }
+                case VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO:
+                {
+                    return sizeof(VkPhysicalDeviceFragmentDensityMapFeaturesEXT);
+                    break;
+                }
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
+                {
+                    return sizeof(VkImportColorBufferGOOGLE);
+                    break;
+                }
+                default:
+                {
+                    return sizeof(VkPhysicalDeviceFragmentDensityMapFeaturesEXT);
+                    break;
+                }
+            }
         }
-        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE:
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT:
         {
-            return sizeof(VkImportBufferGOOGLE);
+            switch(rootType)
+            {
+                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2:
+                {
+                    return sizeof(VkPhysicalDeviceFragmentDensityMapPropertiesEXT);
+                    break;
+                }
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
+                {
+                    return sizeof(VkImportPhysicalAddressGOOGLE);
+                    break;
+                }
+                default:
+                {
+                    return sizeof(VkPhysicalDeviceFragmentDensityMapPropertiesEXT);
+                    break;
+                }
+            }
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
+        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT:
         {
-            return sizeof(VkImportPhysicalAddressGOOGLE);
+            switch(rootType)
+            {
+                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO:
+                {
+                    return sizeof(VkRenderPassFragmentDensityMapCreateInfoEXT);
+                    break;
+                }
+                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2:
+                {
+                    return sizeof(VkRenderPassFragmentDensityMapCreateInfoEXT);
+                    break;
+                }
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
+                {
+                    return sizeof(VkImportBufferGOOGLE);
+                    break;
+                }
+                default:
+                {
+                    return sizeof(VkRenderPassFragmentDensityMapCreateInfoEXT);
+                    break;
+                }
+            }
         }
 #endif
 #ifdef VK_EXT_subgroup_size_control
@@ -1741,6 +1803,20 @@
             return sizeof(VkPhysicalDevice4444FormatsFeaturesEXT);
         }
 #endif
+#ifdef VK_GOOGLE_gfxstream
+        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE:
+        {
+            return sizeof(VkImportColorBufferGOOGLE);
+        }
+        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE:
+        {
+            return sizeof(VkImportBufferGOOGLE);
+        }
+        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
+        {
+            return sizeof(VkImportPhysicalAddressGOOGLE);
+        }
+#endif
 #ifdef VK_KHR_acceleration_structure
         case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR:
         {
@@ -1780,6 +1856,7 @@
 
 size_t goldfish_vk_extension_struct_size_with_stream_features(
     uint32_t streamFeatures,
+    VkStructureType rootType,
     const void* structExtension)
 {
     if (!structExtension)
@@ -2734,18 +2811,79 @@
             return sizeof(VkSwapchainDisplayNativeHdrCreateInfoAMD);
         }
 #endif
-#ifdef VK_GOOGLE_color_buffer
-        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE:
+#ifdef VK_EXT_fragment_density_map
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT:
         {
-            return sizeof(VkImportColorBufferGOOGLE);
+            switch(rootType)
+            {
+                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
+                {
+                    return sizeof(VkPhysicalDeviceFragmentDensityMapFeaturesEXT);
+                    break;
+                }
+                case VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO:
+                {
+                    return sizeof(VkPhysicalDeviceFragmentDensityMapFeaturesEXT);
+                    break;
+                }
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
+                {
+                    return sizeof(VkImportColorBufferGOOGLE);
+                    break;
+                }
+                default:
+                {
+                    return sizeof(VkPhysicalDeviceFragmentDensityMapFeaturesEXT);
+                    break;
+                }
+            }
         }
-        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE:
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT:
         {
-            return sizeof(VkImportBufferGOOGLE);
+            switch(rootType)
+            {
+                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2:
+                {
+                    return sizeof(VkPhysicalDeviceFragmentDensityMapPropertiesEXT);
+                    break;
+                }
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
+                {
+                    return sizeof(VkImportPhysicalAddressGOOGLE);
+                    break;
+                }
+                default:
+                {
+                    return sizeof(VkPhysicalDeviceFragmentDensityMapPropertiesEXT);
+                    break;
+                }
+            }
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
+        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT:
         {
-            return sizeof(VkImportPhysicalAddressGOOGLE);
+            switch(rootType)
+            {
+                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO:
+                {
+                    return sizeof(VkRenderPassFragmentDensityMapCreateInfoEXT);
+                    break;
+                }
+                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2:
+                {
+                    return sizeof(VkRenderPassFragmentDensityMapCreateInfoEXT);
+                    break;
+                }
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
+                {
+                    return sizeof(VkImportBufferGOOGLE);
+                    break;
+                }
+                default:
+                {
+                    return sizeof(VkRenderPassFragmentDensityMapCreateInfoEXT);
+                    break;
+                }
+            }
         }
 #endif
 #ifdef VK_EXT_subgroup_size_control
@@ -3038,6 +3176,20 @@
             return sizeof(VkPhysicalDevice4444FormatsFeaturesEXT);
         }
 #endif
+#ifdef VK_GOOGLE_gfxstream
+        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE:
+        {
+            return sizeof(VkImportColorBufferGOOGLE);
+        }
+        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE:
+        {
+            return sizeof(VkImportBufferGOOGLE);
+        }
+        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
+        {
+            return sizeof(VkImportPhysicalAddressGOOGLE);
+        }
+#endif
 #ifdef VK_KHR_acceleration_structure
         case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR:
         {
diff --git a/system/vulkan_enc/goldfish_vk_extension_structs_guest.h b/system/vulkan_enc/goldfish_vk_extension_structs_guest.h
index 1fddc3b..6bae0b8 100644
--- a/system/vulkan_enc/goldfish_vk_extension_structs_guest.h
+++ b/system/vulkan_enc/goldfish_vk_extension_structs_guest.h
@@ -43,10 +43,12 @@
     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);
 
 #ifdef VK_VERSION_1_0
@@ -407,7 +409,7 @@
 #endif
 #ifdef VK_EXT_metal_surface
 #endif
-#ifdef VK_GOOGLE_color_buffer
+#ifdef VK_EXT_fragment_density_map
 #endif
 #ifdef VK_EXT_scalar_block_layout
 #endif
diff --git a/system/vulkan_enc/goldfish_vk_handlemap_guest.cpp b/system/vulkan_enc/goldfish_vk_handlemap_guest.cpp
index aa1de2d..269b50b 100644
--- a/system/vulkan_enc/goldfish_vk_handlemap_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_handlemap_guest.cpp
@@ -6816,10 +6816,10 @@
 }
 
 #endif
-#ifdef VK_GOOGLE_color_buffer
-void handlemap_VkImportColorBufferGOOGLE(
+#ifdef VK_EXT_fragment_density_map
+void handlemap_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
     VulkanHandleMapping* handlemap,
-    VkImportColorBufferGOOGLE* toMap)
+    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* toMap)
 {
     (void)handlemap;
     (void)toMap;
@@ -6829,9 +6829,9 @@
     }
 }
 
-void handlemap_VkImportBufferGOOGLE(
+void handlemap_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
     VulkanHandleMapping* handlemap,
-    VkImportBufferGOOGLE* toMap)
+    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* toMap)
 {
     (void)handlemap;
     (void)toMap;
@@ -6839,11 +6839,13 @@
     {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
+    handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->minFragmentDensityTexelSize));
+    handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->maxFragmentDensityTexelSize));
 }
 
-void handlemap_VkImportPhysicalAddressGOOGLE(
+void handlemap_VkRenderPassFragmentDensityMapCreateInfoEXT(
     VulkanHandleMapping* handlemap,
-    VkImportPhysicalAddressGOOGLE* toMap)
+    VkRenderPassFragmentDensityMapCreateInfoEXT* toMap)
 {
     (void)handlemap;
     (void)toMap;
@@ -6851,6 +6853,7 @@
     {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
+    handlemap_VkAttachmentReference(handlemap, (VkAttachmentReference*)(&toMap->fragmentDensityMapAttachment));
 }
 
 #endif
@@ -7860,6 +7863,42 @@
 
 #endif
 #ifdef VK_GOOGLE_gfxstream
+void handlemap_VkImportColorBufferGOOGLE(
+    VulkanHandleMapping* handlemap,
+    VkImportColorBufferGOOGLE* toMap)
+{
+    (void)handlemap;
+    (void)toMap;
+    if (toMap->pNext)
+    {
+        handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
+    }
+}
+
+void handlemap_VkImportBufferGOOGLE(
+    VulkanHandleMapping* handlemap,
+    VkImportBufferGOOGLE* toMap)
+{
+    (void)handlemap;
+    (void)toMap;
+    if (toMap->pNext)
+    {
+        handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
+    }
+}
+
+void handlemap_VkImportPhysicalAddressGOOGLE(
+    VulkanHandleMapping* handlemap,
+    VkImportPhysicalAddressGOOGLE* toMap)
+{
+    (void)handlemap;
+    (void)toMap;
+    if (toMap->pNext)
+    {
+        handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
+    }
+}
+
 #endif
 #ifdef VK_KHR_acceleration_structure
 void handlemap_VkDeviceOrHostAddressKHR(
@@ -9382,20 +9421,20 @@
             break;
         }
 #endif
-#ifdef VK_GOOGLE_color_buffer
-        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE:
+#ifdef VK_EXT_fragment_density_map
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT:
         {
-            handlemap_VkImportColorBufferGOOGLE(handlemap, reinterpret_cast<VkImportColorBufferGOOGLE*>(structExtension_out));
+            handlemap_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE:
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT:
         {
-            handlemap_VkImportBufferGOOGLE(handlemap, reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out));
+            handlemap_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
+        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT:
         {
-            handlemap_VkImportPhysicalAddressGOOGLE(handlemap, reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
+            handlemap_VkRenderPassFragmentDensityMapCreateInfoEXT(handlemap, reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
@@ -9745,6 +9784,23 @@
             break;
         }
 #endif
+#ifdef VK_GOOGLE_gfxstream
+        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));
+            break;
+        }
+        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
+        {
+            handlemap_VkImportPhysicalAddressGOOGLE(handlemap, reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
+            break;
+        }
+#endif
 #ifdef VK_KHR_acceleration_structure
         case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR:
         {
diff --git a/system/vulkan_enc/goldfish_vk_handlemap_guest.h b/system/vulkan_enc/goldfish_vk_handlemap_guest.h
index 5362193..9157ecb 100644
--- a/system/vulkan_enc/goldfish_vk_handlemap_guest.h
+++ b/system/vulkan_enc/goldfish_vk_handlemap_guest.h
@@ -2547,18 +2547,18 @@
     VkMetalSurfaceCreateInfoEXT* toMap);
 
 #endif
-#ifdef VK_GOOGLE_color_buffer
-void handlemap_VkImportColorBufferGOOGLE(
+#ifdef VK_EXT_fragment_density_map
+void handlemap_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
     VulkanHandleMapping* handlemap,
-    VkImportColorBufferGOOGLE* toMap);
+    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* toMap);
 
-void handlemap_VkImportBufferGOOGLE(
+void handlemap_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
     VulkanHandleMapping* handlemap,
-    VkImportBufferGOOGLE* toMap);
+    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* toMap);
 
-void handlemap_VkImportPhysicalAddressGOOGLE(
+void handlemap_VkRenderPassFragmentDensityMapCreateInfoEXT(
     VulkanHandleMapping* handlemap,
-    VkImportPhysicalAddressGOOGLE* toMap);
+    VkRenderPassFragmentDensityMapCreateInfoEXT* toMap);
 
 #endif
 #ifdef VK_EXT_scalar_block_layout
@@ -2950,6 +2950,18 @@
 
 #endif
 #ifdef VK_GOOGLE_gfxstream
+void handlemap_VkImportColorBufferGOOGLE(
+    VulkanHandleMapping* handlemap,
+    VkImportColorBufferGOOGLE* toMap);
+
+void handlemap_VkImportBufferGOOGLE(
+    VulkanHandleMapping* handlemap,
+    VkImportBufferGOOGLE* toMap);
+
+void handlemap_VkImportPhysicalAddressGOOGLE(
+    VulkanHandleMapping* handlemap,
+    VkImportPhysicalAddressGOOGLE* toMap);
+
 #endif
 #ifdef VK_KHR_acceleration_structure
 void handlemap_VkDeviceOrHostAddressKHR(
diff --git a/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp b/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
index ab83727..5b1e964 100644
--- a/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
@@ -33,33 +33,41 @@
 
 void marshal_extension_struct(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const void* structExtension);
 
 void unmarshal_extension_struct(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     void* structExtension_out);
 
 #ifdef VK_VERSION_1_0
 void marshal_VkExtent2D(
     VulkanStreamGuest* 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(
     VulkanStreamGuest* 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(
     VulkanStreamGuest* 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));
@@ -67,8 +75,10 @@
 
 void unmarshal_VkExtent3D(
     VulkanStreamGuest* 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));
@@ -76,24 +86,30 @@
 
 void marshal_VkOffset2D(
     VulkanStreamGuest* 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(
     VulkanStreamGuest* 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(
     VulkanStreamGuest* 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));
@@ -101,8 +117,10 @@
 
 void unmarshal_VkOffset3D(
     VulkanStreamGuest* 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));
@@ -110,58 +128,92 @@
 
 void marshal_VkRect2D(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRect2D* forMarshaling)
 {
-    marshal_VkOffset2D(vkStream, (VkOffset2D*)(&forMarshaling->offset));
-    marshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->extent));
+    (void)rootType;
+    marshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forMarshaling->offset));
+    marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->extent));
 }
 
 void unmarshal_VkRect2D(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRect2D* forUnmarshaling)
 {
-    unmarshal_VkOffset2D(vkStream, (VkOffset2D*)(&forUnmarshaling->offset));
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->extent));
+    (void)rootType;
+    unmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forUnmarshaling->offset));
+    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->extent));
 }
 
 void marshal_VkBaseInStructure(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBaseInStructure* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
 }
 
 void unmarshal_VkBaseInStructure(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBaseInStructure* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
 }
 
 void marshal_VkBaseOutStructure(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBaseOutStructure* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
 }
 
 void unmarshal_VkBaseOutStructure(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBaseOutStructure* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
 }
 
 void marshal_VkBufferMemoryBarrier(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferMemoryBarrier* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkAccessFlags*)&forMarshaling->srcAccessMask, sizeof(VkAccessFlags));
     vkStream->write((VkAccessFlags*)&forMarshaling->dstAccessMask, sizeof(VkAccessFlags));
     vkStream->write((uint32_t*)&forMarshaling->srcQueueFamilyIndex, sizeof(uint32_t));
@@ -175,10 +227,16 @@
 
 void unmarshal_VkBufferMemoryBarrier(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBufferMemoryBarrier* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkAccessFlags*)&forUnmarshaling->srcAccessMask, sizeof(VkAccessFlags));
     vkStream->read((VkAccessFlags*)&forUnmarshaling->dstAccessMask, sizeof(VkAccessFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->srcQueueFamilyIndex, sizeof(uint32_t));
@@ -192,8 +250,10 @@
 
 void marshal_VkDispatchIndirectCommand(
     VulkanStreamGuest* 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));
@@ -201,8 +261,10 @@
 
 void unmarshal_VkDispatchIndirectCommand(
     VulkanStreamGuest* 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));
@@ -210,8 +272,10 @@
 
 void marshal_VkDrawIndexedIndirectCommand(
     VulkanStreamGuest* 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));
     vkStream->write((uint32_t*)&forMarshaling->firstIndex, sizeof(uint32_t));
@@ -221,8 +285,10 @@
 
 void unmarshal_VkDrawIndexedIndirectCommand(
     VulkanStreamGuest* 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));
     vkStream->read((uint32_t*)&forUnmarshaling->firstIndex, sizeof(uint32_t));
@@ -232,8 +298,10 @@
 
 void marshal_VkDrawIndirectCommand(
     VulkanStreamGuest* 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));
     vkStream->write((uint32_t*)&forMarshaling->firstVertex, sizeof(uint32_t));
@@ -242,8 +310,10 @@
 
 void unmarshal_VkDrawIndirectCommand(
     VulkanStreamGuest* 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));
     vkStream->read((uint32_t*)&forUnmarshaling->firstVertex, sizeof(uint32_t));
@@ -252,8 +322,10 @@
 
 void marshal_VkImageSubresourceRange(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageSubresourceRange* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkImageAspectFlags*)&forMarshaling->aspectMask, sizeof(VkImageAspectFlags));
     vkStream->write((uint32_t*)&forMarshaling->baseMipLevel, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->levelCount, sizeof(uint32_t));
@@ -263,8 +335,10 @@
 
 void unmarshal_VkImageSubresourceRange(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageSubresourceRange* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkImageAspectFlags*)&forUnmarshaling->aspectMask, sizeof(VkImageAspectFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->baseMipLevel, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->levelCount, sizeof(uint32_t));
@@ -274,10 +348,16 @@
 
 void marshal_VkImageMemoryBarrier(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageMemoryBarrier* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkAccessFlags*)&forMarshaling->srcAccessMask, sizeof(VkAccessFlags));
     vkStream->write((VkAccessFlags*)&forMarshaling->dstAccessMask, sizeof(VkAccessFlags));
     vkStream->write((VkImageLayout*)&forMarshaling->oldLayout, sizeof(VkImageLayout));
@@ -287,15 +367,21 @@
     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, (VkImageSubresourceRange*)(&forMarshaling->subresourceRange));
+    marshal_VkImageSubresourceRange(vkStream, rootType, (VkImageSubresourceRange*)(&forMarshaling->subresourceRange));
 }
 
 void unmarshal_VkImageMemoryBarrier(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageMemoryBarrier* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkAccessFlags*)&forUnmarshaling->srcAccessMask, sizeof(VkAccessFlags));
     vkStream->read((VkAccessFlags*)&forUnmarshaling->dstAccessMask, sizeof(VkAccessFlags));
     vkStream->read((VkImageLayout*)&forUnmarshaling->oldLayout, sizeof(VkImageLayout));
@@ -305,33 +391,47 @@
     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, (VkImageSubresourceRange*)(&forUnmarshaling->subresourceRange));
+    unmarshal_VkImageSubresourceRange(vkStream, rootType, (VkImageSubresourceRange*)(&forUnmarshaling->subresourceRange));
 }
 
 void marshal_VkMemoryBarrier(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryBarrier* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkAccessFlags*)&forMarshaling->srcAccessMask, sizeof(VkAccessFlags));
     vkStream->write((VkAccessFlags*)&forMarshaling->dstAccessMask, sizeof(VkAccessFlags));
 }
 
 void unmarshal_VkMemoryBarrier(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryBarrier* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkAccessFlags*)&forUnmarshaling->srcAccessMask, sizeof(VkAccessFlags));
     vkStream->read((VkAccessFlags*)&forUnmarshaling->dstAccessMask, sizeof(VkAccessFlags));
 }
 
 void marshal_VkAllocationCallbacks(
     VulkanStreamGuest* 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);
@@ -353,8 +453,10 @@
 
 void unmarshal_VkAllocationCallbacks(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAllocationCallbacks* forUnmarshaling)
 {
+    (void)rootType;
     // WARNING PTR CHECK
     void* check_pUserData;
     check_pUserData = (void*)(uintptr_t)vkStream->getBe64();
@@ -375,10 +477,16 @@
 
 void marshal_VkApplicationInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkApplicationInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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)
     {
         // WARNING PTR CHECK
@@ -414,10 +522,16 @@
 
 void unmarshal_VkApplicationInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkApplicationInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
     {
         // WARNING PTR CHECK
@@ -461,8 +575,10 @@
 
 void marshal_VkFormatProperties(
     VulkanStreamGuest* 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));
@@ -470,8 +586,10 @@
 
 void unmarshal_VkFormatProperties(
     VulkanStreamGuest* 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));
@@ -479,9 +597,11 @@
 
 void marshal_VkImageFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageFormatProperties* forMarshaling)
 {
-    marshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->maxExtent));
+    (void)rootType;
+    marshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->maxExtent));
     vkStream->write((uint32_t*)&forMarshaling->maxMipLevels, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxArrayLayers, sizeof(uint32_t));
     vkStream->write((VkSampleCountFlags*)&forMarshaling->sampleCounts, sizeof(VkSampleCountFlags));
@@ -490,9 +610,11 @@
 
 void unmarshal_VkImageFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageFormatProperties* forUnmarshaling)
 {
-    unmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forUnmarshaling->maxExtent));
+    (void)rootType;
+    unmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->maxExtent));
     vkStream->read((uint32_t*)&forUnmarshaling->maxMipLevels, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxArrayLayers, sizeof(uint32_t));
     vkStream->read((VkSampleCountFlags*)&forUnmarshaling->sampleCounts, sizeof(VkSampleCountFlags));
@@ -501,17 +623,23 @@
 
 void marshal_VkInstanceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkInstanceCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkInstanceCreateFlags*)&forMarshaling->flags, sizeof(VkInstanceCreateFlags));
     // 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, (const VkApplicationInfo*)(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);
@@ -521,10 +649,16 @@
 
 void unmarshal_VkInstanceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkInstanceCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkInstanceCreateFlags*)&forUnmarshaling->flags, sizeof(VkInstanceCreateFlags));
     // WARNING PTR CHECK
     const VkApplicationInfo* check_pApplicationInfo;
@@ -535,7 +669,7 @@
         {
             fprintf(stderr, "fatal: forUnmarshaling->pApplicationInfo inconsistent between guest and host\n");
         }
-        unmarshal_VkApplicationInfo(vkStream, (VkApplicationInfo*)(forUnmarshaling->pApplicationInfo));
+        unmarshal_VkApplicationInfo(vkStream, rootType, (VkApplicationInfo*)(forUnmarshaling->pApplicationInfo));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->enabledLayerCount, sizeof(uint32_t));
     vkStream->loadStringArrayInPlace((char***)&forUnmarshaling->ppEnabledLayerNames);
@@ -545,40 +679,50 @@
 
 void marshal_VkMemoryHeap(
     VulkanStreamGuest* 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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryHeap* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkDeviceSize*)&forUnmarshaling->size, sizeof(VkDeviceSize));
     vkStream->read((VkMemoryHeapFlags*)&forUnmarshaling->flags, sizeof(VkMemoryHeapFlags));
 }
 
 void marshal_VkMemoryType(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryType* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkMemoryPropertyFlags*)&forMarshaling->propertyFlags, sizeof(VkMemoryPropertyFlags));
     vkStream->write((uint32_t*)&forMarshaling->heapIndex, sizeof(uint32_t));
 }
 
 void unmarshal_VkMemoryType(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryType* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkMemoryPropertyFlags*)&forUnmarshaling->propertyFlags, sizeof(VkMemoryPropertyFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->heapIndex, sizeof(uint32_t));
 }
 
 void marshal_VkPhysicalDeviceFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFeatures* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkBool32*)&forMarshaling->robustBufferAccess, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->fullDrawIndexUint32, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->imageCubeArray, sizeof(VkBool32));
@@ -638,8 +782,10 @@
 
 void unmarshal_VkPhysicalDeviceFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceFeatures* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkBool32*)&forUnmarshaling->robustBufferAccess, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->fullDrawIndexUint32, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->imageCubeArray, sizeof(VkBool32));
@@ -699,8 +845,10 @@
 
 void marshal_VkPhysicalDeviceLimits(
     VulkanStreamGuest* 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));
     vkStream->write((uint32_t*)&forMarshaling->maxImageDimension3D, sizeof(uint32_t));
@@ -812,8 +960,10 @@
 
 void unmarshal_VkPhysicalDeviceLimits(
     VulkanStreamGuest* 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));
     vkStream->read((uint32_t*)&forUnmarshaling->maxImageDimension3D, sizeof(uint32_t));
@@ -924,40 +1074,46 @@
 
 void marshal_VkPhysicalDeviceMemoryProperties(
     VulkanStreamGuest* 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)
     {
-        marshal_VkMemoryType(vkStream, (VkMemoryType*)(forMarshaling->memoryTypes + 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)
     {
-        marshal_VkMemoryHeap(vkStream, (VkMemoryHeap*)(forMarshaling->memoryHeaps + i));
+        marshal_VkMemoryHeap(vkStream, rootType, (VkMemoryHeap*)(forMarshaling->memoryHeaps + i));
     }
 }
 
 void unmarshal_VkPhysicalDeviceMemoryProperties(
     VulkanStreamGuest* 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, (VkMemoryType*)(forUnmarshaling->memoryTypes + 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, (VkMemoryHeap*)(forUnmarshaling->memoryHeaps + i));
+        unmarshal_VkMemoryHeap(vkStream, rootType, (VkMemoryHeap*)(forUnmarshaling->memoryHeaps + i));
     }
 }
 
 void marshal_VkPhysicalDeviceSparseProperties(
     VulkanStreamGuest* 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->residencyStandard3DBlockShape, sizeof(VkBool32));
@@ -967,8 +1123,10 @@
 
 void unmarshal_VkPhysicalDeviceSparseProperties(
     VulkanStreamGuest* 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->residencyStandard3DBlockShape, sizeof(VkBool32));
@@ -978,8 +1136,10 @@
 
 void marshal_VkPhysicalDeviceProperties(
     VulkanStreamGuest* 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));
@@ -987,14 +1147,16 @@
     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, (VkPhysicalDeviceLimits*)(&forMarshaling->limits));
-    marshal_VkPhysicalDeviceSparseProperties(vkStream, (VkPhysicalDeviceSparseProperties*)(&forMarshaling->sparseProperties));
+    marshal_VkPhysicalDeviceLimits(vkStream, rootType, (VkPhysicalDeviceLimits*)(&forMarshaling->limits));
+    marshal_VkPhysicalDeviceSparseProperties(vkStream, rootType, (VkPhysicalDeviceSparseProperties*)(&forMarshaling->sparseProperties));
 }
 
 void unmarshal_VkPhysicalDeviceProperties(
     VulkanStreamGuest* 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));
@@ -1002,36 +1164,46 @@
     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, (VkPhysicalDeviceLimits*)(&forUnmarshaling->limits));
-    unmarshal_VkPhysicalDeviceSparseProperties(vkStream, (VkPhysicalDeviceSparseProperties*)(&forUnmarshaling->sparseProperties));
+    unmarshal_VkPhysicalDeviceLimits(vkStream, rootType, (VkPhysicalDeviceLimits*)(&forUnmarshaling->limits));
+    unmarshal_VkPhysicalDeviceSparseProperties(vkStream, rootType, (VkPhysicalDeviceSparseProperties*)(&forUnmarshaling->sparseProperties));
 }
 
 void marshal_VkQueueFamilyProperties(
     VulkanStreamGuest* 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, (VkExtent3D*)(&forMarshaling->minImageTransferGranularity));
+    marshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->minImageTransferGranularity));
 }
 
 void unmarshal_VkQueueFamilyProperties(
     VulkanStreamGuest* 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, (VkExtent3D*)(&forUnmarshaling->minImageTransferGranularity));
+    unmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->minImageTransferGranularity));
 }
 
 void marshal_VkDeviceQueueCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceQueueCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->queueFamilyIndex, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->queueCount, sizeof(uint32_t));
@@ -1040,10 +1212,16 @@
 
 void unmarshal_VkDeviceQueueCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceQueueCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     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));
@@ -1052,17 +1230,23 @@
 
 void marshal_VkDeviceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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, (const VkDeviceQueueCreateInfo*)(forMarshaling->pQueueCreateInfos + i));
+            marshal_VkDeviceQueueCreateInfo(vkStream, rootType, (const VkDeviceQueueCreateInfo*)(forMarshaling->pQueueCreateInfos + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->enabledLayerCount, sizeof(uint32_t));
@@ -1074,23 +1258,29 @@
     vkStream->putBe64(cgen_var_0);
     if (forMarshaling->pEnabledFeatures)
     {
-        marshal_VkPhysicalDeviceFeatures(vkStream, (const VkPhysicalDeviceFeatures*)(forMarshaling->pEnabledFeatures));
+        marshal_VkPhysicalDeviceFeatures(vkStream, rootType, (const VkPhysicalDeviceFeatures*)(forMarshaling->pEnabledFeatures));
     }
 }
 
 void unmarshal_VkDeviceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkDeviceCreateFlags*)&forUnmarshaling->flags, sizeof(VkDeviceCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->queueCreateInfoCount, sizeof(uint32_t));
     if (forUnmarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->queueCreateInfoCount; ++i)
         {
-            unmarshal_VkDeviceQueueCreateInfo(vkStream, (VkDeviceQueueCreateInfo*)(forUnmarshaling->pQueueCreateInfos + i));
+            unmarshal_VkDeviceQueueCreateInfo(vkStream, rootType, (VkDeviceQueueCreateInfo*)(forUnmarshaling->pQueueCreateInfos + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->enabledLayerCount, sizeof(uint32_t));
@@ -1106,30 +1296,36 @@
         {
             fprintf(stderr, "fatal: forUnmarshaling->pEnabledFeatures inconsistent between guest and host\n");
         }
-        unmarshal_VkPhysicalDeviceFeatures(vkStream, (VkPhysicalDeviceFeatures*)(forUnmarshaling->pEnabledFeatures));
+        unmarshal_VkPhysicalDeviceFeatures(vkStream, rootType, (VkPhysicalDeviceFeatures*)(forUnmarshaling->pEnabledFeatures));
     }
 }
 
 void marshal_VkExtensionProperties(
     VulkanStreamGuest* 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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExtensionProperties* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((char*)forUnmarshaling->extensionName, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char));
     vkStream->read((uint32_t*)&forUnmarshaling->specVersion, sizeof(uint32_t));
 }
 
 void marshal_VkLayerProperties(
     VulkanStreamGuest* 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));
     vkStream->write((uint32_t*)&forMarshaling->implementationVersion, sizeof(uint32_t));
@@ -1138,8 +1334,10 @@
 
 void unmarshal_VkLayerProperties(
     VulkanStreamGuest* 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));
     vkStream->read((uint32_t*)&forUnmarshaling->implementationVersion, sizeof(uint32_t));
@@ -1148,10 +1346,16 @@
 
 void marshal_VkSubmitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubmitInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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)
     {
@@ -1181,10 +1385,16 @@
 
 void unmarshal_VkSubmitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSubmitInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->waitSemaphoreCount, sizeof(uint32_t));
     if (forUnmarshaling->waitSemaphoreCount)
     {
@@ -1214,10 +1424,16 @@
 
 void marshal_VkMappedMemoryRange(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMappedMemoryRange* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -1227,10 +1443,16 @@
 
 void unmarshal_VkMappedMemoryRange(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMappedMemoryRange* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(&cgen_var_0, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
@@ -1240,28 +1462,42 @@
 
 void marshal_VkMemoryAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryAllocateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkDeviceSize*)&forMarshaling->allocationSize, sizeof(VkDeviceSize));
     vkStream->write((uint32_t*)&forMarshaling->memoryTypeIndex, sizeof(uint32_t));
 }
 
 void unmarshal_VkMemoryAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryAllocateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->allocationSize, sizeof(VkDeviceSize));
     vkStream->read((uint32_t*)&forUnmarshaling->memoryTypeIndex, sizeof(uint32_t));
 }
 
 void marshal_VkMemoryRequirements(
     VulkanStreamGuest* 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));
@@ -1269,8 +1505,10 @@
 
 void unmarshal_VkMemoryRequirements(
     VulkanStreamGuest* 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));
@@ -1278,8 +1516,10 @@
 
 void marshal_VkSparseMemoryBind(
     VulkanStreamGuest* 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;
@@ -1291,8 +1531,10 @@
 
 void unmarshal_VkSparseMemoryBind(
     VulkanStreamGuest* 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;
@@ -1304,8 +1546,10 @@
 
 void marshal_VkSparseBufferMemoryBindInfo(
     VulkanStreamGuest* 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);
@@ -1314,15 +1558,17 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->bindCount; ++i)
         {
-            marshal_VkSparseMemoryBind(vkStream, (const VkSparseMemoryBind*)(forMarshaling->pBinds + i));
+            marshal_VkSparseMemoryBind(vkStream, rootType, (const VkSparseMemoryBind*)(forMarshaling->pBinds + i));
         }
     }
 }
 
 void unmarshal_VkSparseBufferMemoryBindInfo(
     VulkanStreamGuest* 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);
@@ -1331,15 +1577,17 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bindCount; ++i)
         {
-            unmarshal_VkSparseMemoryBind(vkStream, (VkSparseMemoryBind*)(forUnmarshaling->pBinds + i));
+            unmarshal_VkSparseMemoryBind(vkStream, rootType, (VkSparseMemoryBind*)(forUnmarshaling->pBinds + i));
         }
     }
 }
 
 void marshal_VkSparseImageOpaqueMemoryBindInfo(
     VulkanStreamGuest* 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);
@@ -1348,15 +1596,17 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->bindCount; ++i)
         {
-            marshal_VkSparseMemoryBind(vkStream, (const VkSparseMemoryBind*)(forMarshaling->pBinds + i));
+            marshal_VkSparseMemoryBind(vkStream, rootType, (const VkSparseMemoryBind*)(forMarshaling->pBinds + i));
         }
     }
 }
 
 void unmarshal_VkSparseImageOpaqueMemoryBindInfo(
     VulkanStreamGuest* 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);
@@ -1365,15 +1615,17 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bindCount; ++i)
         {
-            unmarshal_VkSparseMemoryBind(vkStream, (VkSparseMemoryBind*)(forUnmarshaling->pBinds + i));
+            unmarshal_VkSparseMemoryBind(vkStream, rootType, (VkSparseMemoryBind*)(forUnmarshaling->pBinds + i));
         }
     }
 }
 
 void marshal_VkImageSubresource(
     VulkanStreamGuest* 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));
@@ -1381,8 +1633,10 @@
 
 void unmarshal_VkImageSubresource(
     VulkanStreamGuest* 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));
@@ -1390,11 +1644,13 @@
 
 void marshal_VkSparseImageMemoryBind(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseImageMemoryBind* forMarshaling)
 {
-    marshal_VkImageSubresource(vkStream, (VkImageSubresource*)(&forMarshaling->subresource));
-    marshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->offset));
-    marshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->extent));
+    (void)rootType;
+    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->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -1404,11 +1660,13 @@
 
 void unmarshal_VkSparseImageMemoryBind(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSparseImageMemoryBind* forUnmarshaling)
 {
-    unmarshal_VkImageSubresource(vkStream, (VkImageSubresource*)(&forUnmarshaling->subresource));
-    unmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forUnmarshaling->offset));
-    unmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forUnmarshaling->extent));
+    (void)rootType;
+    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);
@@ -1418,8 +1676,10 @@
 
 void marshal_VkSparseImageMemoryBindInfo(
     VulkanStreamGuest* 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);
@@ -1428,15 +1688,17 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->bindCount; ++i)
         {
-            marshal_VkSparseImageMemoryBind(vkStream, (const VkSparseImageMemoryBind*)(forMarshaling->pBinds + i));
+            marshal_VkSparseImageMemoryBind(vkStream, rootType, (const VkSparseImageMemoryBind*)(forMarshaling->pBinds + i));
         }
     }
 }
 
 void unmarshal_VkSparseImageMemoryBindInfo(
     VulkanStreamGuest* 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);
@@ -1445,17 +1707,23 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bindCount; ++i)
         {
-            unmarshal_VkSparseImageMemoryBind(vkStream, (VkSparseImageMemoryBind*)(forUnmarshaling->pBinds + i));
+            unmarshal_VkSparseImageMemoryBind(vkStream, rootType, (VkSparseImageMemoryBind*)(forUnmarshaling->pBinds + i));
         }
     }
 }
 
 void marshal_VkBindSparseInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindSparseInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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)
     {
@@ -1469,7 +1737,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->bufferBindCount; ++i)
         {
-            marshal_VkSparseBufferMemoryBindInfo(vkStream, (const VkSparseBufferMemoryBindInfo*)(forMarshaling->pBufferBinds + i));
+            marshal_VkSparseBufferMemoryBindInfo(vkStream, rootType, (const VkSparseBufferMemoryBindInfo*)(forMarshaling->pBufferBinds + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->imageOpaqueBindCount, sizeof(uint32_t));
@@ -1477,7 +1745,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->imageOpaqueBindCount; ++i)
         {
-            marshal_VkSparseImageOpaqueMemoryBindInfo(vkStream, (const VkSparseImageOpaqueMemoryBindInfo*)(forMarshaling->pImageOpaqueBinds + i));
+            marshal_VkSparseImageOpaqueMemoryBindInfo(vkStream, rootType, (const VkSparseImageOpaqueMemoryBindInfo*)(forMarshaling->pImageOpaqueBinds + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->imageBindCount, sizeof(uint32_t));
@@ -1485,7 +1753,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->imageBindCount; ++i)
         {
-            marshal_VkSparseImageMemoryBindInfo(vkStream, (const VkSparseImageMemoryBindInfo*)(forMarshaling->pImageBinds + i));
+            marshal_VkSparseImageMemoryBindInfo(vkStream, rootType, (const VkSparseImageMemoryBindInfo*)(forMarshaling->pImageBinds + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->signalSemaphoreCount, sizeof(uint32_t));
@@ -1500,10 +1768,16 @@
 
 void unmarshal_VkBindSparseInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBindSparseInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->waitSemaphoreCount, sizeof(uint32_t));
     if (forUnmarshaling->waitSemaphoreCount)
     {
@@ -1517,7 +1791,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bufferBindCount; ++i)
         {
-            unmarshal_VkSparseBufferMemoryBindInfo(vkStream, (VkSparseBufferMemoryBindInfo*)(forUnmarshaling->pBufferBinds + i));
+            unmarshal_VkSparseBufferMemoryBindInfo(vkStream, rootType, (VkSparseBufferMemoryBindInfo*)(forUnmarshaling->pBufferBinds + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->imageOpaqueBindCount, sizeof(uint32_t));
@@ -1525,7 +1799,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->imageOpaqueBindCount; ++i)
         {
-            unmarshal_VkSparseImageOpaqueMemoryBindInfo(vkStream, (VkSparseImageOpaqueMemoryBindInfo*)(forUnmarshaling->pImageOpaqueBinds + i));
+            unmarshal_VkSparseImageOpaqueMemoryBindInfo(vkStream, rootType, (VkSparseImageOpaqueMemoryBindInfo*)(forUnmarshaling->pImageOpaqueBinds + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->imageBindCount, sizeof(uint32_t));
@@ -1533,7 +1807,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->imageBindCount; ++i)
         {
-            unmarshal_VkSparseImageMemoryBindInfo(vkStream, (VkSparseImageMemoryBindInfo*)(forUnmarshaling->pImageBinds + i));
+            unmarshal_VkSparseImageMemoryBindInfo(vkStream, rootType, (VkSparseImageMemoryBindInfo*)(forUnmarshaling->pImageBinds + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->signalSemaphoreCount, sizeof(uint32_t));
@@ -1548,27 +1822,33 @@
 
 void marshal_VkSparseImageFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseImageFormatProperties* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkImageAspectFlags*)&forMarshaling->aspectMask, sizeof(VkImageAspectFlags));
-    marshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->imageGranularity));
+    marshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->imageGranularity));
     vkStream->write((VkSparseImageFormatFlags*)&forMarshaling->flags, sizeof(VkSparseImageFormatFlags));
 }
 
 void unmarshal_VkSparseImageFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSparseImageFormatProperties* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkImageAspectFlags*)&forUnmarshaling->aspectMask, sizeof(VkImageAspectFlags));
-    unmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forUnmarshaling->imageGranularity));
+    unmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->imageGranularity));
     vkStream->read((VkSparseImageFormatFlags*)&forUnmarshaling->flags, sizeof(VkSparseImageFormatFlags));
 }
 
 void marshal_VkSparseImageMemoryRequirements(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseImageMemoryRequirements* forMarshaling)
 {
-    marshal_VkSparseImageFormatProperties(vkStream, (VkSparseImageFormatProperties*)(&forMarshaling->formatProperties));
+    (void)rootType;
+    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));
@@ -1577,9 +1857,11 @@
 
 void unmarshal_VkSparseImageMemoryRequirements(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSparseImageMemoryRequirements* forUnmarshaling)
 {
-    unmarshal_VkSparseImageFormatProperties(vkStream, (VkSparseImageFormatProperties*)(&forUnmarshaling->formatProperties));
+    (void)rootType;
+    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));
@@ -1588,64 +1870,106 @@
 
 void marshal_VkFenceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFenceCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkFenceCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkFenceCreateFlags*)&forUnmarshaling->flags, sizeof(VkFenceCreateFlags));
 }
 
 void marshal_VkSemaphoreCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSemaphoreCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSemaphoreCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkSemaphoreCreateFlags*)&forUnmarshaling->flags, sizeof(VkSemaphoreCreateFlags));
 }
 
 void marshal_VkEventCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkEventCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkEventCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkEventCreateFlags*)&forUnmarshaling->flags, sizeof(VkEventCreateFlags));
 }
 
 void marshal_VkQueryPoolCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkQueryPoolCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -1654,10 +1978,16 @@
 
 void unmarshal_VkQueryPoolCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkQueryPoolCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkQueryPoolCreateFlags*)&forUnmarshaling->flags, sizeof(VkQueryPoolCreateFlags));
     vkStream->read((VkQueryType*)&forUnmarshaling->queryType, sizeof(VkQueryType));
     vkStream->read((uint32_t*)&forUnmarshaling->queryCount, sizeof(uint32_t));
@@ -1666,10 +1996,16 @@
 
 void marshal_VkBufferCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
     vkStream->write((VkBufferUsageFlags*)&forMarshaling->usage, sizeof(VkBufferUsageFlags));
@@ -1686,10 +2022,16 @@
 
 void unmarshal_VkBufferCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBufferCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBufferCreateFlags*)&forUnmarshaling->flags, sizeof(VkBufferCreateFlags));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->size, sizeof(VkDeviceSize));
     vkStream->read((VkBufferUsageFlags*)&forUnmarshaling->usage, sizeof(VkBufferUsageFlags));
@@ -1710,10 +2052,16 @@
 
 void marshal_VkBufferViewCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferViewCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBufferViewCreateFlags*)&forMarshaling->flags, sizeof(VkBufferViewCreateFlags));
     uint64_t cgen_var_0;
     vkStream->handleMapping()->mapHandles_VkBuffer_u64(&forMarshaling->buffer, &cgen_var_0, 1);
@@ -1725,10 +2073,16 @@
 
 void unmarshal_VkBufferViewCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBufferViewCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBufferViewCreateFlags*)&forUnmarshaling->flags, sizeof(VkBufferViewCreateFlags));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
@@ -1740,14 +2094,20 @@
 
 void marshal_VkImageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkImageCreateFlags*)&forMarshaling->flags, sizeof(VkImageCreateFlags));
     vkStream->write((VkImageType*)&forMarshaling->imageType, sizeof(VkImageType));
     vkStream->write((VkFormat*)&forMarshaling->format, sizeof(VkFormat));
-    marshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->extent));
+    marshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->extent));
     vkStream->write((uint32_t*)&forMarshaling->mipLevels, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->arrayLayers, sizeof(uint32_t));
     vkStream->write((VkSampleCountFlagBits*)&forMarshaling->samples, sizeof(VkSampleCountFlagBits));
@@ -1767,14 +2127,20 @@
 
 void unmarshal_VkImageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkImageCreateFlags*)&forUnmarshaling->flags, sizeof(VkImageCreateFlags));
     vkStream->read((VkImageType*)&forUnmarshaling->imageType, sizeof(VkImageType));
     vkStream->read((VkFormat*)&forUnmarshaling->format, sizeof(VkFormat));
-    unmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forUnmarshaling->extent));
+    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));
@@ -1798,8 +2164,10 @@
 
 void marshal_VkSubresourceLayout(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubresourceLayout* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkDeviceSize*)&forMarshaling->offset, sizeof(VkDeviceSize));
     vkStream->write((VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
     vkStream->write((VkDeviceSize*)&forMarshaling->rowPitch, sizeof(VkDeviceSize));
@@ -1809,8 +2177,10 @@
 
 void unmarshal_VkSubresourceLayout(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSubresourceLayout* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkDeviceSize*)&forUnmarshaling->offset, sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->size, sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->rowPitch, sizeof(VkDeviceSize));
@@ -1820,8 +2190,10 @@
 
 void marshal_VkComponentMapping(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkComponentMapping* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkComponentSwizzle*)&forMarshaling->r, sizeof(VkComponentSwizzle));
     vkStream->write((VkComponentSwizzle*)&forMarshaling->g, sizeof(VkComponentSwizzle));
     vkStream->write((VkComponentSwizzle*)&forMarshaling->b, sizeof(VkComponentSwizzle));
@@ -1830,8 +2202,10 @@
 
 void unmarshal_VkComponentMapping(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkComponentMapping* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkComponentSwizzle*)&forUnmarshaling->r, sizeof(VkComponentSwizzle));
     vkStream->read((VkComponentSwizzle*)&forUnmarshaling->g, sizeof(VkComponentSwizzle));
     vkStream->read((VkComponentSwizzle*)&forUnmarshaling->b, sizeof(VkComponentSwizzle));
@@ -1840,42 +2214,60 @@
 
 void marshal_VkImageViewCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageViewCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkImageViewCreateFlags*)&forMarshaling->flags, sizeof(VkImageViewCreateFlags));
     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((VkImageViewType*)&forMarshaling->viewType, sizeof(VkImageViewType));
     vkStream->write((VkFormat*)&forMarshaling->format, sizeof(VkFormat));
-    marshal_VkComponentMapping(vkStream, (VkComponentMapping*)(&forMarshaling->components));
-    marshal_VkImageSubresourceRange(vkStream, (VkImageSubresourceRange*)(&forMarshaling->subresourceRange));
+    marshal_VkComponentMapping(vkStream, rootType, (VkComponentMapping*)(&forMarshaling->components));
+    marshal_VkImageSubresourceRange(vkStream, rootType, (VkImageSubresourceRange*)(&forMarshaling->subresourceRange));
 }
 
 void unmarshal_VkImageViewCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageViewCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     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->read((VkImageViewType*)&forUnmarshaling->viewType, sizeof(VkImageViewType));
     vkStream->read((VkFormat*)&forUnmarshaling->format, sizeof(VkFormat));
-    unmarshal_VkComponentMapping(vkStream, (VkComponentMapping*)(&forUnmarshaling->components));
-    unmarshal_VkImageSubresourceRange(vkStream, (VkImageSubresourceRange*)(&forUnmarshaling->subresourceRange));
+    unmarshal_VkComponentMapping(vkStream, rootType, (VkComponentMapping*)(&forUnmarshaling->components));
+    unmarshal_VkImageSubresourceRange(vkStream, rootType, (VkImageSubresourceRange*)(&forUnmarshaling->subresourceRange));
 }
 
 void marshal_VkShaderModuleCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkShaderModuleCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkShaderModuleCreateFlags*)&forMarshaling->flags, sizeof(VkShaderModuleCreateFlags));
     uint64_t cgen_var_0 = (uint64_t)forMarshaling->codeSize;
     vkStream->putBe64(cgen_var_0);
@@ -1884,10 +2276,16 @@
 
 void unmarshal_VkShaderModuleCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkShaderModuleCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkShaderModuleCreateFlags*)&forUnmarshaling->flags, sizeof(VkShaderModuleCreateFlags));
     forUnmarshaling->codeSize = (size_t)vkStream->getBe64();
     vkStream->read((uint32_t*)forUnmarshaling->pCode, (forUnmarshaling->codeSize / 4) * sizeof(const uint32_t));
@@ -1895,10 +2293,16 @@
 
 void marshal_VkPipelineCacheCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCacheCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkPipelineCacheCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineCacheCreateFlags));
     uint64_t cgen_var_0 = (uint64_t)forMarshaling->initialDataSize;
     vkStream->putBe64(cgen_var_0);
@@ -1907,10 +2311,16 @@
 
 void unmarshal_VkPipelineCacheCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineCacheCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineCacheCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineCacheCreateFlags));
     forUnmarshaling->initialDataSize = (size_t)vkStream->getBe64();
     vkStream->read((void*)forUnmarshaling->pInitialData, forUnmarshaling->initialDataSize * sizeof(const uint8_t));
@@ -1918,8 +2328,10 @@
 
 void marshal_VkSpecializationMapEntry(
     VulkanStreamGuest* 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));
     uint64_t cgen_var_0 = (uint64_t)forMarshaling->size;
@@ -1928,8 +2340,10 @@
 
 void unmarshal_VkSpecializationMapEntry(
     VulkanStreamGuest* 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();
@@ -1937,14 +2351,16 @@
 
 void marshal_VkSpecializationInfo(
     VulkanStreamGuest* 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, (const VkSpecializationMapEntry*)(forMarshaling->pMapEntries + i));
+            marshal_VkSpecializationMapEntry(vkStream, rootType, (const VkSpecializationMapEntry*)(forMarshaling->pMapEntries + i));
         }
     }
     uint64_t cgen_var_0 = (uint64_t)forMarshaling->dataSize;
@@ -1954,14 +2370,16 @@
 
 void unmarshal_VkSpecializationInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSpecializationInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->mapEntryCount, sizeof(uint32_t));
     if (forUnmarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->mapEntryCount; ++i)
         {
-            unmarshal_VkSpecializationMapEntry(vkStream, (VkSpecializationMapEntry*)(forUnmarshaling->pMapEntries + i));
+            unmarshal_VkSpecializationMapEntry(vkStream, rootType, (VkSpecializationMapEntry*)(forUnmarshaling->pMapEntries + i));
         }
     }
     forUnmarshaling->dataSize = (size_t)vkStream->getBe64();
@@ -1970,10 +2388,16 @@
 
 void marshal_VkPipelineShaderStageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineShaderStageCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((VkShaderStageFlagBits*)&forMarshaling->stage, sizeof(VkShaderStageFlagBits));
     uint64_t cgen_var_0;
@@ -1985,16 +2409,22 @@
     vkStream->putBe64(cgen_var_1);
     if (forMarshaling->pSpecializationInfo)
     {
-        marshal_VkSpecializationInfo(vkStream, (const VkSpecializationInfo*)(forMarshaling->pSpecializationInfo));
+        marshal_VkSpecializationInfo(vkStream, rootType, (const VkSpecializationInfo*)(forMarshaling->pSpecializationInfo));
     }
 }
 
 void unmarshal_VkPipelineShaderStageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineShaderStageCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineShaderStageCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineShaderStageCreateFlags));
     vkStream->read((VkShaderStageFlagBits*)&forUnmarshaling->stage, sizeof(VkShaderStageFlagBits));
     uint64_t cgen_var_0;
@@ -2010,18 +2440,24 @@
         {
             fprintf(stderr, "fatal: forUnmarshaling->pSpecializationInfo inconsistent between guest and host\n");
         }
-        unmarshal_VkSpecializationInfo(vkStream, (VkSpecializationInfo*)(forUnmarshaling->pSpecializationInfo));
+        unmarshal_VkSpecializationInfo(vkStream, rootType, (VkSpecializationInfo*)(forUnmarshaling->pSpecializationInfo));
     }
 }
 
 void marshal_VkComputePipelineCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkComputePipelineCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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, (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->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -2033,12 +2469,18 @@
 
 void unmarshal_VkComputePipelineCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkComputePipelineCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineCreateFlags));
-    unmarshal_VkPipelineShaderStageCreateInfo(vkStream, (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);
@@ -2050,8 +2492,10 @@
 
 void marshal_VkVertexInputBindingDescription(
     VulkanStreamGuest* 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));
@@ -2059,8 +2503,10 @@
 
 void unmarshal_VkVertexInputBindingDescription(
     VulkanStreamGuest* 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));
     vkStream->read((VkVertexInputRate*)&forUnmarshaling->inputRate, sizeof(VkVertexInputRate));
@@ -2068,8 +2514,10 @@
 
 void marshal_VkVertexInputAttributeDescription(
     VulkanStreamGuest* 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));
     vkStream->write((VkFormat*)&forMarshaling->format, sizeof(VkFormat));
@@ -2078,8 +2526,10 @@
 
 void unmarshal_VkVertexInputAttributeDescription(
     VulkanStreamGuest* 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));
     vkStream->read((VkFormat*)&forUnmarshaling->format, sizeof(VkFormat));
@@ -2088,17 +2538,23 @@
 
 void marshal_VkPipelineVertexInputStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineVertexInputStateCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->vertexBindingDescriptionCount, sizeof(uint32_t));
     if (forMarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->vertexBindingDescriptionCount; ++i)
         {
-            marshal_VkVertexInputBindingDescription(vkStream, (const VkVertexInputBindingDescription*)(forMarshaling->pVertexBindingDescriptions + i));
+            marshal_VkVertexInputBindingDescription(vkStream, rootType, (const VkVertexInputBindingDescription*)(forMarshaling->pVertexBindingDescriptions + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->vertexAttributeDescriptionCount, sizeof(uint32_t));
@@ -2106,24 +2562,30 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->vertexAttributeDescriptionCount; ++i)
         {
-            marshal_VkVertexInputAttributeDescription(vkStream, (const VkVertexInputAttributeDescription*)(forMarshaling->pVertexAttributeDescriptions + i));
+            marshal_VkVertexInputAttributeDescription(vkStream, rootType, (const VkVertexInputAttributeDescription*)(forMarshaling->pVertexAttributeDescriptions + i));
         }
     }
 }
 
 void unmarshal_VkPipelineVertexInputStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineVertexInputStateCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineVertexInputStateCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineVertexInputStateCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->vertexBindingDescriptionCount, sizeof(uint32_t));
     if (forUnmarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->vertexBindingDescriptionCount; ++i)
         {
-            unmarshal_VkVertexInputBindingDescription(vkStream, (VkVertexInputBindingDescription*)(forUnmarshaling->pVertexBindingDescriptions + i));
+            unmarshal_VkVertexInputBindingDescription(vkStream, rootType, (VkVertexInputBindingDescription*)(forUnmarshaling->pVertexBindingDescriptions + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->vertexAttributeDescriptionCount, sizeof(uint32_t));
@@ -2131,17 +2593,23 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->vertexAttributeDescriptionCount; ++i)
         {
-            unmarshal_VkVertexInputAttributeDescription(vkStream, (VkVertexInputAttributeDescription*)(forUnmarshaling->pVertexAttributeDescriptions + i));
+            unmarshal_VkVertexInputAttributeDescription(vkStream, rootType, (VkVertexInputAttributeDescription*)(forUnmarshaling->pVertexAttributeDescriptions + i));
         }
     }
 }
 
 void marshal_VkPipelineInputAssemblyStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineInputAssemblyStateCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((VkPrimitiveTopology*)&forMarshaling->topology, sizeof(VkPrimitiveTopology));
     vkStream->write((VkBool32*)&forMarshaling->primitiveRestartEnable, sizeof(VkBool32));
@@ -2149,10 +2617,16 @@
 
 void unmarshal_VkPipelineInputAssemblyStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineInputAssemblyStateCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineInputAssemblyStateCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineInputAssemblyStateCreateFlags));
     vkStream->read((VkPrimitiveTopology*)&forUnmarshaling->topology, sizeof(VkPrimitiveTopology));
     vkStream->read((VkBool32*)&forUnmarshaling->primitiveRestartEnable, sizeof(VkBool32));
@@ -2160,28 +2634,42 @@
 
 void marshal_VkPipelineTessellationStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineTessellationStateCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->patchControlPoints, sizeof(uint32_t));
 }
 
 void unmarshal_VkPipelineTessellationStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineTessellationStateCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineTessellationStateCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineTessellationStateCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->patchControlPoints, sizeof(uint32_t));
 }
 
 void marshal_VkViewport(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkViewport* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((float*)&forMarshaling->x, sizeof(float));
     vkStream->write((float*)&forMarshaling->y, sizeof(float));
     vkStream->write((float*)&forMarshaling->width, sizeof(float));
@@ -2192,8 +2680,10 @@
 
 void unmarshal_VkViewport(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkViewport* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((float*)&forUnmarshaling->x, sizeof(float));
     vkStream->read((float*)&forUnmarshaling->y, sizeof(float));
     vkStream->read((float*)&forUnmarshaling->width, sizeof(float));
@@ -2204,10 +2694,16 @@
 
 void marshal_VkPipelineViewportStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineViewportStateCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->viewportCount, sizeof(uint32_t));
     // WARNING PTR CHECK
@@ -2219,7 +2715,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forMarshaling->viewportCount; ++i)
             {
-                marshal_VkViewport(vkStream, (const VkViewport*)(forMarshaling->pViewports + i));
+                marshal_VkViewport(vkStream, rootType, (const VkViewport*)(forMarshaling->pViewports + i));
             }
         }
     }
@@ -2233,7 +2729,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forMarshaling->scissorCount; ++i)
             {
-                marshal_VkRect2D(vkStream, (const VkRect2D*)(forMarshaling->pScissors + i));
+                marshal_VkRect2D(vkStream, rootType, (const VkRect2D*)(forMarshaling->pScissors + i));
             }
         }
     }
@@ -2241,10 +2737,16 @@
 
 void unmarshal_VkPipelineViewportStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineViewportStateCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineViewportStateCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineViewportStateCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->viewportCount, sizeof(uint32_t));
     // WARNING PTR CHECK
@@ -2260,7 +2762,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->viewportCount; ++i)
             {
-                unmarshal_VkViewport(vkStream, (VkViewport*)(forUnmarshaling->pViewports + i));
+                unmarshal_VkViewport(vkStream, rootType, (VkViewport*)(forUnmarshaling->pViewports + i));
             }
         }
     }
@@ -2278,7 +2780,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->scissorCount; ++i)
             {
-                unmarshal_VkRect2D(vkStream, (VkRect2D*)(forUnmarshaling->pScissors + i));
+                unmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(forUnmarshaling->pScissors + i));
             }
         }
     }
@@ -2286,10 +2788,16 @@
 
 void marshal_VkPipelineRasterizationStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRasterizationStateCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((VkBool32*)&forMarshaling->depthClampEnable, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->rasterizerDiscardEnable, sizeof(VkBool32));
@@ -2305,10 +2813,16 @@
 
 void unmarshal_VkPipelineRasterizationStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineRasterizationStateCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineRasterizationStateCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineRasterizationStateCreateFlags));
     vkStream->read((VkBool32*)&forUnmarshaling->depthClampEnable, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->rasterizerDiscardEnable, sizeof(VkBool32));
@@ -2324,10 +2838,16 @@
 
 void marshal_VkPipelineMultisampleStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineMultisampleStateCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((VkBool32*)&forMarshaling->sampleShadingEnable, sizeof(VkBool32));
@@ -2345,10 +2865,16 @@
 
 void unmarshal_VkPipelineMultisampleStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineMultisampleStateCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineMultisampleStateCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineMultisampleStateCreateFlags));
     vkStream->read((VkSampleCountFlagBits*)&forUnmarshaling->rasterizationSamples, sizeof(VkSampleCountFlagBits));
     vkStream->read((VkBool32*)&forUnmarshaling->sampleShadingEnable, sizeof(VkBool32));
@@ -2370,8 +2896,10 @@
 
 void marshal_VkStencilOpState(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkStencilOpState* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStencilOp*)&forMarshaling->failOp, sizeof(VkStencilOp));
     vkStream->write((VkStencilOp*)&forMarshaling->passOp, sizeof(VkStencilOp));
     vkStream->write((VkStencilOp*)&forMarshaling->depthFailOp, sizeof(VkStencilOp));
@@ -2383,8 +2911,10 @@
 
 void unmarshal_VkStencilOpState(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkStencilOpState* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStencilOp*)&forUnmarshaling->failOp, sizeof(VkStencilOp));
     vkStream->read((VkStencilOp*)&forUnmarshaling->passOp, sizeof(VkStencilOp));
     vkStream->read((VkStencilOp*)&forUnmarshaling->depthFailOp, sizeof(VkStencilOp));
@@ -2396,44 +2926,58 @@
 
 void marshal_VkPipelineDepthStencilStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineDepthStencilStateCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((VkBool32*)&forMarshaling->depthTestEnable, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->depthWriteEnable, sizeof(VkBool32));
     vkStream->write((VkCompareOp*)&forMarshaling->depthCompareOp, sizeof(VkCompareOp));
     vkStream->write((VkBool32*)&forMarshaling->depthBoundsTestEnable, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->stencilTestEnable, sizeof(VkBool32));
-    marshal_VkStencilOpState(vkStream, (VkStencilOpState*)(&forMarshaling->front));
-    marshal_VkStencilOpState(vkStream, (VkStencilOpState*)(&forMarshaling->back));
+    marshal_VkStencilOpState(vkStream, rootType, (VkStencilOpState*)(&forMarshaling->front));
+    marshal_VkStencilOpState(vkStream, rootType, (VkStencilOpState*)(&forMarshaling->back));
     vkStream->write((float*)&forMarshaling->minDepthBounds, sizeof(float));
     vkStream->write((float*)&forMarshaling->maxDepthBounds, sizeof(float));
 }
 
 void unmarshal_VkPipelineDepthStencilStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineDepthStencilStateCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     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));
     vkStream->read((VkBool32*)&forUnmarshaling->depthBoundsTestEnable, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->stencilTestEnable, sizeof(VkBool32));
-    unmarshal_VkStencilOpState(vkStream, (VkStencilOpState*)(&forUnmarshaling->front));
-    unmarshal_VkStencilOpState(vkStream, (VkStencilOpState*)(&forUnmarshaling->back));
+    unmarshal_VkStencilOpState(vkStream, rootType, (VkStencilOpState*)(&forUnmarshaling->front));
+    unmarshal_VkStencilOpState(vkStream, rootType, (VkStencilOpState*)(&forUnmarshaling->back));
     vkStream->read((float*)&forUnmarshaling->minDepthBounds, sizeof(float));
     vkStream->read((float*)&forUnmarshaling->maxDepthBounds, sizeof(float));
 }
 
 void marshal_VkPipelineColorBlendAttachmentState(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineColorBlendAttachmentState* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkBool32*)&forMarshaling->blendEnable, sizeof(VkBool32));
     vkStream->write((VkBlendFactor*)&forMarshaling->srcColorBlendFactor, sizeof(VkBlendFactor));
     vkStream->write((VkBlendFactor*)&forMarshaling->dstColorBlendFactor, sizeof(VkBlendFactor));
@@ -2446,8 +2990,10 @@
 
 void unmarshal_VkPipelineColorBlendAttachmentState(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineColorBlendAttachmentState* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkBool32*)&forUnmarshaling->blendEnable, sizeof(VkBool32));
     vkStream->read((VkBlendFactor*)&forUnmarshaling->srcColorBlendFactor, sizeof(VkBlendFactor));
     vkStream->read((VkBlendFactor*)&forUnmarshaling->dstColorBlendFactor, sizeof(VkBlendFactor));
@@ -2460,10 +3006,16 @@
 
 void marshal_VkPipelineColorBlendStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineColorBlendStateCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((VkBool32*)&forMarshaling->logicOpEnable, sizeof(VkBool32));
     vkStream->write((VkLogicOp*)&forMarshaling->logicOp, sizeof(VkLogicOp));
@@ -2472,7 +3024,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->attachmentCount; ++i)
         {
-            marshal_VkPipelineColorBlendAttachmentState(vkStream, (const VkPipelineColorBlendAttachmentState*)(forMarshaling->pAttachments + i));
+            marshal_VkPipelineColorBlendAttachmentState(vkStream, rootType, (const VkPipelineColorBlendAttachmentState*)(forMarshaling->pAttachments + i));
         }
     }
     vkStream->write((float*)forMarshaling->blendConstants, 4 * sizeof(float));
@@ -2480,10 +3032,16 @@
 
 void unmarshal_VkPipelineColorBlendStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineColorBlendStateCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineColorBlendStateCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineColorBlendStateCreateFlags));
     vkStream->read((VkBool32*)&forUnmarshaling->logicOpEnable, sizeof(VkBool32));
     vkStream->read((VkLogicOp*)&forUnmarshaling->logicOp, sizeof(VkLogicOp));
@@ -2492,7 +3050,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->attachmentCount; ++i)
         {
-            unmarshal_VkPipelineColorBlendAttachmentState(vkStream, (VkPipelineColorBlendAttachmentState*)(forUnmarshaling->pAttachments + i));
+            unmarshal_VkPipelineColorBlendAttachmentState(vkStream, rootType, (VkPipelineColorBlendAttachmentState*)(forUnmarshaling->pAttachments + i));
         }
     }
     vkStream->read((float*)forUnmarshaling->blendConstants, 4 * sizeof(float));
@@ -2500,10 +3058,16 @@
 
 void marshal_VkPipelineDynamicStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineDynamicStateCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->dynamicStateCount, sizeof(uint32_t));
     vkStream->write((const VkDynamicState*)forMarshaling->pDynamicStates, forMarshaling->dynamicStateCount * sizeof(const VkDynamicState));
@@ -2511,10 +3075,16 @@
 
 void unmarshal_VkPipelineDynamicStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineDynamicStateCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineDynamicStateCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineDynamicStateCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->dynamicStateCount, sizeof(uint32_t));
     vkStream->read((VkDynamicState*)forUnmarshaling->pDynamicStates, forUnmarshaling->dynamicStateCount * sizeof(const VkDynamicState));
@@ -2522,8 +3092,10 @@
 
 void marshal_VkGraphicsPipelineCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGraphicsPipelineCreateInfo* forMarshaling)
 {
+    (void)rootType;
     uint32_t hasRasterization = 1;
     if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
     {
@@ -2539,14 +3111,18 @@
         vkStream->putBe32(cgen_var_0);
     }
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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, (const VkPipelineShaderStageCreateInfo*)(forMarshaling->pStages + i));
+            marshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (const VkPipelineShaderStageCreateInfo*)(forMarshaling->pStages + i));
         }
     }
     // WARNING PTR CHECK
@@ -2557,7 +3133,7 @@
     }
     if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || forMarshaling->pVertexInputState))
     {
-        marshal_VkPipelineVertexInputStateCreateInfo(vkStream, (const VkPipelineVertexInputStateCreateInfo*)(forMarshaling->pVertexInputState));
+        marshal_VkPipelineVertexInputStateCreateInfo(vkStream, rootType, (const VkPipelineVertexInputStateCreateInfo*)(forMarshaling->pVertexInputState));
     }
     // WARNING PTR CHECK
     if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
@@ -2567,7 +3143,7 @@
     }
     if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || forMarshaling->pInputAssemblyState))
     {
-        marshal_VkPipelineInputAssemblyStateCreateInfo(vkStream, (const VkPipelineInputAssemblyStateCreateInfo*)(forMarshaling->pInputAssemblyState));
+        marshal_VkPipelineInputAssemblyStateCreateInfo(vkStream, rootType, (const VkPipelineInputAssemblyStateCreateInfo*)(forMarshaling->pInputAssemblyState));
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pTessellationState;
@@ -2576,7 +3152,7 @@
     {
         if (hasTessellation)
         {
-            marshal_VkPipelineTessellationStateCreateInfo(vkStream, (const VkPipelineTessellationStateCreateInfo*)(forMarshaling->pTessellationState));
+            marshal_VkPipelineTessellationStateCreateInfo(vkStream, rootType, (const VkPipelineTessellationStateCreateInfo*)(forMarshaling->pTessellationState));
         }
     }
     // WARNING PTR CHECK
@@ -2586,7 +3162,7 @@
     {
         if (hasRasterization)
         {
-            marshal_VkPipelineViewportStateCreateInfo(vkStream, (const VkPipelineViewportStateCreateInfo*)(forMarshaling->pViewportState));
+            marshal_VkPipelineViewportStateCreateInfo(vkStream, rootType, (const VkPipelineViewportStateCreateInfo*)(forMarshaling->pViewportState));
         }
     }
     // WARNING PTR CHECK
@@ -2597,7 +3173,7 @@
     }
     if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || forMarshaling->pRasterizationState))
     {
-        marshal_VkPipelineRasterizationStateCreateInfo(vkStream, (const VkPipelineRasterizationStateCreateInfo*)(forMarshaling->pRasterizationState));
+        marshal_VkPipelineRasterizationStateCreateInfo(vkStream, rootType, (const VkPipelineRasterizationStateCreateInfo*)(forMarshaling->pRasterizationState));
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)forMarshaling->pMultisampleState;
@@ -2606,7 +3182,7 @@
     {
         if (hasRasterization)
         {
-            marshal_VkPipelineMultisampleStateCreateInfo(vkStream, (const VkPipelineMultisampleStateCreateInfo*)(forMarshaling->pMultisampleState));
+            marshal_VkPipelineMultisampleStateCreateInfo(vkStream, rootType, (const VkPipelineMultisampleStateCreateInfo*)(forMarshaling->pMultisampleState));
         }
     }
     // WARNING PTR CHECK
@@ -2616,7 +3192,7 @@
     {
         if (hasRasterization)
         {
-            marshal_VkPipelineDepthStencilStateCreateInfo(vkStream, (const VkPipelineDepthStencilStateCreateInfo*)(forMarshaling->pDepthStencilState));
+            marshal_VkPipelineDepthStencilStateCreateInfo(vkStream, rootType, (const VkPipelineDepthStencilStateCreateInfo*)(forMarshaling->pDepthStencilState));
         }
     }
     // WARNING PTR CHECK
@@ -2626,7 +3202,7 @@
     {
         if (hasRasterization)
         {
-            marshal_VkPipelineColorBlendStateCreateInfo(vkStream, (const VkPipelineColorBlendStateCreateInfo*)(forMarshaling->pColorBlendState));
+            marshal_VkPipelineColorBlendStateCreateInfo(vkStream, rootType, (const VkPipelineColorBlendStateCreateInfo*)(forMarshaling->pColorBlendState));
         }
     }
     // WARNING PTR CHECK
@@ -2634,7 +3210,7 @@
     vkStream->putBe64(cgen_var_5);
     if (forMarshaling->pDynamicState)
     {
-        marshal_VkPipelineDynamicStateCreateInfo(vkStream, (const VkPipelineDynamicStateCreateInfo*)(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);
@@ -2651,8 +3227,10 @@
 
 void unmarshal_VkGraphicsPipelineCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkGraphicsPipelineCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     uint32_t hasRasterization = 1;
     if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
     {
@@ -2664,14 +3242,18 @@
         hasTessellation = (const uint32_t)vkStream->getBe32();
     }
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->stageCount, sizeof(uint32_t));
     if (forUnmarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->stageCount; ++i)
         {
-            unmarshal_VkPipelineShaderStageCreateInfo(vkStream, (VkPipelineShaderStageCreateInfo*)(forUnmarshaling->pStages + i));
+            unmarshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (VkPipelineShaderStageCreateInfo*)(forUnmarshaling->pStages + i));
         }
     }
     // WARNING PTR CHECK
@@ -2682,7 +3264,7 @@
     }
     if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || forUnmarshaling->pVertexInputState))
     {
-        unmarshal_VkPipelineVertexInputStateCreateInfo(vkStream, (VkPipelineVertexInputStateCreateInfo*)(forUnmarshaling->pVertexInputState));
+        unmarshal_VkPipelineVertexInputStateCreateInfo(vkStream, rootType, (VkPipelineVertexInputStateCreateInfo*)(forUnmarshaling->pVertexInputState));
     }
     // WARNING PTR CHECK
     const VkPipelineInputAssemblyStateCreateInfo* check_pInputAssemblyState;
@@ -2692,7 +3274,7 @@
     }
     if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || forUnmarshaling->pInputAssemblyState))
     {
-        unmarshal_VkPipelineInputAssemblyStateCreateInfo(vkStream, (VkPipelineInputAssemblyStateCreateInfo*)(forUnmarshaling->pInputAssemblyState));
+        unmarshal_VkPipelineInputAssemblyStateCreateInfo(vkStream, rootType, (VkPipelineInputAssemblyStateCreateInfo*)(forUnmarshaling->pInputAssemblyState));
     }
     // WARNING PTR CHECK
     const VkPipelineTessellationStateCreateInfo* check_pTessellationState;
@@ -2705,7 +3287,7 @@
         }
         if (hasTessellation)
         {
-            unmarshal_VkPipelineTessellationStateCreateInfo(vkStream, (VkPipelineTessellationStateCreateInfo*)(forUnmarshaling->pTessellationState));
+            unmarshal_VkPipelineTessellationStateCreateInfo(vkStream, rootType, (VkPipelineTessellationStateCreateInfo*)(forUnmarshaling->pTessellationState));
         }
         else
         {
@@ -2723,7 +3305,7 @@
         }
         if (hasRasterization)
         {
-            unmarshal_VkPipelineViewportStateCreateInfo(vkStream, (VkPipelineViewportStateCreateInfo*)(forUnmarshaling->pViewportState));
+            unmarshal_VkPipelineViewportStateCreateInfo(vkStream, rootType, (VkPipelineViewportStateCreateInfo*)(forUnmarshaling->pViewportState));
         }
         else
         {
@@ -2738,7 +3320,7 @@
     }
     if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || forUnmarshaling->pRasterizationState))
     {
-        unmarshal_VkPipelineRasterizationStateCreateInfo(vkStream, (VkPipelineRasterizationStateCreateInfo*)(forUnmarshaling->pRasterizationState));
+        unmarshal_VkPipelineRasterizationStateCreateInfo(vkStream, rootType, (VkPipelineRasterizationStateCreateInfo*)(forUnmarshaling->pRasterizationState));
     }
     // WARNING PTR CHECK
     const VkPipelineMultisampleStateCreateInfo* check_pMultisampleState;
@@ -2751,7 +3333,7 @@
         }
         if (hasRasterization)
         {
-            unmarshal_VkPipelineMultisampleStateCreateInfo(vkStream, (VkPipelineMultisampleStateCreateInfo*)(forUnmarshaling->pMultisampleState));
+            unmarshal_VkPipelineMultisampleStateCreateInfo(vkStream, rootType, (VkPipelineMultisampleStateCreateInfo*)(forUnmarshaling->pMultisampleState));
         }
         else
         {
@@ -2769,7 +3351,7 @@
         }
         if (hasRasterization)
         {
-            unmarshal_VkPipelineDepthStencilStateCreateInfo(vkStream, (VkPipelineDepthStencilStateCreateInfo*)(forUnmarshaling->pDepthStencilState));
+            unmarshal_VkPipelineDepthStencilStateCreateInfo(vkStream, rootType, (VkPipelineDepthStencilStateCreateInfo*)(forUnmarshaling->pDepthStencilState));
         }
         else
         {
@@ -2787,7 +3369,7 @@
         }
         if (hasRasterization)
         {
-            unmarshal_VkPipelineColorBlendStateCreateInfo(vkStream, (VkPipelineColorBlendStateCreateInfo*)(forUnmarshaling->pColorBlendState));
+            unmarshal_VkPipelineColorBlendStateCreateInfo(vkStream, rootType, (VkPipelineColorBlendStateCreateInfo*)(forUnmarshaling->pColorBlendState));
         }
         else
         {
@@ -2803,7 +3385,7 @@
         {
             fprintf(stderr, "fatal: forUnmarshaling->pDynamicState inconsistent between guest and host\n");
         }
-        unmarshal_VkPipelineDynamicStateCreateInfo(vkStream, (VkPipelineDynamicStateCreateInfo*)(forUnmarshaling->pDynamicState));
+        unmarshal_VkPipelineDynamicStateCreateInfo(vkStream, rootType, (VkPipelineDynamicStateCreateInfo*)(forUnmarshaling->pDynamicState));
     }
     uint64_t cgen_var_6;
     vkStream->read((uint64_t*)&cgen_var_6, 1 * 8);
@@ -2820,8 +3402,10 @@
 
 void marshal_VkPushConstantRange(
     VulkanStreamGuest* 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));
@@ -2829,8 +3413,10 @@
 
 void unmarshal_VkPushConstantRange(
     VulkanStreamGuest* 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));
@@ -2838,10 +3424,16 @@
 
 void marshal_VkPipelineLayoutCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineLayoutCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->setLayoutCount, sizeof(uint32_t));
     if (forMarshaling->setLayoutCount)
@@ -2856,17 +3448,23 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->pushConstantRangeCount; ++i)
         {
-            marshal_VkPushConstantRange(vkStream, (const VkPushConstantRange*)(forMarshaling->pPushConstantRanges + i));
+            marshal_VkPushConstantRange(vkStream, rootType, (const VkPushConstantRange*)(forMarshaling->pPushConstantRanges + i));
         }
     }
 }
 
 void unmarshal_VkPipelineLayoutCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineLayoutCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineLayoutCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineLayoutCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->setLayoutCount, sizeof(uint32_t));
     if (forUnmarshaling->setLayoutCount)
@@ -2881,17 +3479,23 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->pushConstantRangeCount; ++i)
         {
-            unmarshal_VkPushConstantRange(vkStream, (VkPushConstantRange*)(forUnmarshaling->pPushConstantRanges + i));
+            unmarshal_VkPushConstantRange(vkStream, rootType, (VkPushConstantRange*)(forUnmarshaling->pPushConstantRanges + i));
         }
     }
 }
 
 void marshal_VkSamplerCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSamplerCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkSamplerCreateFlags*)&forMarshaling->flags, sizeof(VkSamplerCreateFlags));
     vkStream->write((VkFilter*)&forMarshaling->magFilter, sizeof(VkFilter));
     vkStream->write((VkFilter*)&forMarshaling->minFilter, sizeof(VkFilter));
@@ -2912,10 +3516,16 @@
 
 void unmarshal_VkSamplerCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSamplerCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkSamplerCreateFlags*)&forUnmarshaling->flags, sizeof(VkSamplerCreateFlags));
     vkStream->read((VkFilter*)&forUnmarshaling->magFilter, sizeof(VkFilter));
     vkStream->read((VkFilter*)&forUnmarshaling->minFilter, sizeof(VkFilter));
@@ -2936,10 +3546,16 @@
 
 void marshal_VkCopyDescriptorSet(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyDescriptorSet* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -2955,10 +3571,16 @@
 
 void unmarshal_VkCopyDescriptorSet(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCopyDescriptorSet* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkDescriptorSet(&cgen_var_0, (VkDescriptorSet*)&forUnmarshaling->srcSet, 1);
@@ -2974,8 +3596,10 @@
 
 void marshal_VkDescriptorBufferInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorBufferInfo* 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);
@@ -2985,8 +3609,10 @@
 
 void unmarshal_VkDescriptorBufferInfo(
     VulkanStreamGuest* 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);
@@ -2996,8 +3622,10 @@
 
 void marshal_VkDescriptorImageInfo(
     VulkanStreamGuest* 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);
@@ -3009,8 +3637,10 @@
 
 void unmarshal_VkDescriptorImageInfo(
     VulkanStreamGuest* 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);
@@ -3022,26 +3652,36 @@
 
 void marshal_VkDescriptorPoolSize(
     VulkanStreamGuest* 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(
     VulkanStreamGuest* 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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorPoolCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->maxSets, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->poolSizeCount, sizeof(uint32_t));
@@ -3049,17 +3689,23 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->poolSizeCount; ++i)
         {
-            marshal_VkDescriptorPoolSize(vkStream, (const VkDescriptorPoolSize*)(forMarshaling->pPoolSizes + i));
+            marshal_VkDescriptorPoolSize(vkStream, rootType, (const VkDescriptorPoolSize*)(forMarshaling->pPoolSizes + i));
         }
     }
 }
 
 void unmarshal_VkDescriptorPoolCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDescriptorPoolCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     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));
@@ -3067,17 +3713,23 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->poolSizeCount; ++i)
         {
-            unmarshal_VkDescriptorPoolSize(vkStream, (VkDescriptorPoolSize*)(forUnmarshaling->pPoolSizes + i));
+            unmarshal_VkDescriptorPoolSize(vkStream, rootType, (VkDescriptorPoolSize*)(forUnmarshaling->pPoolSizes + i));
         }
     }
 }
 
 void marshal_VkDescriptorSetAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetAllocateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -3093,10 +3745,16 @@
 
 void unmarshal_VkDescriptorSetAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDescriptorSetAllocateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkDescriptorPool(&cgen_var_0, (VkDescriptorPool*)&forUnmarshaling->descriptorPool, 1);
@@ -3112,8 +3770,10 @@
 
 void marshal_VkDescriptorSetLayoutBinding(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutBinding* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->binding, sizeof(uint32_t));
     vkStream->write((VkDescriptorType*)&forMarshaling->descriptorType, sizeof(VkDescriptorType));
     vkStream->write((uint32_t*)&forMarshaling->descriptorCount, sizeof(uint32_t));
@@ -3135,8 +3795,10 @@
 
 void unmarshal_VkDescriptorSetLayoutBinding(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDescriptorSetLayoutBinding* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->binding, sizeof(uint32_t));
     vkStream->read((VkDescriptorType*)&forUnmarshaling->descriptorType, sizeof(VkDescriptorType));
     vkStream->read((uint32_t*)&forUnmarshaling->descriptorCount, sizeof(uint32_t));
@@ -3162,44 +3824,62 @@
 
 void marshal_VkDescriptorSetLayoutCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->bindingCount, sizeof(uint32_t));
     if (forMarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->bindingCount; ++i)
         {
-            marshal_VkDescriptorSetLayoutBinding(vkStream, (const VkDescriptorSetLayoutBinding*)(forMarshaling->pBindings + i));
+            marshal_VkDescriptorSetLayoutBinding(vkStream, rootType, (const VkDescriptorSetLayoutBinding*)(forMarshaling->pBindings + i));
         }
     }
 }
 
 void unmarshal_VkDescriptorSetLayoutCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDescriptorSetLayoutCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkDescriptorSetLayoutCreateFlags*)&forUnmarshaling->flags, sizeof(VkDescriptorSetLayoutCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->bindingCount, sizeof(uint32_t));
     if (forUnmarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bindingCount; ++i)
         {
-            unmarshal_VkDescriptorSetLayoutBinding(vkStream, (VkDescriptorSetLayoutBinding*)(forUnmarshaling->pBindings + i));
+            unmarshal_VkDescriptorSetLayoutBinding(vkStream, rootType, (VkDescriptorSetLayoutBinding*)(forUnmarshaling->pBindings + i));
         }
     }
 }
 
 void marshal_VkWriteDescriptorSet(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWriteDescriptorSet* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -3218,7 +3898,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)forMarshaling->descriptorCount; ++i)
                 {
-                    marshal_VkDescriptorImageInfo(vkStream, (const VkDescriptorImageInfo*)(forMarshaling->pImageInfo + i));
+                    marshal_VkDescriptorImageInfo(vkStream, rootType, (const VkDescriptorImageInfo*)(forMarshaling->pImageInfo + i));
                 }
             }
         }
@@ -3234,7 +3914,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)forMarshaling->descriptorCount; ++i)
                 {
-                    marshal_VkDescriptorBufferInfo(vkStream, (const VkDescriptorBufferInfo*)(forMarshaling->pBufferInfo + i));
+                    marshal_VkDescriptorBufferInfo(vkStream, rootType, (const VkDescriptorBufferInfo*)(forMarshaling->pBufferInfo + i));
                 }
             }
         }
@@ -3259,10 +3939,16 @@
 
 void unmarshal_VkWriteDescriptorSet(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkWriteDescriptorSet* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkDescriptorSet(&cgen_var_0, (VkDescriptorSet*)&forUnmarshaling->dstSet, 1);
@@ -3285,7 +3971,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->descriptorCount; ++i)
                 {
-                    unmarshal_VkDescriptorImageInfo(vkStream, (VkDescriptorImageInfo*)(forUnmarshaling->pImageInfo + i));
+                    unmarshal_VkDescriptorImageInfo(vkStream, rootType, (VkDescriptorImageInfo*)(forUnmarshaling->pImageInfo + i));
                 }
             }
         }
@@ -3309,7 +3995,7 @@
             {
                 for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->descriptorCount; ++i)
                 {
-                    unmarshal_VkDescriptorBufferInfo(vkStream, (VkDescriptorBufferInfo*)(forUnmarshaling->pBufferInfo + i));
+                    unmarshal_VkDescriptorBufferInfo(vkStream, rootType, (VkDescriptorBufferInfo*)(forUnmarshaling->pBufferInfo + i));
                 }
             }
         }
@@ -3346,8 +4032,10 @@
 
 void marshal_VkAttachmentDescription(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentDescription* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkAttachmentDescriptionFlags*)&forMarshaling->flags, sizeof(VkAttachmentDescriptionFlags));
     vkStream->write((VkFormat*)&forMarshaling->format, sizeof(VkFormat));
     vkStream->write((VkSampleCountFlagBits*)&forMarshaling->samples, sizeof(VkSampleCountFlagBits));
@@ -3361,8 +4049,10 @@
 
 void unmarshal_VkAttachmentDescription(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAttachmentDescription* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkAttachmentDescriptionFlags*)&forUnmarshaling->flags, sizeof(VkAttachmentDescriptionFlags));
     vkStream->read((VkFormat*)&forUnmarshaling->format, sizeof(VkFormat));
     vkStream->read((VkSampleCountFlagBits*)&forUnmarshaling->samples, sizeof(VkSampleCountFlagBits));
@@ -3376,26 +4066,36 @@
 
 void marshal_VkAttachmentReference(
     VulkanStreamGuest* 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(
     VulkanStreamGuest* 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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFramebufferCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkFramebufferCreateFlags*)&forMarshaling->flags, sizeof(VkFramebufferCreateFlags));
     uint64_t cgen_var_0;
     vkStream->handleMapping()->mapHandles_VkRenderPass_u64(&forMarshaling->renderPass, &cgen_var_0, 1);
@@ -3415,10 +4115,16 @@
 
 void unmarshal_VkFramebufferCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkFramebufferCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkFramebufferCreateFlags*)&forUnmarshaling->flags, sizeof(VkFramebufferCreateFlags));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
@@ -3438,8 +4144,10 @@
 
 void marshal_VkSubpassDescription(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassDescription* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkSubpassDescriptionFlags*)&forMarshaling->flags, sizeof(VkSubpassDescriptionFlags));
     vkStream->write((VkPipelineBindPoint*)&forMarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
     vkStream->write((uint32_t*)&forMarshaling->inputAttachmentCount, sizeof(uint32_t));
@@ -3447,7 +4155,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->inputAttachmentCount; ++i)
         {
-            marshal_VkAttachmentReference(vkStream, (const VkAttachmentReference*)(forMarshaling->pInputAttachments + i));
+            marshal_VkAttachmentReference(vkStream, rootType, (const VkAttachmentReference*)(forMarshaling->pInputAttachments + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->colorAttachmentCount, sizeof(uint32_t));
@@ -3455,7 +4163,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->colorAttachmentCount; ++i)
         {
-            marshal_VkAttachmentReference(vkStream, (const VkAttachmentReference*)(forMarshaling->pColorAttachments + i));
+            marshal_VkAttachmentReference(vkStream, rootType, (const VkAttachmentReference*)(forMarshaling->pColorAttachments + i));
         }
     }
     // WARNING PTR CHECK
@@ -3467,7 +4175,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forMarshaling->colorAttachmentCount; ++i)
             {
-                marshal_VkAttachmentReference(vkStream, (const VkAttachmentReference*)(forMarshaling->pResolveAttachments + i));
+                marshal_VkAttachmentReference(vkStream, rootType, (const VkAttachmentReference*)(forMarshaling->pResolveAttachments + i));
             }
         }
     }
@@ -3476,7 +4184,7 @@
     vkStream->putBe64(cgen_var_1);
     if (forMarshaling->pDepthStencilAttachment)
     {
-        marshal_VkAttachmentReference(vkStream, (const VkAttachmentReference*)(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));
@@ -3484,8 +4192,10 @@
 
 void unmarshal_VkSubpassDescription(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSubpassDescription* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkSubpassDescriptionFlags*)&forUnmarshaling->flags, sizeof(VkSubpassDescriptionFlags));
     vkStream->read((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
     vkStream->read((uint32_t*)&forUnmarshaling->inputAttachmentCount, sizeof(uint32_t));
@@ -3493,7 +4203,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->inputAttachmentCount; ++i)
         {
-            unmarshal_VkAttachmentReference(vkStream, (VkAttachmentReference*)(forUnmarshaling->pInputAttachments + i));
+            unmarshal_VkAttachmentReference(vkStream, rootType, (VkAttachmentReference*)(forUnmarshaling->pInputAttachments + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->colorAttachmentCount, sizeof(uint32_t));
@@ -3501,7 +4211,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->colorAttachmentCount; ++i)
         {
-            unmarshal_VkAttachmentReference(vkStream, (VkAttachmentReference*)(forUnmarshaling->pColorAttachments + i));
+            unmarshal_VkAttachmentReference(vkStream, rootType, (VkAttachmentReference*)(forUnmarshaling->pColorAttachments + i));
         }
     }
     // WARNING PTR CHECK
@@ -3517,7 +4227,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->colorAttachmentCount; ++i)
             {
-                unmarshal_VkAttachmentReference(vkStream, (VkAttachmentReference*)(forUnmarshaling->pResolveAttachments + i));
+                unmarshal_VkAttachmentReference(vkStream, rootType, (VkAttachmentReference*)(forUnmarshaling->pResolveAttachments + i));
             }
         }
     }
@@ -3530,7 +4240,7 @@
         {
             fprintf(stderr, "fatal: forUnmarshaling->pDepthStencilAttachment inconsistent between guest and host\n");
         }
-        unmarshal_VkAttachmentReference(vkStream, (VkAttachmentReference*)(forUnmarshaling->pDepthStencilAttachment));
+        unmarshal_VkAttachmentReference(vkStream, rootType, (VkAttachmentReference*)(forUnmarshaling->pDepthStencilAttachment));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->preserveAttachmentCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)forUnmarshaling->pPreserveAttachments, forUnmarshaling->preserveAttachmentCount * sizeof(const uint32_t));
@@ -3538,8 +4248,10 @@
 
 void marshal_VkSubpassDependency(
     VulkanStreamGuest* 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));
@@ -3551,8 +4263,10 @@
 
 void unmarshal_VkSubpassDependency(
     VulkanStreamGuest* 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));
@@ -3564,17 +4278,23 @@
 
 void marshal_VkRenderPassCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->attachmentCount, sizeof(uint32_t));
     if (forMarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->attachmentCount; ++i)
         {
-            marshal_VkAttachmentDescription(vkStream, (const VkAttachmentDescription*)(forMarshaling->pAttachments + i));
+            marshal_VkAttachmentDescription(vkStream, rootType, (const VkAttachmentDescription*)(forMarshaling->pAttachments + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->subpassCount, sizeof(uint32_t));
@@ -3582,7 +4302,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->subpassCount; ++i)
         {
-            marshal_VkSubpassDescription(vkStream, (const VkSubpassDescription*)(forMarshaling->pSubpasses + i));
+            marshal_VkSubpassDescription(vkStream, rootType, (const VkSubpassDescription*)(forMarshaling->pSubpasses + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->dependencyCount, sizeof(uint32_t));
@@ -3590,24 +4310,30 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->dependencyCount; ++i)
         {
-            marshal_VkSubpassDependency(vkStream, (const VkSubpassDependency*)(forMarshaling->pDependencies + i));
+            marshal_VkSubpassDependency(vkStream, rootType, (const VkSubpassDependency*)(forMarshaling->pDependencies + i));
         }
     }
 }
 
 void unmarshal_VkRenderPassCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRenderPassCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkRenderPassCreateFlags*)&forUnmarshaling->flags, sizeof(VkRenderPassCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->attachmentCount, sizeof(uint32_t));
     if (forUnmarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->attachmentCount; ++i)
         {
-            unmarshal_VkAttachmentDescription(vkStream, (VkAttachmentDescription*)(forUnmarshaling->pAttachments + i));
+            unmarshal_VkAttachmentDescription(vkStream, rootType, (VkAttachmentDescription*)(forUnmarshaling->pAttachments + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->subpassCount, sizeof(uint32_t));
@@ -3615,7 +4341,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->subpassCount; ++i)
         {
-            unmarshal_VkSubpassDescription(vkStream, (VkSubpassDescription*)(forUnmarshaling->pSubpasses + i));
+            unmarshal_VkSubpassDescription(vkStream, rootType, (VkSubpassDescription*)(forUnmarshaling->pSubpasses + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->dependencyCount, sizeof(uint32_t));
@@ -3623,37 +4349,55 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->dependencyCount; ++i)
         {
-            unmarshal_VkSubpassDependency(vkStream, (VkSubpassDependency*)(forUnmarshaling->pDependencies + i));
+            unmarshal_VkSubpassDependency(vkStream, rootType, (VkSubpassDependency*)(forUnmarshaling->pDependencies + i));
         }
     }
 }
 
 void marshal_VkCommandPoolCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCommandPoolCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->queueFamilyIndex, sizeof(uint32_t));
 }
 
 void unmarshal_VkCommandPoolCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCommandPoolCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkCommandPoolCreateFlags*)&forUnmarshaling->flags, sizeof(VkCommandPoolCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->queueFamilyIndex, sizeof(uint32_t));
 }
 
 void marshal_VkCommandBufferAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCommandBufferAllocateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -3663,10 +4407,16 @@
 
 void unmarshal_VkCommandBufferAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCommandBufferAllocateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkCommandPool(&cgen_var_0, (VkCommandPool*)&forUnmarshaling->commandPool, 1);
@@ -3676,10 +4426,16 @@
 
 void marshal_VkCommandBufferInheritanceInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCommandBufferInheritanceInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -3694,10 +4450,16 @@
 
 void unmarshal_VkCommandBufferInheritanceInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCommandBufferInheritanceInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkRenderPass(&cgen_var_0, (VkRenderPass*)&forUnmarshaling->renderPass, 1);
@@ -3712,26 +4474,38 @@
 
 void marshal_VkCommandBufferBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCommandBufferBeginInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     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, (const VkCommandBufferInheritanceInfo*)(forMarshaling->pInheritanceInfo));
+        marshal_VkCommandBufferInheritanceInfo(vkStream, rootType, (const VkCommandBufferInheritanceInfo*)(forMarshaling->pInheritanceInfo));
     }
 }
 
 void unmarshal_VkCommandBufferBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCommandBufferBeginInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkCommandBufferUsageFlags*)&forUnmarshaling->flags, sizeof(VkCommandBufferUsageFlags));
     // WARNING PTR CHECK
     const VkCommandBufferInheritanceInfo* check_pInheritanceInfo;
@@ -3742,14 +4516,16 @@
         {
             fprintf(stderr, "fatal: forUnmarshaling->pInheritanceInfo inconsistent between guest and host\n");
         }
-        unmarshal_VkCommandBufferInheritanceInfo(vkStream, (VkCommandBufferInheritanceInfo*)(forUnmarshaling->pInheritanceInfo));
+        unmarshal_VkCommandBufferInheritanceInfo(vkStream, rootType, (VkCommandBufferInheritanceInfo*)(forUnmarshaling->pInheritanceInfo));
     }
 }
 
 void marshal_VkBufferCopy(
     VulkanStreamGuest* 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));
@@ -3757,8 +4533,10 @@
 
 void unmarshal_VkBufferCopy(
     VulkanStreamGuest* 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));
@@ -3766,8 +4544,10 @@
 
 void marshal_VkImageSubresourceLayers(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageSubresourceLayers* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkImageAspectFlags*)&forMarshaling->aspectMask, sizeof(VkImageAspectFlags));
     vkStream->write((uint32_t*)&forMarshaling->mipLevel, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->baseArrayLayer, sizeof(uint32_t));
@@ -3776,8 +4556,10 @@
 
 void unmarshal_VkImageSubresourceLayers(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageSubresourceLayers* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkImageAspectFlags*)&forUnmarshaling->aspectMask, sizeof(VkImageAspectFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->mipLevel, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->baseArrayLayer, sizeof(uint32_t));
@@ -3786,197 +4568,239 @@
 
 void marshal_VkBufferImageCopy(
     VulkanStreamGuest* 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, (VkImageSubresourceLayers*)(&forMarshaling->imageSubresource));
-    marshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->imageOffset));
-    marshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->imageExtent));
+    marshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->imageSubresource));
+    marshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->imageOffset));
+    marshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->imageExtent));
 }
 
 void unmarshal_VkBufferImageCopy(
     VulkanStreamGuest* 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, (VkImageSubresourceLayers*)(&forUnmarshaling->imageSubresource));
-    unmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forUnmarshaling->imageOffset));
-    unmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forUnmarshaling->imageExtent));
+    unmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->imageSubresource));
+    unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->imageOffset));
+    unmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->imageExtent));
 }
 
 void marshal_VkClearColorValue(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkClearColorValue* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((float*)forMarshaling->float32, 4 * sizeof(float));
 }
 
 void unmarshal_VkClearColorValue(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkClearColorValue* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((float*)forUnmarshaling->float32, 4 * sizeof(float));
 }
 
 void marshal_VkClearDepthStencilValue(
     VulkanStreamGuest* 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(
     VulkanStreamGuest* 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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkClearValue* forMarshaling)
 {
-    marshal_VkClearColorValue(vkStream, (VkClearColorValue*)(&forMarshaling->color));
+    (void)rootType;
+    marshal_VkClearColorValue(vkStream, rootType, (VkClearColorValue*)(&forMarshaling->color));
 }
 
 void unmarshal_VkClearValue(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkClearValue* forUnmarshaling)
 {
-    unmarshal_VkClearColorValue(vkStream, (VkClearColorValue*)(&forUnmarshaling->color));
+    (void)rootType;
+    unmarshal_VkClearColorValue(vkStream, rootType, (VkClearColorValue*)(&forUnmarshaling->color));
 }
 
 void marshal_VkClearAttachment(
     VulkanStreamGuest* 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, (VkClearValue*)(&forMarshaling->clearValue));
+    marshal_VkClearValue(vkStream, rootType, (VkClearValue*)(&forMarshaling->clearValue));
 }
 
 void unmarshal_VkClearAttachment(
     VulkanStreamGuest* 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, (VkClearValue*)(&forUnmarshaling->clearValue));
+    unmarshal_VkClearValue(vkStream, rootType, (VkClearValue*)(&forUnmarshaling->clearValue));
 }
 
 void marshal_VkClearRect(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkClearRect* forMarshaling)
 {
-    marshal_VkRect2D(vkStream, (VkRect2D*)(&forMarshaling->rect));
+    (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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkClearRect* forUnmarshaling)
 {
-    unmarshal_VkRect2D(vkStream, (VkRect2D*)(&forUnmarshaling->rect));
+    (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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageBlit* forMarshaling)
 {
-    marshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource));
+    (void)rootType;
+    marshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource));
     for (uint32_t i = 0; i < (uint32_t)2; ++i)
     {
-        marshal_VkOffset3D(vkStream, (VkOffset3D*)(forMarshaling->srcOffsets + i));
+        marshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(forMarshaling->srcOffsets + i));
     }
-    marshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource));
+    marshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource));
     for (uint32_t i = 0; i < (uint32_t)2; ++i)
     {
-        marshal_VkOffset3D(vkStream, (VkOffset3D*)(forMarshaling->dstOffsets + i));
+        marshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(forMarshaling->dstOffsets + i));
     }
 }
 
 void unmarshal_VkImageBlit(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageBlit* forUnmarshaling)
 {
-    unmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource));
+    (void)rootType;
+    unmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource));
     for (uint32_t i = 0; i < (uint32_t)2; ++i)
     {
-        unmarshal_VkOffset3D(vkStream, (VkOffset3D*)(forUnmarshaling->srcOffsets + i));
+        unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(forUnmarshaling->srcOffsets + i));
     }
-    unmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource));
+    unmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource));
     for (uint32_t i = 0; i < (uint32_t)2; ++i)
     {
-        unmarshal_VkOffset3D(vkStream, (VkOffset3D*)(forUnmarshaling->dstOffsets + i));
+        unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(forUnmarshaling->dstOffsets + i));
     }
 }
 
 void marshal_VkImageCopy(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageCopy* forMarshaling)
 {
-    marshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource));
-    marshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->srcOffset));
-    marshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource));
-    marshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->dstOffset));
-    marshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->extent));
+    (void)rootType;
+    marshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource));
+    marshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->srcOffset));
+    marshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource));
+    marshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->dstOffset));
+    marshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->extent));
 }
 
 void unmarshal_VkImageCopy(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageCopy* forUnmarshaling)
 {
-    unmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource));
-    unmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forUnmarshaling->srcOffset));
-    unmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource));
-    unmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forUnmarshaling->dstOffset));
-    unmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forUnmarshaling->extent));
+    (void)rootType;
+    unmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource));
+    unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->srcOffset));
+    unmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource));
+    unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->dstOffset));
+    unmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->extent));
 }
 
 void marshal_VkImageResolve(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageResolve* forMarshaling)
 {
-    marshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource));
-    marshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->srcOffset));
-    marshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource));
-    marshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->dstOffset));
-    marshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->extent));
+    (void)rootType;
+    marshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource));
+    marshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->srcOffset));
+    marshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource));
+    marshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->dstOffset));
+    marshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->extent));
 }
 
 void unmarshal_VkImageResolve(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageResolve* forUnmarshaling)
 {
-    unmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource));
-    unmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forUnmarshaling->srcOffset));
-    unmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource));
-    unmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forUnmarshaling->dstOffset));
-    unmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forUnmarshaling->extent));
+    (void)rootType;
+    unmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource));
+    unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->srcOffset));
+    unmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource));
+    unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->dstOffset));
+    unmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->extent));
 }
 
 void marshal_VkRenderPassBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassBeginInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->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->write((uint64_t*)&cgen_var_1, 1 * 8);
-    marshal_VkRect2D(vkStream, (VkRect2D*)(&forMarshaling->renderArea));
+    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;
@@ -3987,7 +4811,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forMarshaling->clearValueCount; ++i)
             {
-                marshal_VkClearValue(vkStream, (const VkClearValue*)(forMarshaling->pClearValues + i));
+                marshal_VkClearValue(vkStream, rootType, (const VkClearValue*)(forMarshaling->pClearValues + i));
             }
         }
     }
@@ -3995,17 +4819,23 @@
 
 void unmarshal_VkRenderPassBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRenderPassBeginInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_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);
-    unmarshal_VkRect2D(vkStream, (VkRect2D*)(&forUnmarshaling->renderArea));
+    unmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(&forUnmarshaling->renderArea));
     vkStream->read((uint32_t*)&forUnmarshaling->clearValueCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     const VkClearValue* check_pClearValues;
@@ -4020,7 +4850,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->clearValueCount; ++i)
             {
-                unmarshal_VkClearValue(vkStream, (VkClearValue*)(forUnmarshaling->pClearValues + i));
+                unmarshal_VkClearValue(vkStream, rootType, (VkClearValue*)(forUnmarshaling->pClearValues + i));
             }
         }
     }
@@ -4030,10 +4860,16 @@
 #ifdef VK_VERSION_1_1
 void marshal_VkPhysicalDeviceSubgroupProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSubgroupProperties* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -4042,10 +4878,16 @@
 
 void unmarshal_VkPhysicalDeviceSubgroupProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceSubgroupProperties* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -4054,10 +4896,16 @@
 
 void marshal_VkBindBufferMemoryInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindBufferMemoryInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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_VkBuffer_u64(&forMarshaling->buffer, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -4069,10 +4917,16 @@
 
 void unmarshal_VkBindBufferMemoryInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBindBufferMemoryInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0, (VkBuffer*)&forUnmarshaling->buffer, 1);
@@ -4084,10 +4938,16 @@
 
 void marshal_VkBindImageMemoryInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindImageMemoryInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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_VkImage_u64(&forMarshaling->image, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -4099,10 +4959,16 @@
 
 void unmarshal_VkBindImageMemoryInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBindImageMemoryInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0, (VkImage*)&forUnmarshaling->image, 1);
@@ -4114,10 +4980,16 @@
 
 void marshal_VkPhysicalDevice16BitStorageFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevice16BitStorageFeatures* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->storagePushConstant16, sizeof(VkBool32));
@@ -4126,10 +4998,16 @@
 
 void unmarshal_VkPhysicalDevice16BitStorageFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDevice16BitStorageFeatures* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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->storagePushConstant16, sizeof(VkBool32));
@@ -4138,30 +5016,48 @@
 
 void marshal_VkMemoryDedicatedRequirements(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryDedicatedRequirements* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->prefersDedicatedAllocation, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->requiresDedicatedAllocation, sizeof(VkBool32));
 }
 
 void unmarshal_VkMemoryDedicatedRequirements(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryDedicatedRequirements* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->prefersDedicatedAllocation, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->requiresDedicatedAllocation, sizeof(VkBool32));
 }
 
 void marshal_VkMemoryDedicatedAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryDedicatedAllocateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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_VkImage_u64(&forMarshaling->image, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -4172,10 +5068,16 @@
 
 void unmarshal_VkMemoryDedicatedAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryDedicatedAllocateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0, (VkImage*)&forUnmarshaling->image, 1);
@@ -4186,82 +5088,124 @@
 
 void marshal_VkMemoryAllocateFlagsInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryAllocateFlagsInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkMemoryAllocateFlags*)&forMarshaling->flags, sizeof(VkMemoryAllocateFlags));
     vkStream->write((uint32_t*)&forMarshaling->deviceMask, sizeof(uint32_t));
 }
 
 void unmarshal_VkMemoryAllocateFlagsInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryAllocateFlagsInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkMemoryAllocateFlags*)&forUnmarshaling->flags, sizeof(VkMemoryAllocateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->deviceMask, sizeof(uint32_t));
 }
 
 void marshal_VkDeviceGroupRenderPassBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupRenderPassBeginInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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, (const VkRect2D*)(forMarshaling->pDeviceRenderAreas + i));
+            marshal_VkRect2D(vkStream, rootType, (const VkRect2D*)(forMarshaling->pDeviceRenderAreas + i));
         }
     }
 }
 
 void unmarshal_VkDeviceGroupRenderPassBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceGroupRenderPassBeginInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
     if (forUnmarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->deviceRenderAreaCount; ++i)
         {
-            unmarshal_VkRect2D(vkStream, (VkRect2D*)(forUnmarshaling->pDeviceRenderAreas + i));
+            unmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(forUnmarshaling->pDeviceRenderAreas + i));
         }
     }
 }
 
 void marshal_VkDeviceGroupCommandBufferBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupCommandBufferBeginInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
 }
 
 void unmarshal_VkDeviceGroupCommandBufferBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceGroupCommandBufferBeginInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->deviceMask, sizeof(uint32_t));
 }
 
 void marshal_VkDeviceGroupSubmitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupSubmitInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->commandBufferCount, sizeof(uint32_t));
@@ -4272,10 +5216,16 @@
 
 void unmarshal_VkDeviceGroupSubmitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceGroupSubmitInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->waitSemaphoreCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)forUnmarshaling->pWaitSemaphoreDeviceIndices, forUnmarshaling->waitSemaphoreCount * sizeof(const uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->commandBufferCount, sizeof(uint32_t));
@@ -4286,50 +5236,80 @@
 
 void marshal_VkDeviceGroupBindSparseInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupBindSparseInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->resourceDeviceIndex, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->memoryDeviceIndex, sizeof(uint32_t));
 }
 
 void unmarshal_VkDeviceGroupBindSparseInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceGroupBindSparseInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->resourceDeviceIndex, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->memoryDeviceIndex, sizeof(uint32_t));
 }
 
 void marshal_VkBindBufferMemoryDeviceGroupInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindBufferMemoryDeviceGroupInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
 }
 
 void unmarshal_VkBindBufferMemoryDeviceGroupInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBindBufferMemoryDeviceGroupInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->deviceIndexCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)forUnmarshaling->pDeviceIndices, forUnmarshaling->deviceIndexCount * sizeof(const uint32_t));
 }
 
 void marshal_VkBindImageMemoryDeviceGroupInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindImageMemoryDeviceGroupInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->splitInstanceBindRegionCount, sizeof(uint32_t));
@@ -4337,17 +5317,23 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->splitInstanceBindRegionCount; ++i)
         {
-            marshal_VkRect2D(vkStream, (const VkRect2D*)(forMarshaling->pSplitInstanceBindRegions + i));
+            marshal_VkRect2D(vkStream, rootType, (const VkRect2D*)(forMarshaling->pSplitInstanceBindRegions + i));
         }
     }
 }
 
 void unmarshal_VkBindImageMemoryDeviceGroupInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBindImageMemoryDeviceGroupInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->deviceIndexCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)forUnmarshaling->pDeviceIndices, forUnmarshaling->deviceIndexCount * sizeof(const uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->splitInstanceBindRegionCount, sizeof(uint32_t));
@@ -4355,17 +5341,23 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->splitInstanceBindRegionCount; ++i)
         {
-            unmarshal_VkRect2D(vkStream, (VkRect2D*)(forUnmarshaling->pSplitInstanceBindRegions + i));
+            unmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(forUnmarshaling->pSplitInstanceBindRegions + i));
         }
     }
 }
 
 void marshal_VkPhysicalDeviceGroupProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceGroupProperties* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((VkBool32*)&forMarshaling->subsetAllocation, sizeof(VkBool32));
@@ -4373,10 +5365,16 @@
 
 void unmarshal_VkPhysicalDeviceGroupProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceGroupProperties* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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((VkBool32*)&forUnmarshaling->subsetAllocation, sizeof(VkBool32));
@@ -4384,10 +5382,16 @@
 
 void marshal_VkDeviceGroupDeviceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupDeviceCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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)
     {
@@ -4400,10 +5404,16 @@
 
 void unmarshal_VkDeviceGroupDeviceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceGroupDeviceCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->physicalDeviceCount, sizeof(uint32_t));
     if (forUnmarshaling->physicalDeviceCount)
     {
@@ -4416,10 +5426,16 @@
 
 void marshal_VkBufferMemoryRequirementsInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferMemoryRequirementsInfo2* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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_VkBuffer_u64(&forMarshaling->buffer, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -4427,10 +5443,16 @@
 
 void unmarshal_VkBufferMemoryRequirementsInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBufferMemoryRequirementsInfo2* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0, (VkBuffer*)&forUnmarshaling->buffer, 1);
@@ -4438,10 +5460,16 @@
 
 void marshal_VkImageMemoryRequirementsInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageMemoryRequirementsInfo2* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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_VkImage_u64(&forMarshaling->image, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -4449,10 +5477,16 @@
 
 void unmarshal_VkImageMemoryRequirementsInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageMemoryRequirementsInfo2* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0, (VkImage*)&forUnmarshaling->image, 1);
@@ -4460,10 +5494,16 @@
 
 void marshal_VkImageSparseMemoryRequirementsInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageSparseMemoryRequirementsInfo2* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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_VkImage_u64(&forMarshaling->image, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -4471,10 +5511,16 @@
 
 void unmarshal_VkImageSparseMemoryRequirementsInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageSparseMemoryRequirementsInfo2* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0, (VkImage*)&forUnmarshaling->image, 1);
@@ -4482,118 +5528,196 @@
 
 void marshal_VkMemoryRequirements2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryRequirements2* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkMemoryRequirements(vkStream, (VkMemoryRequirements*)(&forMarshaling->memoryRequirements));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    marshal_VkMemoryRequirements(vkStream, rootType, (VkMemoryRequirements*)(&forMarshaling->memoryRequirements));
 }
 
 void unmarshal_VkMemoryRequirements2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryRequirements2* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkMemoryRequirements(vkStream, (VkMemoryRequirements*)(&forUnmarshaling->memoryRequirements));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkMemoryRequirements(vkStream, rootType, (VkMemoryRequirements*)(&forUnmarshaling->memoryRequirements));
 }
 
 void marshal_VkSparseImageMemoryRequirements2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseImageMemoryRequirements2* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkSparseImageMemoryRequirements(vkStream, (VkSparseImageMemoryRequirements*)(&forMarshaling->memoryRequirements));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    marshal_VkSparseImageMemoryRequirements(vkStream, rootType, (VkSparseImageMemoryRequirements*)(&forMarshaling->memoryRequirements));
 }
 
 void unmarshal_VkSparseImageMemoryRequirements2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSparseImageMemoryRequirements2* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkSparseImageMemoryRequirements(vkStream, (VkSparseImageMemoryRequirements*)(&forUnmarshaling->memoryRequirements));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkSparseImageMemoryRequirements(vkStream, rootType, (VkSparseImageMemoryRequirements*)(&forUnmarshaling->memoryRequirements));
 }
 
 void marshal_VkPhysicalDeviceFeatures2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFeatures2* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkPhysicalDeviceFeatures(vkStream, (VkPhysicalDeviceFeatures*)(&forMarshaling->features));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    marshal_VkPhysicalDeviceFeatures(vkStream, rootType, (VkPhysicalDeviceFeatures*)(&forMarshaling->features));
 }
 
 void unmarshal_VkPhysicalDeviceFeatures2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceFeatures2* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkPhysicalDeviceFeatures(vkStream, (VkPhysicalDeviceFeatures*)(&forUnmarshaling->features));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkPhysicalDeviceFeatures(vkStream, rootType, (VkPhysicalDeviceFeatures*)(&forUnmarshaling->features));
 }
 
 void marshal_VkPhysicalDeviceProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceProperties2* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkPhysicalDeviceProperties(vkStream, (VkPhysicalDeviceProperties*)(&forMarshaling->properties));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    marshal_VkPhysicalDeviceProperties(vkStream, rootType, (VkPhysicalDeviceProperties*)(&forMarshaling->properties));
 }
 
 void unmarshal_VkPhysicalDeviceProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceProperties2* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkPhysicalDeviceProperties(vkStream, (VkPhysicalDeviceProperties*)(&forUnmarshaling->properties));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkPhysicalDeviceProperties(vkStream, rootType, (VkPhysicalDeviceProperties*)(&forUnmarshaling->properties));
 }
 
 void marshal_VkFormatProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFormatProperties2* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkFormatProperties(vkStream, (VkFormatProperties*)(&forMarshaling->formatProperties));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    marshal_VkFormatProperties(vkStream, rootType, (VkFormatProperties*)(&forMarshaling->formatProperties));
 }
 
 void unmarshal_VkFormatProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkFormatProperties2* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkFormatProperties(vkStream, (VkFormatProperties*)(&forUnmarshaling->formatProperties));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkFormatProperties(vkStream, rootType, (VkFormatProperties*)(&forUnmarshaling->formatProperties));
 }
 
 void marshal_VkImageFormatProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageFormatProperties2* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkImageFormatProperties(vkStream, (VkImageFormatProperties*)(&forMarshaling->imageFormatProperties));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    marshal_VkImageFormatProperties(vkStream, rootType, (VkImageFormatProperties*)(&forMarshaling->imageFormatProperties));
 }
 
 void unmarshal_VkImageFormatProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageFormatProperties2* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkImageFormatProperties(vkStream, (VkImageFormatProperties*)(&forUnmarshaling->imageFormatProperties));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkImageFormatProperties(vkStream, rootType, (VkImageFormatProperties*)(&forUnmarshaling->imageFormatProperties));
 }
 
 void marshal_VkPhysicalDeviceImageFormatInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageFormatInfo2* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((VkImageType*)&forMarshaling->type, sizeof(VkImageType));
     vkStream->write((VkImageTiling*)&forMarshaling->tiling, sizeof(VkImageTiling));
@@ -4603,10 +5727,16 @@
 
 void unmarshal_VkPhysicalDeviceImageFormatInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceImageFormatInfo2* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkFormat*)&forUnmarshaling->format, sizeof(VkFormat));
     vkStream->read((VkImageType*)&forUnmarshaling->type, sizeof(VkImageType));
     vkStream->read((VkImageTiling*)&forUnmarshaling->tiling, sizeof(VkImageTiling));
@@ -4616,64 +5746,106 @@
 
 void marshal_VkQueueFamilyProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkQueueFamilyProperties2* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkQueueFamilyProperties(vkStream, (VkQueueFamilyProperties*)(&forMarshaling->queueFamilyProperties));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    marshal_VkQueueFamilyProperties(vkStream, rootType, (VkQueueFamilyProperties*)(&forMarshaling->queueFamilyProperties));
 }
 
 void unmarshal_VkQueueFamilyProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkQueueFamilyProperties2* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkQueueFamilyProperties(vkStream, (VkQueueFamilyProperties*)(&forUnmarshaling->queueFamilyProperties));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkQueueFamilyProperties(vkStream, rootType, (VkQueueFamilyProperties*)(&forUnmarshaling->queueFamilyProperties));
 }
 
 void marshal_VkPhysicalDeviceMemoryProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryProperties2* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkPhysicalDeviceMemoryProperties(vkStream, (VkPhysicalDeviceMemoryProperties*)(&forMarshaling->memoryProperties));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    marshal_VkPhysicalDeviceMemoryProperties(vkStream, rootType, (VkPhysicalDeviceMemoryProperties*)(&forMarshaling->memoryProperties));
 }
 
 void unmarshal_VkPhysicalDeviceMemoryProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceMemoryProperties2* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkPhysicalDeviceMemoryProperties(vkStream, (VkPhysicalDeviceMemoryProperties*)(&forUnmarshaling->memoryProperties));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkPhysicalDeviceMemoryProperties(vkStream, rootType, (VkPhysicalDeviceMemoryProperties*)(&forUnmarshaling->memoryProperties));
 }
 
 void marshal_VkSparseImageFormatProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseImageFormatProperties2* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkSparseImageFormatProperties(vkStream, (VkSparseImageFormatProperties*)(&forMarshaling->properties));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    marshal_VkSparseImageFormatProperties(vkStream, rootType, (VkSparseImageFormatProperties*)(&forMarshaling->properties));
 }
 
 void unmarshal_VkSparseImageFormatProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSparseImageFormatProperties2* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkSparseImageFormatProperties(vkStream, (VkSparseImageFormatProperties*)(&forUnmarshaling->properties));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkSparseImageFormatProperties(vkStream, rootType, (VkSparseImageFormatProperties*)(&forUnmarshaling->properties));
 }
 
 void marshal_VkPhysicalDeviceSparseImageFormatInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSparseImageFormatInfo2* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((VkImageType*)&forMarshaling->type, sizeof(VkImageType));
     vkStream->write((VkSampleCountFlagBits*)&forMarshaling->samples, sizeof(VkSampleCountFlagBits));
@@ -4683,10 +5855,16 @@
 
 void unmarshal_VkPhysicalDeviceSparseImageFormatInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceSparseImageFormatInfo2* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -4696,26 +5874,40 @@
 
 void marshal_VkPhysicalDevicePointClippingProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePointClippingProperties* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkPointClippingBehavior*)&forMarshaling->pointClippingBehavior, sizeof(VkPointClippingBehavior));
 }
 
 void unmarshal_VkPhysicalDevicePointClippingProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDevicePointClippingProperties* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPointClippingBehavior*)&forUnmarshaling->pointClippingBehavior, sizeof(VkPointClippingBehavior));
 }
 
 void marshal_VkInputAttachmentAspectReference(
     VulkanStreamGuest* 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));
@@ -4723,8 +5915,10 @@
 
 void unmarshal_VkInputAttachmentAspectReference(
     VulkanStreamGuest* 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));
     vkStream->read((VkImageAspectFlags*)&forUnmarshaling->aspectMask, sizeof(VkImageAspectFlags));
@@ -4732,78 +5926,120 @@
 
 void marshal_VkRenderPassInputAttachmentAspectCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassInputAttachmentAspectCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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, (const VkInputAttachmentAspectReference*)(forMarshaling->pAspectReferences + i));
+            marshal_VkInputAttachmentAspectReference(vkStream, rootType, (const VkInputAttachmentAspectReference*)(forMarshaling->pAspectReferences + i));
         }
     }
 }
 
 void unmarshal_VkRenderPassInputAttachmentAspectCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRenderPassInputAttachmentAspectCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->aspectReferenceCount, sizeof(uint32_t));
     if (forUnmarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->aspectReferenceCount; ++i)
         {
-            unmarshal_VkInputAttachmentAspectReference(vkStream, (VkInputAttachmentAspectReference*)(forUnmarshaling->pAspectReferences + i));
+            unmarshal_VkInputAttachmentAspectReference(vkStream, rootType, (VkInputAttachmentAspectReference*)(forUnmarshaling->pAspectReferences + i));
         }
     }
 }
 
 void marshal_VkImageViewUsageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageViewUsageCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageViewUsageCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkImageUsageFlags*)&forUnmarshaling->usage, sizeof(VkImageUsageFlags));
 }
 
 void marshal_VkPipelineTessellationDomainOriginStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineTessellationDomainOriginStateCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkTessellationDomainOrigin*)&forMarshaling->domainOrigin, sizeof(VkTessellationDomainOrigin));
 }
 
 void unmarshal_VkPipelineTessellationDomainOriginStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineTessellationDomainOriginStateCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkTessellationDomainOrigin*)&forUnmarshaling->domainOrigin, sizeof(VkTessellationDomainOrigin));
 }
 
 void marshal_VkRenderPassMultiviewCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassMultiviewCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->dependencyCount, sizeof(uint32_t));
@@ -4814,10 +6050,16 @@
 
 void unmarshal_VkRenderPassMultiviewCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRenderPassMultiviewCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->subpassCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)forUnmarshaling->pViewMasks, forUnmarshaling->subpassCount * sizeof(const uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->dependencyCount, sizeof(uint32_t));
@@ -4828,10 +6070,16 @@
 
 void marshal_VkPhysicalDeviceMultiviewFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMultiviewFeatures* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->multiview, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->multiviewGeometryShader, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->multiviewTessellationShader, sizeof(VkBool32));
@@ -4839,10 +6087,16 @@
 
 void unmarshal_VkPhysicalDeviceMultiviewFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceMultiviewFeatures* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->multiview, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->multiviewGeometryShader, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->multiviewTessellationShader, sizeof(VkBool32));
@@ -4850,86 +6104,140 @@
 
 void marshal_VkPhysicalDeviceMultiviewProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMultiviewProperties* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->maxMultiviewViewCount, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxMultiviewInstanceIndex, sizeof(uint32_t));
 }
 
 void unmarshal_VkPhysicalDeviceMultiviewProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceMultiviewProperties* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->maxMultiviewViewCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxMultiviewInstanceIndex, sizeof(uint32_t));
 }
 
 void marshal_VkPhysicalDeviceVariablePointersFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVariablePointersFeatures* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->variablePointersStorageBuffer, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->variablePointers, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceVariablePointersFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceVariablePointersFeatures* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->variablePointersStorageBuffer, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->variablePointers, sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceProtectedMemoryFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceProtectedMemoryFeatures* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->protectedMemory, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceProtectedMemoryFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceProtectedMemoryFeatures* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->protectedMemory, sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceProtectedMemoryProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceProtectedMemoryProperties* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->protectedNoFault, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceProtectedMemoryProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceProtectedMemoryProperties* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->protectedNoFault, sizeof(VkBool32));
 }
 
 void marshal_VkDeviceQueueInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceQueueInfo2* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->queueFamilyIndex, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->queueIndex, sizeof(uint32_t));
@@ -4937,10 +6245,16 @@
 
 void unmarshal_VkDeviceQueueInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceQueueInfo2* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     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));
@@ -4948,32 +6262,50 @@
 
 void marshal_VkProtectedSubmitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkProtectedSubmitInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkProtectedSubmitInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->protectedSubmit, sizeof(VkBool32));
 }
 
 void marshal_VkSamplerYcbcrConversionCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSamplerYcbcrConversionCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((VkSamplerYcbcrRange*)&forMarshaling->ycbcrRange, sizeof(VkSamplerYcbcrRange));
-    marshal_VkComponentMapping(vkStream, (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));
@@ -4982,14 +6314,20 @@
 
 void unmarshal_VkSamplerYcbcrConversionCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSamplerYcbcrConversionCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkFormat*)&forUnmarshaling->format, sizeof(VkFormat));
     vkStream->read((VkSamplerYcbcrModelConversion*)&forUnmarshaling->ycbcrModel, sizeof(VkSamplerYcbcrModelConversion));
     vkStream->read((VkSamplerYcbcrRange*)&forUnmarshaling->ycbcrRange, sizeof(VkSamplerYcbcrRange));
-    unmarshal_VkComponentMapping(vkStream, (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));
@@ -4998,10 +6336,16 @@
 
 void marshal_VkSamplerYcbcrConversionInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSamplerYcbcrConversionInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -5009,10 +6353,16 @@
 
 void unmarshal_VkSamplerYcbcrConversionInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSamplerYcbcrConversionInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkSamplerYcbcrConversion(&cgen_var_0, (VkSamplerYcbcrConversion*)&forUnmarshaling->conversion, 1);
@@ -5020,80 +6370,130 @@
 
 void marshal_VkBindImagePlaneMemoryInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindImagePlaneMemoryInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkImageAspectFlagBits*)&forMarshaling->planeAspect, sizeof(VkImageAspectFlagBits));
 }
 
 void unmarshal_VkBindImagePlaneMemoryInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBindImagePlaneMemoryInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkImageAspectFlagBits*)&forUnmarshaling->planeAspect, sizeof(VkImageAspectFlagBits));
 }
 
 void marshal_VkImagePlaneMemoryRequirementsInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImagePlaneMemoryRequirementsInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkImageAspectFlagBits*)&forMarshaling->planeAspect, sizeof(VkImageAspectFlagBits));
 }
 
 void unmarshal_VkImagePlaneMemoryRequirementsInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImagePlaneMemoryRequirementsInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkImageAspectFlagBits*)&forUnmarshaling->planeAspect, sizeof(VkImageAspectFlagBits));
 }
 
 void marshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSamplerYcbcrConversionFeatures* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->samplerYcbcrConversion, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceSamplerYcbcrConversionFeatures* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->samplerYcbcrConversion, sizeof(VkBool32));
 }
 
 void marshal_VkSamplerYcbcrConversionImageFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSamplerYcbcrConversionImageFormatProperties* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
 }
 
 void unmarshal_VkSamplerYcbcrConversionImageFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSamplerYcbcrConversionImageFormatProperties* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->combinedImageSamplerDescriptorCount, sizeof(uint32_t));
 }
 
 void marshal_VkDescriptorUpdateTemplateEntry(
     VulkanStreamGuest* 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));
     vkStream->write((uint32_t*)&forMarshaling->descriptorCount, sizeof(uint32_t));
@@ -5106,8 +6506,10 @@
 
 void unmarshal_VkDescriptorUpdateTemplateEntry(
     VulkanStreamGuest* 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));
     vkStream->read((uint32_t*)&forUnmarshaling->descriptorCount, sizeof(uint32_t));
@@ -5118,17 +6520,23 @@
 
 void marshal_VkDescriptorUpdateTemplateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorUpdateTemplateCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->descriptorUpdateEntryCount, sizeof(uint32_t));
     if (forMarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->descriptorUpdateEntryCount; ++i)
         {
-            marshal_VkDescriptorUpdateTemplateEntry(vkStream, (const VkDescriptorUpdateTemplateEntry*)(forMarshaling->pDescriptorUpdateEntries + i));
+            marshal_VkDescriptorUpdateTemplateEntry(vkStream, rootType, (const VkDescriptorUpdateTemplateEntry*)(forMarshaling->pDescriptorUpdateEntries + i));
         }
     }
     vkStream->write((VkDescriptorUpdateTemplateType*)&forMarshaling->templateType, sizeof(VkDescriptorUpdateTemplateType));
@@ -5144,17 +6552,23 @@
 
 void unmarshal_VkDescriptorUpdateTemplateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDescriptorUpdateTemplateCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkDescriptorUpdateTemplateCreateFlags*)&forUnmarshaling->flags, sizeof(VkDescriptorUpdateTemplateCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->descriptorUpdateEntryCount, sizeof(uint32_t));
     if (forUnmarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->descriptorUpdateEntryCount; ++i)
         {
-            unmarshal_VkDescriptorUpdateTemplateEntry(vkStream, (VkDescriptorUpdateTemplateEntry*)(forUnmarshaling->pDescriptorUpdateEntries + i));
+            unmarshal_VkDescriptorUpdateTemplateEntry(vkStream, rootType, (VkDescriptorUpdateTemplateEntry*)(forUnmarshaling->pDescriptorUpdateEntries + i));
         }
     }
     vkStream->read((VkDescriptorUpdateTemplateType*)&forUnmarshaling->templateType, sizeof(VkDescriptorUpdateTemplateType));
@@ -5170,8 +6584,10 @@
 
 void marshal_VkExternalMemoryProperties(
     VulkanStreamGuest* 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));
@@ -5179,8 +6595,10 @@
 
 void unmarshal_VkExternalMemoryProperties(
     VulkanStreamGuest* 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));
@@ -5188,46 +6606,76 @@
 
 void marshal_VkPhysicalDeviceExternalImageFormatInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalImageFormatInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
 }
 
 void unmarshal_VkPhysicalDeviceExternalImageFormatInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceExternalImageFormatInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
 }
 
 void marshal_VkExternalImageFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalImageFormatProperties* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkExternalMemoryProperties(vkStream, (VkExternalMemoryProperties*)(&forMarshaling->externalMemoryProperties));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    marshal_VkExternalMemoryProperties(vkStream, rootType, (VkExternalMemoryProperties*)(&forMarshaling->externalMemoryProperties));
 }
 
 void unmarshal_VkExternalImageFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExternalImageFormatProperties* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkExternalMemoryProperties(vkStream, (VkExternalMemoryProperties*)(&forUnmarshaling->externalMemoryProperties));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkExternalMemoryProperties(vkStream, rootType, (VkExternalMemoryProperties*)(&forUnmarshaling->externalMemoryProperties));
 }
 
 void marshal_VkPhysicalDeviceExternalBufferInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalBufferInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -5235,10 +6683,16 @@
 
 void unmarshal_VkPhysicalDeviceExternalBufferInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceExternalBufferInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -5246,28 +6700,46 @@
 
 void marshal_VkExternalBufferProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalBufferProperties* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkExternalMemoryProperties(vkStream, (VkExternalMemoryProperties*)(&forMarshaling->externalMemoryProperties));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    marshal_VkExternalMemoryProperties(vkStream, rootType, (VkExternalMemoryProperties*)(&forMarshaling->externalMemoryProperties));
 }
 
 void unmarshal_VkExternalBufferProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExternalBufferProperties* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkExternalMemoryProperties(vkStream, (VkExternalMemoryProperties*)(&forUnmarshaling->externalMemoryProperties));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkExternalMemoryProperties(vkStream, rootType, (VkExternalMemoryProperties*)(&forUnmarshaling->externalMemoryProperties));
 }
 
 void marshal_VkPhysicalDeviceIDProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceIDProperties* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint8_t*)forMarshaling->deviceUUID, VK_UUID_SIZE * sizeof(uint8_t));
     vkStream->write((uint8_t*)forMarshaling->driverUUID, VK_UUID_SIZE * sizeof(uint8_t));
     vkStream->write((uint8_t*)forMarshaling->deviceLUID, VK_LUID_SIZE * sizeof(uint8_t));
@@ -5277,10 +6749,16 @@
 
 void unmarshal_VkPhysicalDeviceIDProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceIDProperties* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint8_t*)forUnmarshaling->deviceUUID, VK_UUID_SIZE * sizeof(uint8_t));
     vkStream->read((uint8_t*)forUnmarshaling->driverUUID, VK_UUID_SIZE * sizeof(uint8_t));
     vkStream->read((uint8_t*)forUnmarshaling->deviceLUID, VK_LUID_SIZE * sizeof(uint8_t));
@@ -5290,82 +6768,136 @@
 
 void marshal_VkExternalMemoryImageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalMemoryImageCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkExternalMemoryHandleTypeFlags*)&forMarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlags));
 }
 
 void unmarshal_VkExternalMemoryImageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExternalMemoryImageCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkExternalMemoryHandleTypeFlags*)&forUnmarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlags));
 }
 
 void marshal_VkExternalMemoryBufferCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalMemoryBufferCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkExternalMemoryHandleTypeFlags*)&forMarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlags));
 }
 
 void unmarshal_VkExternalMemoryBufferCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExternalMemoryBufferCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkExternalMemoryHandleTypeFlags*)&forUnmarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlags));
 }
 
 void marshal_VkExportMemoryAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportMemoryAllocateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkExternalMemoryHandleTypeFlags*)&forMarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlags));
 }
 
 void unmarshal_VkExportMemoryAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExportMemoryAllocateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkExternalMemoryHandleTypeFlags*)&forUnmarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlags));
 }
 
 void marshal_VkPhysicalDeviceExternalFenceInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalFenceInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkExternalFenceHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalFenceHandleTypeFlagBits));
 }
 
 void unmarshal_VkPhysicalDeviceExternalFenceInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceExternalFenceInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkExternalFenceHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalFenceHandleTypeFlagBits));
 }
 
 void marshal_VkExternalFenceProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalFenceProperties* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -5373,10 +6905,16 @@
 
 void unmarshal_VkExternalFenceProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExternalFenceProperties* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -5384,64 +6922,106 @@
 
 void marshal_VkExportFenceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportFenceCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkExternalFenceHandleTypeFlags*)&forMarshaling->handleTypes, sizeof(VkExternalFenceHandleTypeFlags));
 }
 
 void unmarshal_VkExportFenceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExportFenceCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkExternalFenceHandleTypeFlags*)&forUnmarshaling->handleTypes, sizeof(VkExternalFenceHandleTypeFlags));
 }
 
 void marshal_VkExportSemaphoreCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportSemaphoreCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkExternalSemaphoreHandleTypeFlags*)&forMarshaling->handleTypes, sizeof(VkExternalSemaphoreHandleTypeFlags));
 }
 
 void unmarshal_VkExportSemaphoreCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExportSemaphoreCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkExternalSemaphoreHandleTypeFlags*)&forUnmarshaling->handleTypes, sizeof(VkExternalSemaphoreHandleTypeFlags));
 }
 
 void marshal_VkPhysicalDeviceExternalSemaphoreInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalSemaphoreInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkExternalSemaphoreHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
 }
 
 void unmarshal_VkPhysicalDeviceExternalSemaphoreInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceExternalSemaphoreInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
 }
 
 void marshal_VkExternalSemaphoreProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalSemaphoreProperties* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -5449,10 +7029,16 @@
 
 void unmarshal_VkExternalSemaphoreProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExternalSemaphoreProperties* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -5460,57 +7046,93 @@
 
 void marshal_VkPhysicalDeviceMaintenance3Properties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMaintenance3Properties* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->maxPerSetDescriptors, sizeof(uint32_t));
     vkStream->write((VkDeviceSize*)&forMarshaling->maxMemoryAllocationSize, sizeof(VkDeviceSize));
 }
 
 void unmarshal_VkPhysicalDeviceMaintenance3Properties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceMaintenance3Properties* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->maxPerSetDescriptors, sizeof(uint32_t));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->maxMemoryAllocationSize, sizeof(VkDeviceSize));
 }
 
 void marshal_VkDescriptorSetLayoutSupport(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutSupport* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDescriptorSetLayoutSupport* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->supported, sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceShaderDrawParametersFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderDrawParametersFeatures* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->shaderDrawParameters, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceShaderDrawParametersFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderDrawParametersFeatures* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderDrawParameters, sizeof(VkBool32));
 }
 
@@ -5518,10 +7140,16 @@
 #ifdef VK_VERSION_1_2
 void marshal_VkPhysicalDeviceVulkan11Features(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan11Features* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->storagePushConstant16, sizeof(VkBool32));
@@ -5538,10 +7166,16 @@
 
 void unmarshal_VkPhysicalDeviceVulkan11Features(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceVulkan11Features* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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->storagePushConstant16, sizeof(VkBool32));
@@ -5558,10 +7192,16 @@
 
 void marshal_VkPhysicalDeviceVulkan11Properties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan11Properties* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint8_t*)forMarshaling->deviceUUID, VK_UUID_SIZE * sizeof(uint8_t));
     vkStream->write((uint8_t*)forMarshaling->driverUUID, VK_UUID_SIZE * sizeof(uint8_t));
     vkStream->write((uint8_t*)forMarshaling->deviceLUID, VK_LUID_SIZE * sizeof(uint8_t));
@@ -5581,10 +7221,16 @@
 
 void unmarshal_VkPhysicalDeviceVulkan11Properties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceVulkan11Properties* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint8_t*)forUnmarshaling->deviceUUID, VK_UUID_SIZE * sizeof(uint8_t));
     vkStream->read((uint8_t*)forUnmarshaling->driverUUID, VK_UUID_SIZE * sizeof(uint8_t));
     vkStream->read((uint8_t*)forUnmarshaling->deviceLUID, VK_LUID_SIZE * sizeof(uint8_t));
@@ -5604,10 +7250,16 @@
 
 void marshal_VkPhysicalDeviceVulkan12Features(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan12Features* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->samplerMirrorClampToEdge, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->drawIndirectCount, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->storageBuffer8BitAccess, sizeof(VkBool32));
@@ -5659,10 +7311,16 @@
 
 void unmarshal_VkPhysicalDeviceVulkan12Features(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceVulkan12Features* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -5714,8 +7372,10 @@
 
 void marshal_VkConformanceVersion(
     VulkanStreamGuest* 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));
     vkStream->write((uint8_t*)&forMarshaling->subminor, sizeof(uint8_t));
@@ -5724,8 +7384,10 @@
 
 void unmarshal_VkConformanceVersion(
     VulkanStreamGuest* 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));
     vkStream->read((uint8_t*)&forUnmarshaling->subminor, sizeof(uint8_t));
@@ -5734,14 +7396,20 @@
 
 void marshal_VkPhysicalDeviceVulkan12Properties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan12Properties* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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, (VkConformanceVersion*)(&forMarshaling->conformanceVersion));
+    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));
@@ -5794,14 +7462,20 @@
 
 void unmarshal_VkPhysicalDeviceVulkan12Properties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceVulkan12Properties* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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, (VkConformanceVersion*)(&forUnmarshaling->conformanceVersion));
+    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));
@@ -5854,30 +7528,48 @@
 
 void marshal_VkImageFormatListCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageFormatListCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
 }
 
 void unmarshal_VkImageFormatListCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageFormatListCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->viewFormatCount, sizeof(uint32_t));
     vkStream->read((VkFormat*)forUnmarshaling->pViewFormats, forUnmarshaling->viewFormatCount * sizeof(const VkFormat));
 }
 
 void marshal_VkAttachmentDescription2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentDescription2* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((VkFormat*)&forMarshaling->format, sizeof(VkFormat));
     vkStream->write((VkSampleCountFlagBits*)&forMarshaling->samples, sizeof(VkSampleCountFlagBits));
@@ -5891,10 +7583,16 @@
 
 void unmarshal_VkAttachmentDescription2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAttachmentDescription2* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkAttachmentDescriptionFlags*)&forUnmarshaling->flags, sizeof(VkAttachmentDescriptionFlags));
     vkStream->read((VkFormat*)&forUnmarshaling->format, sizeof(VkFormat));
     vkStream->read((VkSampleCountFlagBits*)&forUnmarshaling->samples, sizeof(VkSampleCountFlagBits));
@@ -5908,10 +7606,16 @@
 
 void marshal_VkAttachmentReference2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentReference2* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->attachment, sizeof(uint32_t));
     vkStream->write((VkImageLayout*)&forMarshaling->layout, sizeof(VkImageLayout));
     vkStream->write((VkImageAspectFlags*)&forMarshaling->aspectMask, sizeof(VkImageAspectFlags));
@@ -5919,10 +7623,16 @@
 
 void unmarshal_VkAttachmentReference2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAttachmentReference2* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->attachment, sizeof(uint32_t));
     vkStream->read((VkImageLayout*)&forUnmarshaling->layout, sizeof(VkImageLayout));
     vkStream->read((VkImageAspectFlags*)&forUnmarshaling->aspectMask, sizeof(VkImageAspectFlags));
@@ -5930,10 +7640,16 @@
 
 void marshal_VkSubpassDescription2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassDescription2* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->viewMask, sizeof(uint32_t));
@@ -5942,7 +7658,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->inputAttachmentCount; ++i)
         {
-            marshal_VkAttachmentReference2(vkStream, (const VkAttachmentReference2*)(forMarshaling->pInputAttachments + i));
+            marshal_VkAttachmentReference2(vkStream, rootType, (const VkAttachmentReference2*)(forMarshaling->pInputAttachments + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->colorAttachmentCount, sizeof(uint32_t));
@@ -5950,7 +7666,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->colorAttachmentCount; ++i)
         {
-            marshal_VkAttachmentReference2(vkStream, (const VkAttachmentReference2*)(forMarshaling->pColorAttachments + i));
+            marshal_VkAttachmentReference2(vkStream, rootType, (const VkAttachmentReference2*)(forMarshaling->pColorAttachments + i));
         }
     }
     // WARNING PTR CHECK
@@ -5962,7 +7678,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forMarshaling->colorAttachmentCount; ++i)
             {
-                marshal_VkAttachmentReference2(vkStream, (const VkAttachmentReference2*)(forMarshaling->pResolveAttachments + i));
+                marshal_VkAttachmentReference2(vkStream, rootType, (const VkAttachmentReference2*)(forMarshaling->pResolveAttachments + i));
             }
         }
     }
@@ -5971,7 +7687,7 @@
     vkStream->putBe64(cgen_var_1);
     if (forMarshaling->pDepthStencilAttachment)
     {
-        marshal_VkAttachmentReference2(vkStream, (const VkAttachmentReference2*)(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));
@@ -5979,10 +7695,16 @@
 
 void unmarshal_VkSubpassDescription2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSubpassDescription2* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkSubpassDescriptionFlags*)&forUnmarshaling->flags, sizeof(VkSubpassDescriptionFlags));
     vkStream->read((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
     vkStream->read((uint32_t*)&forUnmarshaling->viewMask, sizeof(uint32_t));
@@ -5991,7 +7713,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->inputAttachmentCount; ++i)
         {
-            unmarshal_VkAttachmentReference2(vkStream, (VkAttachmentReference2*)(forUnmarshaling->pInputAttachments + i));
+            unmarshal_VkAttachmentReference2(vkStream, rootType, (VkAttachmentReference2*)(forUnmarshaling->pInputAttachments + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->colorAttachmentCount, sizeof(uint32_t));
@@ -5999,7 +7721,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->colorAttachmentCount; ++i)
         {
-            unmarshal_VkAttachmentReference2(vkStream, (VkAttachmentReference2*)(forUnmarshaling->pColorAttachments + i));
+            unmarshal_VkAttachmentReference2(vkStream, rootType, (VkAttachmentReference2*)(forUnmarshaling->pColorAttachments + i));
         }
     }
     // WARNING PTR CHECK
@@ -6015,7 +7737,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->colorAttachmentCount; ++i)
             {
-                unmarshal_VkAttachmentReference2(vkStream, (VkAttachmentReference2*)(forUnmarshaling->pResolveAttachments + i));
+                unmarshal_VkAttachmentReference2(vkStream, rootType, (VkAttachmentReference2*)(forUnmarshaling->pResolveAttachments + i));
             }
         }
     }
@@ -6028,7 +7750,7 @@
         {
             fprintf(stderr, "fatal: forUnmarshaling->pDepthStencilAttachment inconsistent between guest and host\n");
         }
-        unmarshal_VkAttachmentReference2(vkStream, (VkAttachmentReference2*)(forUnmarshaling->pDepthStencilAttachment));
+        unmarshal_VkAttachmentReference2(vkStream, rootType, (VkAttachmentReference2*)(forUnmarshaling->pDepthStencilAttachment));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->preserveAttachmentCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)forUnmarshaling->pPreserveAttachments, forUnmarshaling->preserveAttachmentCount * sizeof(const uint32_t));
@@ -6036,10 +7758,16 @@
 
 void marshal_VkSubpassDependency2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassDependency2* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -6052,10 +7780,16 @@
 
 void unmarshal_VkSubpassDependency2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSubpassDependency2* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -6068,17 +7802,23 @@
 
 void marshal_VkRenderPassCreateInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassCreateInfo2* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->attachmentCount, sizeof(uint32_t));
     if (forMarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->attachmentCount; ++i)
         {
-            marshal_VkAttachmentDescription2(vkStream, (const VkAttachmentDescription2*)(forMarshaling->pAttachments + i));
+            marshal_VkAttachmentDescription2(vkStream, rootType, (const VkAttachmentDescription2*)(forMarshaling->pAttachments + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->subpassCount, sizeof(uint32_t));
@@ -6086,7 +7826,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->subpassCount; ++i)
         {
-            marshal_VkSubpassDescription2(vkStream, (const VkSubpassDescription2*)(forMarshaling->pSubpasses + i));
+            marshal_VkSubpassDescription2(vkStream, rootType, (const VkSubpassDescription2*)(forMarshaling->pSubpasses + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->dependencyCount, sizeof(uint32_t));
@@ -6094,7 +7834,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->dependencyCount; ++i)
         {
-            marshal_VkSubpassDependency2(vkStream, (const VkSubpassDependency2*)(forMarshaling->pDependencies + i));
+            marshal_VkSubpassDependency2(vkStream, rootType, (const VkSubpassDependency2*)(forMarshaling->pDependencies + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->correlatedViewMaskCount, sizeof(uint32_t));
@@ -6103,17 +7843,23 @@
 
 void unmarshal_VkRenderPassCreateInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRenderPassCreateInfo2* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkRenderPassCreateFlags*)&forUnmarshaling->flags, sizeof(VkRenderPassCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->attachmentCount, sizeof(uint32_t));
     if (forUnmarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->attachmentCount; ++i)
         {
-            unmarshal_VkAttachmentDescription2(vkStream, (VkAttachmentDescription2*)(forUnmarshaling->pAttachments + i));
+            unmarshal_VkAttachmentDescription2(vkStream, rootType, (VkAttachmentDescription2*)(forUnmarshaling->pAttachments + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->subpassCount, sizeof(uint32_t));
@@ -6121,7 +7867,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->subpassCount; ++i)
         {
-            unmarshal_VkSubpassDescription2(vkStream, (VkSubpassDescription2*)(forUnmarshaling->pSubpasses + i));
+            unmarshal_VkSubpassDescription2(vkStream, rootType, (VkSubpassDescription2*)(forUnmarshaling->pSubpasses + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->dependencyCount, sizeof(uint32_t));
@@ -6129,7 +7875,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->dependencyCount; ++i)
         {
-            unmarshal_VkSubpassDependency2(vkStream, (VkSubpassDependency2*)(forUnmarshaling->pDependencies + i));
+            unmarshal_VkSubpassDependency2(vkStream, rootType, (VkSubpassDependency2*)(forUnmarshaling->pDependencies + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->correlatedViewMaskCount, sizeof(uint32_t));
@@ -6138,44 +7884,74 @@
 
 void marshal_VkSubpassBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassBeginInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSubpassBeginInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkSubpassContents*)&forUnmarshaling->contents, sizeof(VkSubpassContents));
 }
 
 void marshal_VkSubpassEndInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassEndInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
 }
 
 void unmarshal_VkSubpassEndInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSubpassEndInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
 }
 
 void marshal_VkPhysicalDevice8BitStorageFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevice8BitStorageFeatures* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->storageBuffer8BitAccess, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->uniformAndStorageBuffer8BitAccess, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->storagePushConstant8, sizeof(VkBool32));
@@ -6183,10 +7959,16 @@
 
 void unmarshal_VkPhysicalDevice8BitStorageFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDevice8BitStorageFeatures* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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->storagePushConstant8, sizeof(VkBool32));
@@ -6194,74 +7976,116 @@
 
 void marshal_VkPhysicalDeviceDriverProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDriverProperties* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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, (VkConformanceVersion*)(&forMarshaling->conformanceVersion));
+    marshal_VkConformanceVersion(vkStream, rootType, (VkConformanceVersion*)(&forMarshaling->conformanceVersion));
 }
 
 void unmarshal_VkPhysicalDeviceDriverProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceDriverProperties* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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, (VkConformanceVersion*)(&forUnmarshaling->conformanceVersion));
+    unmarshal_VkConformanceVersion(vkStream, rootType, (VkConformanceVersion*)(&forUnmarshaling->conformanceVersion));
 }
 
 void marshal_VkPhysicalDeviceShaderAtomicInt64Features(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderAtomicInt64Features* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->shaderBufferInt64Atomics, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->shaderSharedInt64Atomics, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceShaderAtomicInt64Features(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderAtomicInt64Features* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderBufferInt64Atomics, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderSharedInt64Atomics, sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceShaderFloat16Int8Features(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderFloat16Int8Features* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->shaderFloat16, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->shaderInt8, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceShaderFloat16Int8Features(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderFloat16Int8Features* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderFloat16, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderInt8, sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceFloatControlsProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFloatControlsProperties* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -6283,10 +8107,16 @@
 
 void unmarshal_VkPhysicalDeviceFloatControlsProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceFloatControlsProperties* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -6308,10 +8138,16 @@
 
 void marshal_VkDescriptorSetLayoutBindingFlagsCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutBindingFlagsCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->bindingCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pBindingFlags;
@@ -6324,10 +8160,16 @@
 
 void unmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDescriptorSetLayoutBindingFlagsCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->bindingCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     const VkDescriptorBindingFlags* check_pBindingFlags;
@@ -6344,10 +8186,16 @@
 
 void marshal_VkPhysicalDeviceDescriptorIndexingFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDescriptorIndexingFeatures* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -6372,10 +8220,16 @@
 
 void unmarshal_VkPhysicalDeviceDescriptorIndexingFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceDescriptorIndexingFeatures* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -6400,10 +8254,16 @@
 
 void marshal_VkPhysicalDeviceDescriptorIndexingProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDescriptorIndexingProperties* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -6431,10 +8291,16 @@
 
 void unmarshal_VkPhysicalDeviceDescriptorIndexingProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceDescriptorIndexingProperties* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -6462,48 +8328,78 @@
 
 void marshal_VkDescriptorSetVariableDescriptorCountAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetVariableDescriptorCountAllocateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
 }
 
 void unmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDescriptorSetVariableDescriptorCountAllocateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->descriptorSetCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)forUnmarshaling->pDescriptorCounts, forUnmarshaling->descriptorSetCount * sizeof(const uint32_t));
 }
 
 void marshal_VkDescriptorSetVariableDescriptorCountLayoutSupport(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetVariableDescriptorCountLayoutSupport* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->maxVariableDescriptorCount, sizeof(uint32_t));
 }
 
 void unmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupport(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDescriptorSetVariableDescriptorCountLayoutSupport* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->maxVariableDescriptorCount, sizeof(uint32_t));
 }
 
 void marshal_VkSubpassDescriptionDepthStencilResolve(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassDescriptionDepthStencilResolve* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
     // WARNING PTR CHECK
@@ -6511,16 +8407,22 @@
     vkStream->putBe64(cgen_var_0);
     if (forMarshaling->pDepthStencilResolveAttachment)
     {
-        marshal_VkAttachmentReference2(vkStream, (const VkAttachmentReference2*)(forMarshaling->pDepthStencilResolveAttachment));
+        marshal_VkAttachmentReference2(vkStream, rootType, (const VkAttachmentReference2*)(forMarshaling->pDepthStencilResolveAttachment));
     }
 }
 
 void unmarshal_VkSubpassDescriptionDepthStencilResolve(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSubpassDescriptionDepthStencilResolve* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkResolveModeFlagBits*)&forUnmarshaling->depthResolveMode, sizeof(VkResolveModeFlagBits));
     vkStream->read((VkResolveModeFlagBits*)&forUnmarshaling->stencilResolveMode, sizeof(VkResolveModeFlagBits));
     // WARNING PTR CHECK
@@ -6532,16 +8434,22 @@
         {
             fprintf(stderr, "fatal: forUnmarshaling->pDepthStencilResolveAttachment inconsistent between guest and host\n");
         }
-        unmarshal_VkAttachmentReference2(vkStream, (VkAttachmentReference2*)(forUnmarshaling->pDepthStencilResolveAttachment));
+        unmarshal_VkAttachmentReference2(vkStream, rootType, (VkAttachmentReference2*)(forUnmarshaling->pDepthStencilResolveAttachment));
     }
 }
 
 void marshal_VkPhysicalDeviceDepthStencilResolveProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDepthStencilResolveProperties* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((VkBool32*)&forMarshaling->independentResolveNone, sizeof(VkBool32));
@@ -6550,10 +8458,16 @@
 
 void unmarshal_VkPhysicalDeviceDepthStencilResolveProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceDepthStencilResolveProperties* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkResolveModeFlags*)&forUnmarshaling->supportedDepthResolveModes, sizeof(VkResolveModeFlags));
     vkStream->read((VkResolveModeFlags*)&forUnmarshaling->supportedStencilResolveModes, sizeof(VkResolveModeFlags));
     vkStream->read((VkBool32*)&forUnmarshaling->independentResolveNone, sizeof(VkBool32));
@@ -6562,84 +8476,138 @@
 
 void marshal_VkPhysicalDeviceScalarBlockLayoutFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceScalarBlockLayoutFeatures* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->scalarBlockLayout, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceScalarBlockLayoutFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceScalarBlockLayoutFeatures* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->scalarBlockLayout, sizeof(VkBool32));
 }
 
 void marshal_VkImageStencilUsageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageStencilUsageCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageStencilUsageCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkImageUsageFlags*)&forUnmarshaling->stencilUsage, sizeof(VkImageUsageFlags));
 }
 
 void marshal_VkSamplerReductionModeCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSamplerReductionModeCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkSamplerReductionMode*)&forMarshaling->reductionMode, sizeof(VkSamplerReductionMode));
 }
 
 void unmarshal_VkSamplerReductionModeCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSamplerReductionModeCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkSamplerReductionMode*)&forUnmarshaling->reductionMode, sizeof(VkSamplerReductionMode));
 }
 
 void marshal_VkPhysicalDeviceSamplerFilterMinmaxProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSamplerFilterMinmaxProperties* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->filterMinmaxImageComponentMapping, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceSamplerFilterMinmaxProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceSamplerFilterMinmaxProperties* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->filterMinmaxSingleComponentFormats, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->filterMinmaxImageComponentMapping, sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceVulkanMemoryModelFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkanMemoryModelFeatures* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -6647,10 +8615,16 @@
 
 void unmarshal_VkPhysicalDeviceVulkanMemoryModelFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceVulkanMemoryModelFeatures* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -6658,28 +8632,46 @@
 
 void marshal_VkPhysicalDeviceImagelessFramebufferFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceImagelessFramebufferFeatures* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->imagelessFramebuffer, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceImagelessFramebufferFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceImagelessFramebufferFeatures* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->imagelessFramebuffer, sizeof(VkBool32));
 }
 
 void marshal_VkFramebufferAttachmentImageInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFramebufferAttachmentImageInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkImageCreateFlags*)&forMarshaling->flags, sizeof(VkImageCreateFlags));
     vkStream->write((VkImageUsageFlags*)&forMarshaling->usage, sizeof(VkImageUsageFlags));
     vkStream->write((uint32_t*)&forMarshaling->width, sizeof(uint32_t));
@@ -6691,10 +8683,16 @@
 
 void unmarshal_VkFramebufferAttachmentImageInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkFramebufferAttachmentImageInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkImageCreateFlags*)&forUnmarshaling->flags, sizeof(VkImageCreateFlags));
     vkStream->read((VkImageUsageFlags*)&forUnmarshaling->usage, sizeof(VkImageUsageFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->width, sizeof(uint32_t));
@@ -6706,42 +8704,60 @@
 
 void marshal_VkFramebufferAttachmentsCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFramebufferAttachmentsCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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, (const VkFramebufferAttachmentImageInfo*)(forMarshaling->pAttachmentImageInfos + i));
+            marshal_VkFramebufferAttachmentImageInfo(vkStream, rootType, (const VkFramebufferAttachmentImageInfo*)(forMarshaling->pAttachmentImageInfos + i));
         }
     }
 }
 
 void unmarshal_VkFramebufferAttachmentsCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkFramebufferAttachmentsCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->attachmentImageInfoCount, sizeof(uint32_t));
     if (forUnmarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->attachmentImageInfoCount; ++i)
         {
-            unmarshal_VkFramebufferAttachmentImageInfo(vkStream, (VkFramebufferAttachmentImageInfo*)(forUnmarshaling->pAttachmentImageInfos + i));
+            unmarshal_VkFramebufferAttachmentImageInfo(vkStream, rootType, (VkFramebufferAttachmentImageInfo*)(forUnmarshaling->pAttachmentImageInfos + i));
         }
     }
 }
 
 void marshal_VkRenderPassAttachmentBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassAttachmentBeginInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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)
     {
@@ -6754,10 +8770,16 @@
 
 void unmarshal_VkRenderPassAttachmentBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRenderPassAttachmentBeginInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->attachmentCount, sizeof(uint32_t));
     if (forUnmarshaling->attachmentCount)
     {
@@ -6770,176 +8792,290 @@
 
 void marshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceUniformBufferStandardLayoutFeatures* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->uniformBufferStandardLayout, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceUniformBufferStandardLayoutFeatures* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->uniformBufferStandardLayout, sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->shaderSubgroupExtendedTypes, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderSubgroupExtendedTypes, sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->separateDepthStencilLayouts, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->separateDepthStencilLayouts, sizeof(VkBool32));
 }
 
 void marshal_VkAttachmentReferenceStencilLayout(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentReferenceStencilLayout* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkImageLayout*)&forMarshaling->stencilLayout, sizeof(VkImageLayout));
 }
 
 void unmarshal_VkAttachmentReferenceStencilLayout(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAttachmentReferenceStencilLayout* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkImageLayout*)&forUnmarshaling->stencilLayout, sizeof(VkImageLayout));
 }
 
 void marshal_VkAttachmentDescriptionStencilLayout(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentDescriptionStencilLayout* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkImageLayout*)&forMarshaling->stencilInitialLayout, sizeof(VkImageLayout));
     vkStream->write((VkImageLayout*)&forMarshaling->stencilFinalLayout, sizeof(VkImageLayout));
 }
 
 void unmarshal_VkAttachmentDescriptionStencilLayout(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAttachmentDescriptionStencilLayout* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkImageLayout*)&forUnmarshaling->stencilInitialLayout, sizeof(VkImageLayout));
     vkStream->read((VkImageLayout*)&forUnmarshaling->stencilFinalLayout, sizeof(VkImageLayout));
 }
 
 void marshal_VkPhysicalDeviceHostQueryResetFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceHostQueryResetFeatures* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->hostQueryReset, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceHostQueryResetFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceHostQueryResetFeatures* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->hostQueryReset, sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceTimelineSemaphoreFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTimelineSemaphoreFeatures* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->timelineSemaphore, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceTimelineSemaphoreFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceTimelineSemaphoreFeatures* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->timelineSemaphore, sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceTimelineSemaphoreProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTimelineSemaphoreProperties* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
 }
 
 void unmarshal_VkPhysicalDeviceTimelineSemaphoreProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceTimelineSemaphoreProperties* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint64_t*)&forUnmarshaling->maxTimelineSemaphoreValueDifference, sizeof(uint64_t));
 }
 
 void marshal_VkSemaphoreTypeCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSemaphoreTypeCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkSemaphoreType*)&forMarshaling->semaphoreType, sizeof(VkSemaphoreType));
     vkStream->write((uint64_t*)&forMarshaling->initialValue, sizeof(uint64_t));
 }
 
 void unmarshal_VkSemaphoreTypeCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSemaphoreTypeCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkSemaphoreType*)&forUnmarshaling->semaphoreType, sizeof(VkSemaphoreType));
     vkStream->read((uint64_t*)&forUnmarshaling->initialValue, sizeof(uint64_t));
 }
 
 void marshal_VkTimelineSemaphoreSubmitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkTimelineSemaphoreSubmitInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->waitSemaphoreValueCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pWaitSemaphoreValues;
@@ -6960,10 +9096,16 @@
 
 void unmarshal_VkTimelineSemaphoreSubmitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkTimelineSemaphoreSubmitInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->waitSemaphoreValueCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     const uint64_t* check_pWaitSemaphoreValues;
@@ -6992,10 +9134,16 @@
 
 void marshal_VkSemaphoreWaitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSemaphoreWaitInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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)
@@ -7010,10 +9158,16 @@
 
 void unmarshal_VkSemaphoreWaitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSemaphoreWaitInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkSemaphoreWaitFlags*)&forUnmarshaling->flags, sizeof(VkSemaphoreWaitFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->semaphoreCount, sizeof(uint32_t));
     if (forUnmarshaling->semaphoreCount)
@@ -7028,10 +9182,16 @@
 
 void marshal_VkSemaphoreSignalInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSemaphoreSignalInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -7040,10 +9200,16 @@
 
 void unmarshal_VkSemaphoreSignalInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSemaphoreSignalInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkSemaphore(&cgen_var_0, (VkSemaphore*)&forUnmarshaling->semaphore, 1);
@@ -7052,10 +9218,16 @@
 
 void marshal_VkPhysicalDeviceBufferDeviceAddressFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceBufferDeviceAddressFeatures* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->bufferDeviceAddress, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->bufferDeviceAddressCaptureReplay, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->bufferDeviceAddressMultiDevice, sizeof(VkBool32));
@@ -7063,10 +9235,16 @@
 
 void unmarshal_VkPhysicalDeviceBufferDeviceAddressFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceBufferDeviceAddressFeatures* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->bufferDeviceAddress, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->bufferDeviceAddressCaptureReplay, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->bufferDeviceAddressMultiDevice, sizeof(VkBool32));
@@ -7074,10 +9252,16 @@
 
 void marshal_VkBufferDeviceAddressInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferDeviceAddressInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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_VkBuffer_u64(&forMarshaling->buffer, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -7085,10 +9269,16 @@
 
 void unmarshal_VkBufferDeviceAddressInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBufferDeviceAddressInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0, (VkBuffer*)&forUnmarshaling->buffer, 1);
@@ -7096,46 +9286,76 @@
 
 void marshal_VkBufferOpaqueCaptureAddressCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferOpaqueCaptureAddressCreateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint64_t*)&forMarshaling->opaqueCaptureAddress, sizeof(uint64_t));
 }
 
 void unmarshal_VkBufferOpaqueCaptureAddressCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBufferOpaqueCaptureAddressCreateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint64_t*)&forUnmarshaling->opaqueCaptureAddress, sizeof(uint64_t));
 }
 
 void marshal_VkMemoryOpaqueCaptureAddressAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryOpaqueCaptureAddressAllocateInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint64_t*)&forMarshaling->opaqueCaptureAddress, sizeof(uint64_t));
 }
 
 void unmarshal_VkMemoryOpaqueCaptureAddressAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryOpaqueCaptureAddressAllocateInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint64_t*)&forUnmarshaling->opaqueCaptureAddress, sizeof(uint64_t));
 }
 
 void marshal_VkDeviceMemoryOpaqueCaptureAddressInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceMemoryOpaqueCaptureAddressInfo* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -7143,10 +9363,16 @@
 
 void unmarshal_VkDeviceMemoryOpaqueCaptureAddressInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceMemoryOpaqueCaptureAddressInfo* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(&cgen_var_0, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
@@ -7156,13 +9382,15 @@
 #ifdef VK_KHR_surface
 void marshal_VkSurfaceCapabilitiesKHR(
     VulkanStreamGuest* 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));
-    marshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->currentExtent));
-    marshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->minImageExtent));
-    marshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->maxImageExtent));
+    marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->currentExtent));
+    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));
@@ -7172,13 +9400,15 @@
 
 void unmarshal_VkSurfaceCapabilitiesKHR(
     VulkanStreamGuest* 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));
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->currentExtent));
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->minImageExtent));
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->maxImageExtent));
+    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->currentExtent));
+    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));
@@ -7188,16 +9418,20 @@
 
 void marshal_VkSurfaceFormatKHR(
     VulkanStreamGuest* 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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSurfaceFormatKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkFormat*)&forUnmarshaling->format, sizeof(VkFormat));
     vkStream->read((VkColorSpaceKHR*)&forUnmarshaling->colorSpace, sizeof(VkColorSpaceKHR));
 }
@@ -7206,10 +9440,16 @@
 #ifdef VK_KHR_swapchain
 void marshal_VkSwapchainCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSwapchainCreateInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkSwapchainCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkSwapchainCreateFlagsKHR));
     uint64_t cgen_var_0;
     vkStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(&forMarshaling->surface, &cgen_var_0, 1);
@@ -7217,7 +9457,7 @@
     vkStream->write((uint32_t*)&forMarshaling->minImageCount, sizeof(uint32_t));
     vkStream->write((VkFormat*)&forMarshaling->imageFormat, sizeof(VkFormat));
     vkStream->write((VkColorSpaceKHR*)&forMarshaling->imageColorSpace, sizeof(VkColorSpaceKHR));
-    marshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->imageExtent));
+    marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->imageExtent));
     vkStream->write((uint32_t*)&forMarshaling->imageArrayLayers, sizeof(uint32_t));
     vkStream->write((VkImageUsageFlags*)&forMarshaling->imageUsage, sizeof(VkImageUsageFlags));
     vkStream->write((VkSharingMode*)&forMarshaling->imageSharingMode, sizeof(VkSharingMode));
@@ -7240,10 +9480,16 @@
 
 void unmarshal_VkSwapchainCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSwapchainCreateInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkSwapchainCreateFlagsKHR*)&forUnmarshaling->flags, sizeof(VkSwapchainCreateFlagsKHR));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
@@ -7251,7 +9497,7 @@
     vkStream->read((uint32_t*)&forUnmarshaling->minImageCount, sizeof(uint32_t));
     vkStream->read((VkFormat*)&forUnmarshaling->imageFormat, sizeof(VkFormat));
     vkStream->read((VkColorSpaceKHR*)&forUnmarshaling->imageColorSpace, sizeof(VkColorSpaceKHR));
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->imageExtent));
+    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->imageExtent));
     vkStream->read((uint32_t*)&forUnmarshaling->imageArrayLayers, sizeof(uint32_t));
     vkStream->read((VkImageUsageFlags*)&forUnmarshaling->imageUsage, sizeof(VkImageUsageFlags));
     vkStream->read((VkSharingMode*)&forUnmarshaling->imageSharingMode, sizeof(VkSharingMode));
@@ -7278,10 +9524,16 @@
 
 void marshal_VkPresentInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPresentInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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)
     {
@@ -7310,10 +9562,16 @@
 
 void unmarshal_VkPresentInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPresentInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->waitSemaphoreCount, sizeof(uint32_t));
     if (forUnmarshaling->waitSemaphoreCount)
     {
@@ -7346,10 +9604,16 @@
 
 void marshal_VkImageSwapchainCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageSwapchainCreateInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     uint64_t cgen_var_0;
     vkStream->handleMapping()->mapHandles_VkSwapchainKHR_u64(&forMarshaling->swapchain, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -7357,10 +9621,16 @@
 
 void unmarshal_VkImageSwapchainCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageSwapchainCreateInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkSwapchainKHR(&cgen_var_0, (VkSwapchainKHR*)&forUnmarshaling->swapchain, 1);
@@ -7368,10 +9638,16 @@
 
 void marshal_VkBindImageMemorySwapchainInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindImageMemorySwapchainInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     uint64_t cgen_var_0;
     vkStream->handleMapping()->mapHandles_VkSwapchainKHR_u64(&forMarshaling->swapchain, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -7380,10 +9656,16 @@
 
 void unmarshal_VkBindImageMemorySwapchainInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBindImageMemorySwapchainInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkSwapchainKHR(&cgen_var_0, (VkSwapchainKHR*)&forUnmarshaling->swapchain, 1);
@@ -7392,10 +9674,16 @@
 
 void marshal_VkAcquireNextImageInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAcquireNextImageInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     uint64_t cgen_var_0;
     vkStream->handleMapping()->mapHandles_VkSwapchainKHR_u64(&forMarshaling->swapchain, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -7411,10 +9699,16 @@
 
 void unmarshal_VkAcquireNextImageInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAcquireNextImageInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkSwapchainKHR(&cgen_var_0, (VkSwapchainKHR*)&forUnmarshaling->swapchain, 1);
@@ -7430,30 +9724,48 @@
 
 void marshal_VkDeviceGroupPresentCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupPresentCapabilitiesKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)forMarshaling->presentMask, VK_MAX_DEVICE_GROUP_SIZE * sizeof(uint32_t));
     vkStream->write((VkDeviceGroupPresentModeFlagsKHR*)&forMarshaling->modes, sizeof(VkDeviceGroupPresentModeFlagsKHR));
 }
 
 void unmarshal_VkDeviceGroupPresentCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceGroupPresentCapabilitiesKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)forUnmarshaling->presentMask, VK_MAX_DEVICE_GROUP_SIZE * sizeof(uint32_t));
     vkStream->read((VkDeviceGroupPresentModeFlagsKHR*)&forUnmarshaling->modes, sizeof(VkDeviceGroupPresentModeFlagsKHR));
 }
 
 void marshal_VkDeviceGroupPresentInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupPresentInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -7461,10 +9773,16 @@
 
 void unmarshal_VkDeviceGroupPresentInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceGroupPresentInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->swapchainCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)forUnmarshaling->pDeviceMasks, forUnmarshaling->swapchainCount * sizeof(const uint32_t));
     vkStream->read((VkDeviceGroupPresentModeFlagBitsKHR*)&forUnmarshaling->mode, sizeof(VkDeviceGroupPresentModeFlagBitsKHR));
@@ -7472,19 +9790,31 @@
 
 void marshal_VkDeviceGroupSwapchainCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupSwapchainCreateInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkDeviceGroupPresentModeFlagsKHR*)&forMarshaling->modes, sizeof(VkDeviceGroupPresentModeFlagsKHR));
 }
 
 void unmarshal_VkDeviceGroupSwapchainCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceGroupSwapchainCreateInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkDeviceGroupPresentModeFlagsKHR*)&forUnmarshaling->modes, sizeof(VkDeviceGroupPresentModeFlagsKHR));
 }
 
@@ -7492,94 +9822,120 @@
 #ifdef VK_KHR_display
 void marshal_VkDisplayModeParametersKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayModeParametersKHR* forMarshaling)
 {
-    marshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->visibleRegion));
+    (void)rootType;
+    marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->visibleRegion));
     vkStream->write((uint32_t*)&forMarshaling->refreshRate, sizeof(uint32_t));
 }
 
 void unmarshal_VkDisplayModeParametersKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayModeParametersKHR* forUnmarshaling)
 {
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->visibleRegion));
+    (void)rootType;
+    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->visibleRegion));
     vkStream->read((uint32_t*)&forUnmarshaling->refreshRate, sizeof(uint32_t));
 }
 
 void marshal_VkDisplayModeCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayModeCreateInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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, (VkDisplayModeParametersKHR*)(&forMarshaling->parameters));
+    marshal_VkDisplayModeParametersKHR(vkStream, rootType, (VkDisplayModeParametersKHR*)(&forMarshaling->parameters));
 }
 
 void unmarshal_VkDisplayModeCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayModeCreateInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkDisplayModeCreateFlagsKHR*)&forUnmarshaling->flags, sizeof(VkDisplayModeCreateFlagsKHR));
-    unmarshal_VkDisplayModeParametersKHR(vkStream, (VkDisplayModeParametersKHR*)(&forUnmarshaling->parameters));
+    unmarshal_VkDisplayModeParametersKHR(vkStream, rootType, (VkDisplayModeParametersKHR*)(&forUnmarshaling->parameters));
 }
 
 void marshal_VkDisplayModePropertiesKHR(
     VulkanStreamGuest* 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->write((uint64_t*)&cgen_var_0, 1 * 8);
-    marshal_VkDisplayModeParametersKHR(vkStream, (VkDisplayModeParametersKHR*)(&forMarshaling->parameters));
+    marshal_VkDisplayModeParametersKHR(vkStream, rootType, (VkDisplayModeParametersKHR*)(&forMarshaling->parameters));
 }
 
 void unmarshal_VkDisplayModePropertiesKHR(
     VulkanStreamGuest* 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, (VkDisplayModeParametersKHR*)(&forUnmarshaling->parameters));
+    unmarshal_VkDisplayModeParametersKHR(vkStream, rootType, (VkDisplayModeParametersKHR*)(&forUnmarshaling->parameters));
 }
 
 void marshal_VkDisplayPlaneCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPlaneCapabilitiesKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkDisplayPlaneAlphaFlagsKHR*)&forMarshaling->supportedAlpha, sizeof(VkDisplayPlaneAlphaFlagsKHR));
-    marshal_VkOffset2D(vkStream, (VkOffset2D*)(&forMarshaling->minSrcPosition));
-    marshal_VkOffset2D(vkStream, (VkOffset2D*)(&forMarshaling->maxSrcPosition));
-    marshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->minSrcExtent));
-    marshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->maxSrcExtent));
-    marshal_VkOffset2D(vkStream, (VkOffset2D*)(&forMarshaling->minDstPosition));
-    marshal_VkOffset2D(vkStream, (VkOffset2D*)(&forMarshaling->maxDstPosition));
-    marshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->minDstExtent));
-    marshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->maxDstExtent));
+    marshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forMarshaling->minSrcPosition));
+    marshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forMarshaling->maxSrcPosition));
+    marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->minSrcExtent));
+    marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->maxSrcExtent));
+    marshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forMarshaling->minDstPosition));
+    marshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forMarshaling->maxDstPosition));
+    marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->minDstExtent));
+    marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->maxDstExtent));
 }
 
 void unmarshal_VkDisplayPlaneCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayPlaneCapabilitiesKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkDisplayPlaneAlphaFlagsKHR*)&forUnmarshaling->supportedAlpha, sizeof(VkDisplayPlaneAlphaFlagsKHR));
-    unmarshal_VkOffset2D(vkStream, (VkOffset2D*)(&forUnmarshaling->minSrcPosition));
-    unmarshal_VkOffset2D(vkStream, (VkOffset2D*)(&forUnmarshaling->maxSrcPosition));
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->minSrcExtent));
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->maxSrcExtent));
-    unmarshal_VkOffset2D(vkStream, (VkOffset2D*)(&forUnmarshaling->minDstPosition));
-    unmarshal_VkOffset2D(vkStream, (VkOffset2D*)(&forUnmarshaling->maxDstPosition));
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->minDstExtent));
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->maxDstExtent));
+    unmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forUnmarshaling->minSrcPosition));
+    unmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forUnmarshaling->maxSrcPosition));
+    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->minSrcExtent));
+    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxSrcExtent));
+    unmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forUnmarshaling->minDstPosition));
+    unmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forUnmarshaling->maxDstPosition));
+    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->minDstExtent));
+    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxDstExtent));
 }
 
 void marshal_VkDisplayPlanePropertiesKHR(
     VulkanStreamGuest* 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->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -7588,8 +9944,10 @@
 
 void unmarshal_VkDisplayPlanePropertiesKHR(
     VulkanStreamGuest* 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);
@@ -7598,14 +9956,16 @@
 
 void marshal_VkDisplayPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPropertiesKHR* forMarshaling)
 {
+    (void)rootType;
     uint64_t cgen_var_0;
     vkStream->handleMapping()->mapHandles_VkDisplayKHR_u64(&forMarshaling->display, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->putString(forMarshaling->displayName);
-    marshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->physicalDimensions));
-    marshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->physicalResolution));
+    marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->physicalDimensions));
+    marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->physicalResolution));
     vkStream->write((VkSurfaceTransformFlagsKHR*)&forMarshaling->supportedTransforms, sizeof(VkSurfaceTransformFlagsKHR));
     vkStream->write((VkBool32*)&forMarshaling->planeReorderPossible, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->persistentContent, sizeof(VkBool32));
@@ -7613,14 +9973,16 @@
 
 void unmarshal_VkDisplayPropertiesKHR(
     VulkanStreamGuest* 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->loadStringInPlace((char**)&forUnmarshaling->displayName);
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->physicalDimensions));
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->physicalResolution));
+    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->physicalDimensions));
+    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->physicalResolution));
     vkStream->read((VkSurfaceTransformFlagsKHR*)&forUnmarshaling->supportedTransforms, sizeof(VkSurfaceTransformFlagsKHR));
     vkStream->read((VkBool32*)&forUnmarshaling->planeReorderPossible, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->persistentContent, sizeof(VkBool32));
@@ -7628,10 +9990,16 @@
 
 void marshal_VkDisplaySurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplaySurfaceCreateInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkDisplaySurfaceCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkDisplaySurfaceCreateFlagsKHR));
     uint64_t cgen_var_0;
     vkStream->handleMapping()->mapHandles_VkDisplayModeKHR_u64(&forMarshaling->displayMode, &cgen_var_0, 1);
@@ -7641,15 +10009,21 @@
     vkStream->write((VkSurfaceTransformFlagBitsKHR*)&forMarshaling->transform, sizeof(VkSurfaceTransformFlagBitsKHR));
     vkStream->write((float*)&forMarshaling->globalAlpha, sizeof(float));
     vkStream->write((VkDisplayPlaneAlphaFlagBitsKHR*)&forMarshaling->alphaMode, sizeof(VkDisplayPlaneAlphaFlagBitsKHR));
-    marshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->imageExtent));
+    marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->imageExtent));
 }
 
 void unmarshal_VkDisplaySurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplaySurfaceCreateInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkDisplaySurfaceCreateFlagsKHR*)&forUnmarshaling->flags, sizeof(VkDisplaySurfaceCreateFlagsKHR));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
@@ -7659,30 +10033,42 @@
     vkStream->read((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->transform, sizeof(VkSurfaceTransformFlagBitsKHR));
     vkStream->read((float*)&forUnmarshaling->globalAlpha, sizeof(float));
     vkStream->read((VkDisplayPlaneAlphaFlagBitsKHR*)&forUnmarshaling->alphaMode, sizeof(VkDisplayPlaneAlphaFlagBitsKHR));
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->imageExtent));
+    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->imageExtent));
 }
 
 #endif
 #ifdef VK_KHR_display_swapchain
 void marshal_VkDisplayPresentInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPresentInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkRect2D(vkStream, (VkRect2D*)(&forMarshaling->srcRect));
-    marshal_VkRect2D(vkStream, (VkRect2D*)(&forMarshaling->dstRect));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    marshal_VkRect2D(vkStream, rootType, (VkRect2D*)(&forMarshaling->srcRect));
+    marshal_VkRect2D(vkStream, rootType, (VkRect2D*)(&forMarshaling->dstRect));
     vkStream->write((VkBool32*)&forMarshaling->persistent, sizeof(VkBool32));
 }
 
 void unmarshal_VkDisplayPresentInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayPresentInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkRect2D(vkStream, (VkRect2D*)(&forUnmarshaling->srcRect));
-    unmarshal_VkRect2D(vkStream, (VkRect2D*)(&forUnmarshaling->dstRect));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(&forUnmarshaling->srcRect));
+    unmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(&forUnmarshaling->dstRect));
     vkStream->read((VkBool32*)&forUnmarshaling->persistent, sizeof(VkBool32));
 }
 
@@ -7690,10 +10076,16 @@
 #ifdef VK_KHR_xlib_surface
 void marshal_VkXlibSurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkXlibSurfaceCreateInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkXlibSurfaceCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkXlibSurfaceCreateFlagsKHR));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->dpy;
@@ -7707,10 +10099,16 @@
 
 void unmarshal_VkXlibSurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkXlibSurfaceCreateInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkXlibSurfaceCreateFlagsKHR*)&forUnmarshaling->flags, sizeof(VkXlibSurfaceCreateFlagsKHR));
     // WARNING PTR CHECK
     Display* check_dpy;
@@ -7730,10 +10128,16 @@
 #ifdef VK_KHR_xcb_surface
 void marshal_VkXcbSurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkXcbSurfaceCreateInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkXcbSurfaceCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkXcbSurfaceCreateFlagsKHR));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->connection;
@@ -7747,10 +10151,16 @@
 
 void unmarshal_VkXcbSurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkXcbSurfaceCreateInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkXcbSurfaceCreateFlagsKHR*)&forUnmarshaling->flags, sizeof(VkXcbSurfaceCreateFlagsKHR));
     // WARNING PTR CHECK
     xcb_connection_t* check_connection;
@@ -7770,10 +10180,16 @@
 #ifdef VK_KHR_wayland_surface
 void marshal_VkWaylandSurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWaylandSurfaceCreateInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkWaylandSurfaceCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkWaylandSurfaceCreateFlagsKHR));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->display;
@@ -7793,10 +10209,16 @@
 
 void unmarshal_VkWaylandSurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkWaylandSurfaceCreateInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkWaylandSurfaceCreateFlagsKHR*)&forUnmarshaling->flags, sizeof(VkWaylandSurfaceCreateFlagsKHR));
     // WARNING PTR CHECK
     wl_display* check_display;
@@ -7826,10 +10248,16 @@
 #ifdef VK_KHR_android_surface
 void marshal_VkAndroidSurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAndroidSurfaceCreateInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkAndroidSurfaceCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkAndroidSurfaceCreateFlagsKHR));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->window;
@@ -7842,10 +10270,16 @@
 
 void unmarshal_VkAndroidSurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAndroidSurfaceCreateInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkAndroidSurfaceCreateFlagsKHR*)&forUnmarshaling->flags, sizeof(VkAndroidSurfaceCreateFlagsKHR));
     // WARNING PTR CHECK
     ANativeWindow* check_window;
@@ -7864,10 +10298,16 @@
 #ifdef VK_KHR_win32_surface
 void marshal_VkWin32SurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWin32SurfaceCreateInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((HINSTANCE*)&forMarshaling->hinstance, sizeof(HINSTANCE));
     vkStream->write((HWND*)&forMarshaling->hwnd, sizeof(HWND));
@@ -7875,10 +10315,16 @@
 
 void unmarshal_VkWin32SurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkWin32SurfaceCreateInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkWin32SurfaceCreateFlagsKHR*)&forUnmarshaling->flags, sizeof(VkWin32SurfaceCreateFlagsKHR));
     vkStream->read((HINSTANCE*)&forUnmarshaling->hinstance, sizeof(HINSTANCE));
     vkStream->read((HWND*)&forUnmarshaling->hwnd, sizeof(HWND));
@@ -7906,10 +10352,16 @@
 #ifdef VK_KHR_external_memory_win32
 void marshal_VkImportMemoryWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportMemoryWin32HandleInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((HANDLE*)&forMarshaling->handle, sizeof(HANDLE));
     vkStream->write((LPCWSTR*)&forMarshaling->name, sizeof(LPCWSTR));
@@ -7917,10 +10369,16 @@
 
 void unmarshal_VkImportMemoryWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImportMemoryWin32HandleInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
     vkStream->read((HANDLE*)&forUnmarshaling->handle, sizeof(HANDLE));
     vkStream->read((LPCWSTR*)&forUnmarshaling->name, sizeof(LPCWSTR));
@@ -7928,10 +10386,16 @@
 
 void marshal_VkExportMemoryWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportMemoryWin32HandleInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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);
@@ -7945,10 +10409,16 @@
 
 void unmarshal_VkExportMemoryWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExportMemoryWin32HandleInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     // WARNING PTR CHECK
     const SECURITY_ATTRIBUTES* check_pAttributes;
     check_pAttributes = (const SECURITY_ATTRIBUTES*)(uintptr_t)vkStream->getBe64();
@@ -7966,28 +10436,46 @@
 
 void marshal_VkMemoryWin32HandlePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryWin32HandlePropertiesKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryWin32HandlePropertiesKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->memoryTypeBits, sizeof(uint32_t));
 }
 
 void marshal_VkMemoryGetWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryGetWin32HandleInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -7996,10 +10484,16 @@
 
 void unmarshal_VkMemoryGetWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryGetWin32HandleInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(&cgen_var_0, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
@@ -8010,48 +10504,78 @@
 #ifdef VK_KHR_external_memory_fd
 void marshal_VkImportMemoryFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportMemoryFdInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((int*)&forMarshaling->fd, sizeof(int));
 }
 
 void unmarshal_VkImportMemoryFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImportMemoryFdInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
     vkStream->read((int*)&forUnmarshaling->fd, sizeof(int));
 }
 
 void marshal_VkMemoryFdPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryFdPropertiesKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryFdPropertiesKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->memoryTypeBits, sizeof(uint32_t));
 }
 
 void marshal_VkMemoryGetFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryGetFdInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -8060,10 +10584,16 @@
 
 void unmarshal_VkMemoryGetFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryGetFdInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(&cgen_var_0, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
@@ -8074,10 +10604,16 @@
 #ifdef VK_KHR_win32_keyed_mutex
 void marshal_VkWin32KeyedMutexAcquireReleaseInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWin32KeyedMutexAcquireReleaseInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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)
     {
@@ -8101,10 +10637,16 @@
 
 void unmarshal_VkWin32KeyedMutexAcquireReleaseInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkWin32KeyedMutexAcquireReleaseInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->acquireCount, sizeof(uint32_t));
     if (forUnmarshaling->acquireCount)
     {
@@ -8134,10 +10676,16 @@
 #ifdef VK_KHR_external_semaphore_win32
 void marshal_VkImportSemaphoreWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportSemaphoreWin32HandleInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -8149,10 +10697,16 @@
 
 void unmarshal_VkImportSemaphoreWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImportSemaphoreWin32HandleInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkSemaphore(&cgen_var_0, (VkSemaphore*)&forUnmarshaling->semaphore, 1);
@@ -8164,10 +10718,16 @@
 
 void marshal_VkExportSemaphoreWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportSemaphoreWin32HandleInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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);
@@ -8181,10 +10741,16 @@
 
 void unmarshal_VkExportSemaphoreWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExportSemaphoreWin32HandleInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     // WARNING PTR CHECK
     const SECURITY_ATTRIBUTES* check_pAttributes;
     check_pAttributes = (const SECURITY_ATTRIBUTES*)(uintptr_t)vkStream->getBe64();
@@ -8202,10 +10768,16 @@
 
 void marshal_VkD3D12FenceSubmitInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkD3D12FenceSubmitInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->waitSemaphoreValuesCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pWaitSemaphoreValues;
@@ -8226,10 +10798,16 @@
 
 void unmarshal_VkD3D12FenceSubmitInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkD3D12FenceSubmitInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->waitSemaphoreValuesCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     const uint64_t* check_pWaitSemaphoreValues;
@@ -8258,10 +10836,16 @@
 
 void marshal_VkSemaphoreGetWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSemaphoreGetWin32HandleInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -8270,10 +10854,16 @@
 
 void unmarshal_VkSemaphoreGetWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSemaphoreGetWin32HandleInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkSemaphore(&cgen_var_0, (VkSemaphore*)&forUnmarshaling->semaphore, 1);
@@ -8284,10 +10874,16 @@
 #ifdef VK_KHR_external_semaphore_fd
 void marshal_VkImportSemaphoreFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportSemaphoreFdInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -8298,10 +10894,16 @@
 
 void unmarshal_VkImportSemaphoreFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImportSemaphoreFdInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkSemaphore(&cgen_var_0, (VkSemaphore*)&forUnmarshaling->semaphore, 1);
@@ -8312,10 +10914,16 @@
 
 void marshal_VkSemaphoreGetFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSemaphoreGetFdInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -8324,10 +10932,16 @@
 
 void unmarshal_VkSemaphoreGetFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSemaphoreGetFdInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkSemaphore(&cgen_var_0, (VkSemaphore*)&forUnmarshaling->semaphore, 1);
@@ -8338,19 +10952,31 @@
 #ifdef VK_KHR_push_descriptor
 void marshal_VkPhysicalDevicePushDescriptorPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePushDescriptorPropertiesKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->maxPushDescriptors, sizeof(uint32_t));
 }
 
 void unmarshal_VkPhysicalDevicePushDescriptorPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDevicePushDescriptorPropertiesKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->maxPushDescriptors, sizeof(uint32_t));
 }
 
@@ -8362,26 +10988,32 @@
 #ifdef VK_KHR_incremental_present
 void marshal_VkRectLayerKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRectLayerKHR* forMarshaling)
 {
-    marshal_VkOffset2D(vkStream, (VkOffset2D*)(&forMarshaling->offset));
-    marshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->extent));
+    (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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRectLayerKHR* forUnmarshaling)
 {
-    unmarshal_VkOffset2D(vkStream, (VkOffset2D*)(&forUnmarshaling->offset));
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->extent));
+    (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(
     VulkanStreamGuest* 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;
@@ -8392,7 +11024,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forMarshaling->rectangleCount; ++i)
             {
-                marshal_VkRectLayerKHR(vkStream, (const VkRectLayerKHR*)(forMarshaling->pRectangles + i));
+                marshal_VkRectLayerKHR(vkStream, rootType, (const VkRectLayerKHR*)(forMarshaling->pRectangles + i));
             }
         }
     }
@@ -8400,8 +11032,10 @@
 
 void unmarshal_VkPresentRegionKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPresentRegionKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->rectangleCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     const VkRectLayerKHR* check_pRectangles;
@@ -8416,7 +11050,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->rectangleCount; ++i)
             {
-                unmarshal_VkRectLayerKHR(vkStream, (VkRectLayerKHR*)(forUnmarshaling->pRectangles + i));
+                unmarshal_VkRectLayerKHR(vkStream, rootType, (VkRectLayerKHR*)(forUnmarshaling->pRectangles + i));
             }
         }
     }
@@ -8424,10 +11058,16 @@
 
 void marshal_VkPresentRegionsKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPresentRegionsKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pRegions;
@@ -8438,7 +11078,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forMarshaling->swapchainCount; ++i)
             {
-                marshal_VkPresentRegionKHR(vkStream, (const VkPresentRegionKHR*)(forMarshaling->pRegions + i));
+                marshal_VkPresentRegionKHR(vkStream, rootType, (const VkPresentRegionKHR*)(forMarshaling->pRegions + i));
             }
         }
     }
@@ -8446,10 +11086,16 @@
 
 void unmarshal_VkPresentRegionsKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPresentRegionsKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->swapchainCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     const VkPresentRegionKHR* check_pRegions;
@@ -8464,7 +11110,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->swapchainCount; ++i)
             {
-                unmarshal_VkPresentRegionKHR(vkStream, (VkPresentRegionKHR*)(forUnmarshaling->pRegions + i));
+                unmarshal_VkPresentRegionKHR(vkStream, rootType, (VkPresentRegionKHR*)(forUnmarshaling->pRegions + i));
             }
         }
     }
@@ -8480,19 +11126,31 @@
 #ifdef VK_KHR_shared_presentable_image
 void marshal_VkSharedPresentSurfaceCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSharedPresentSurfaceCapabilitiesKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkImageUsageFlags*)&forMarshaling->sharedPresentSupportedUsageFlags, sizeof(VkImageUsageFlags));
 }
 
 void unmarshal_VkSharedPresentSurfaceCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSharedPresentSurfaceCapabilitiesKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkImageUsageFlags*)&forUnmarshaling->sharedPresentSupportedUsageFlags, sizeof(VkImageUsageFlags));
 }
 
@@ -8504,10 +11162,16 @@
 #ifdef VK_KHR_external_fence_win32
 void marshal_VkImportFenceWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportFenceWin32HandleInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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);
@@ -8519,10 +11183,16 @@
 
 void unmarshal_VkImportFenceWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImportFenceWin32HandleInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkFence(&cgen_var_0, (VkFence*)&forUnmarshaling->fence, 1);
@@ -8534,10 +11204,16 @@
 
 void marshal_VkExportFenceWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportFenceWin32HandleInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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);
@@ -8551,10 +11227,16 @@
 
 void unmarshal_VkExportFenceWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExportFenceWin32HandleInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     // WARNING PTR CHECK
     const SECURITY_ATTRIBUTES* check_pAttributes;
     check_pAttributes = (const SECURITY_ATTRIBUTES*)(uintptr_t)vkStream->getBe64();
@@ -8572,10 +11254,16 @@
 
 void marshal_VkFenceGetWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFenceGetWin32HandleInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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);
@@ -8584,10 +11272,16 @@
 
 void unmarshal_VkFenceGetWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkFenceGetWin32HandleInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkFence(&cgen_var_0, (VkFence*)&forUnmarshaling->fence, 1);
@@ -8598,10 +11292,16 @@
 #ifdef VK_KHR_external_fence_fd
 void marshal_VkImportFenceFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportFenceFdInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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);
@@ -8612,10 +11312,16 @@
 
 void unmarshal_VkImportFenceFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImportFenceFdInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkFence(&cgen_var_0, (VkFence*)&forUnmarshaling->fence, 1);
@@ -8626,10 +11332,16 @@
 
 void marshal_VkFenceGetFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFenceGetFdInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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);
@@ -8638,10 +11350,16 @@
 
 void unmarshal_VkFenceGetFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkFenceGetFdInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkFence(&cgen_var_0, (VkFence*)&forUnmarshaling->fence, 1);
@@ -8652,48 +11370,78 @@
 #ifdef VK_KHR_performance_query
 void marshal_VkPhysicalDevicePerformanceQueryFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePerformanceQueryFeaturesKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
 }
 
 void unmarshal_VkPhysicalDevicePerformanceQueryFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDevicePerformanceQueryFeaturesKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->performanceCounterQueryPools, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->performanceCounterMultipleQueryPools, sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDevicePerformanceQueryPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePerformanceQueryPropertiesKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->allowCommandBufferQueryCopies, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDevicePerformanceQueryPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDevicePerformanceQueryPropertiesKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->allowCommandBufferQueryCopies, sizeof(VkBool32));
 }
 
 void marshal_VkPerformanceCounterKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceCounterKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -8702,10 +11450,16 @@
 
 void unmarshal_VkPerformanceCounterKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPerformanceCounterKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -8714,10 +11468,16 @@
 
 void marshal_VkPerformanceCounterDescriptionKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceCounterDescriptionKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((char*)forMarshaling->name, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
     vkStream->write((char*)forMarshaling->category, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
@@ -8726,10 +11486,16 @@
 
 void unmarshal_VkPerformanceCounterDescriptionKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPerformanceCounterDescriptionKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     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));
@@ -8738,10 +11504,16 @@
 
 void marshal_VkQueryPoolPerformanceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkQueryPoolPerformanceCreateInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -8749,10 +11521,16 @@
 
 void unmarshal_VkQueryPoolPerformanceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkQueryPoolPerformanceCreateInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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->read((uint32_t*)forUnmarshaling->pCounterIndices, forUnmarshaling->counterIndexCount * sizeof(const uint32_t));
@@ -8760,53 +11538,81 @@
 
 void marshal_VkPerformanceCounterResultKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceCounterResultKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((int32_t*)&forMarshaling->int32, sizeof(int32_t));
 }
 
 void unmarshal_VkPerformanceCounterResultKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPerformanceCounterResultKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((int32_t*)&forUnmarshaling->int32, sizeof(int32_t));
 }
 
 void marshal_VkAcquireProfilingLockInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAcquireProfilingLockInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint64_t*)&forMarshaling->timeout, sizeof(uint64_t));
 }
 
 void unmarshal_VkAcquireProfilingLockInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAcquireProfilingLockInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkAcquireProfilingLockFlagsKHR*)&forUnmarshaling->flags, sizeof(VkAcquireProfilingLockFlagsKHR));
     vkStream->read((uint64_t*)&forUnmarshaling->timeout, sizeof(uint64_t));
 }
 
 void marshal_VkPerformanceQuerySubmitInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceQuerySubmitInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPerformanceQuerySubmitInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->counterPassIndex, sizeof(uint32_t));
 }
 
@@ -8816,10 +11622,16 @@
 #ifdef VK_KHR_get_surface_capabilities2
 void marshal_VkPhysicalDeviceSurfaceInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSurfaceInfo2KHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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_VkSurfaceKHR_u64(&forMarshaling->surface, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -8827,10 +11639,16 @@
 
 void unmarshal_VkPhysicalDeviceSurfaceInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceSurfaceInfo2KHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkSurfaceKHR(&cgen_var_0, (VkSurfaceKHR*)&forUnmarshaling->surface, 1);
@@ -8838,38 +11656,62 @@
 
 void marshal_VkSurfaceCapabilities2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceCapabilities2KHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkSurfaceCapabilitiesKHR(vkStream, (VkSurfaceCapabilitiesKHR*)(&forMarshaling->surfaceCapabilities));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    marshal_VkSurfaceCapabilitiesKHR(vkStream, rootType, (VkSurfaceCapabilitiesKHR*)(&forMarshaling->surfaceCapabilities));
 }
 
 void unmarshal_VkSurfaceCapabilities2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSurfaceCapabilities2KHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkSurfaceCapabilitiesKHR(vkStream, (VkSurfaceCapabilitiesKHR*)(&forUnmarshaling->surfaceCapabilities));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkSurfaceCapabilitiesKHR(vkStream, rootType, (VkSurfaceCapabilitiesKHR*)(&forUnmarshaling->surfaceCapabilities));
 }
 
 void marshal_VkSurfaceFormat2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceFormat2KHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkSurfaceFormatKHR(vkStream, (VkSurfaceFormatKHR*)(&forMarshaling->surfaceFormat));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    marshal_VkSurfaceFormatKHR(vkStream, rootType, (VkSurfaceFormatKHR*)(&forMarshaling->surfaceFormat));
 }
 
 void unmarshal_VkSurfaceFormat2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSurfaceFormat2KHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkSurfaceFormatKHR(vkStream, (VkSurfaceFormatKHR*)(&forUnmarshaling->surfaceFormat));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkSurfaceFormatKHR(vkStream, rootType, (VkSurfaceFormatKHR*)(&forUnmarshaling->surfaceFormat));
 }
 
 #endif
@@ -8878,64 +11720,106 @@
 #ifdef VK_KHR_get_display_properties2
 void marshal_VkDisplayProperties2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayProperties2KHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkDisplayPropertiesKHR(vkStream, (VkDisplayPropertiesKHR*)(&forMarshaling->displayProperties));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    marshal_VkDisplayPropertiesKHR(vkStream, rootType, (VkDisplayPropertiesKHR*)(&forMarshaling->displayProperties));
 }
 
 void unmarshal_VkDisplayProperties2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayProperties2KHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkDisplayPropertiesKHR(vkStream, (VkDisplayPropertiesKHR*)(&forUnmarshaling->displayProperties));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkDisplayPropertiesKHR(vkStream, rootType, (VkDisplayPropertiesKHR*)(&forUnmarshaling->displayProperties));
 }
 
 void marshal_VkDisplayPlaneProperties2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPlaneProperties2KHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkDisplayPlanePropertiesKHR(vkStream, (VkDisplayPlanePropertiesKHR*)(&forMarshaling->displayPlaneProperties));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    marshal_VkDisplayPlanePropertiesKHR(vkStream, rootType, (VkDisplayPlanePropertiesKHR*)(&forMarshaling->displayPlaneProperties));
 }
 
 void unmarshal_VkDisplayPlaneProperties2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayPlaneProperties2KHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkDisplayPlanePropertiesKHR(vkStream, (VkDisplayPlanePropertiesKHR*)(&forUnmarshaling->displayPlaneProperties));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkDisplayPlanePropertiesKHR(vkStream, rootType, (VkDisplayPlanePropertiesKHR*)(&forUnmarshaling->displayPlaneProperties));
 }
 
 void marshal_VkDisplayModeProperties2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayModeProperties2KHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkDisplayModePropertiesKHR(vkStream, (VkDisplayModePropertiesKHR*)(&forMarshaling->displayModeProperties));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    marshal_VkDisplayModePropertiesKHR(vkStream, rootType, (VkDisplayModePropertiesKHR*)(&forMarshaling->displayModeProperties));
 }
 
 void unmarshal_VkDisplayModeProperties2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayModeProperties2KHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkDisplayModePropertiesKHR(vkStream, (VkDisplayModePropertiesKHR*)(&forUnmarshaling->displayModeProperties));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkDisplayModePropertiesKHR(vkStream, rootType, (VkDisplayModePropertiesKHR*)(&forUnmarshaling->displayModeProperties));
 }
 
 void marshal_VkDisplayPlaneInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPlaneInfo2KHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -8944,10 +11828,16 @@
 
 void unmarshal_VkDisplayPlaneInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayPlaneInfo2KHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkDisplayModeKHR(&cgen_var_0, (VkDisplayModeKHR*)&forUnmarshaling->mode, 1);
@@ -8956,20 +11846,32 @@
 
 void marshal_VkDisplayPlaneCapabilities2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPlaneCapabilities2KHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkDisplayPlaneCapabilitiesKHR(vkStream, (VkDisplayPlaneCapabilitiesKHR*)(&forMarshaling->capabilities));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    marshal_VkDisplayPlaneCapabilitiesKHR(vkStream, rootType, (VkDisplayPlaneCapabilitiesKHR*)(&forMarshaling->capabilities));
 }
 
 void unmarshal_VkDisplayPlaneCapabilities2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayPlaneCapabilities2KHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkDisplayPlaneCapabilitiesKHR(vkStream, (VkDisplayPlaneCapabilitiesKHR*)(&forUnmarshaling->capabilities));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkDisplayPlaneCapabilitiesKHR(vkStream, rootType, (VkDisplayPlaneCapabilitiesKHR*)(&forUnmarshaling->capabilities));
 }
 
 #endif
@@ -8990,10 +11892,16 @@
 #ifdef VK_KHR_portability_subset
 void marshal_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePortabilitySubsetFeaturesKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->constantAlphaColorBlendFactors, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->events, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->imageViewFormatReinterpretation, sizeof(VkBool32));
@@ -9013,10 +11921,16 @@
 
 void unmarshal_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDevicePortabilitySubsetFeaturesKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->constantAlphaColorBlendFactors, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->events, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->imageViewFormatReinterpretation, sizeof(VkBool32));
@@ -9036,19 +11950,31 @@
 
 void marshal_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePortabilitySubsetPropertiesKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
 }
 
 void unmarshal_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDevicePortabilitySubsetPropertiesKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->minVertexInputBindingStrideAlignment, sizeof(uint32_t));
 }
 
@@ -9066,20 +11992,32 @@
 #ifdef VK_KHR_shader_clock
 void marshal_VkPhysicalDeviceShaderClockFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderClockFeaturesKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->shaderSubgroupClock, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->shaderDeviceClock, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceShaderClockFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderClockFeaturesKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderSubgroupClock, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderDeviceClock, sizeof(VkBool32));
 }
@@ -9100,19 +12038,31 @@
 #ifdef VK_KHR_shader_terminate_invocation
 void marshal_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->shaderTerminateInvocation, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderTerminateInvocation, sizeof(VkBool32));
 }
 
@@ -9120,50 +12070,80 @@
 #ifdef VK_KHR_fragment_shading_rate
 void marshal_VkFragmentShadingRateAttachmentInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFragmentShadingRateAttachmentInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkAttachmentReference2(vkStream, (const VkAttachmentReference2*)(forMarshaling->pFragmentShadingRateAttachment));
-    marshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->shadingRateAttachmentTexelSize));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    marshal_VkAttachmentReference2(vkStream, rootType, (const VkAttachmentReference2*)(forMarshaling->pFragmentShadingRateAttachment));
+    marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->shadingRateAttachmentTexelSize));
 }
 
 void unmarshal_VkFragmentShadingRateAttachmentInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkFragmentShadingRateAttachmentInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkAttachmentReference2(vkStream, (VkAttachmentReference2*)(forUnmarshaling->pFragmentShadingRateAttachment));
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->shadingRateAttachmentTexelSize));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkAttachmentReference2(vkStream, rootType, (VkAttachmentReference2*)(forUnmarshaling->pFragmentShadingRateAttachment));
+    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->shadingRateAttachmentTexelSize));
 }
 
 void marshal_VkPipelineFragmentShadingRateStateCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineFragmentShadingRateStateCreateInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->fragmentSize));
+    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));
 }
 
 void unmarshal_VkPipelineFragmentShadingRateStateCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineFragmentShadingRateStateCreateInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->fragmentSize));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->fragmentSize));
     vkStream->read((VkFragmentShadingRateCombinerOpKHR*)forUnmarshaling->combinerOps, 2 * sizeof(VkFragmentShadingRateCombinerOpKHR));
 }
 
 void marshal_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateFeaturesKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->pipelineFragmentShadingRate, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->primitiveFragmentShadingRate, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->attachmentFragmentShadingRate, sizeof(VkBool32));
@@ -9171,10 +12151,16 @@
 
 void unmarshal_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceFragmentShadingRateFeaturesKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->pipelineFragmentShadingRate, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->primitiveFragmentShadingRate, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->attachmentFragmentShadingRate, sizeof(VkBool32));
@@ -9182,17 +12168,23 @@
 
 void marshal_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRatePropertiesKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->minFragmentShadingRateAttachmentTexelSize));
-    marshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->maxFragmentShadingRateAttachmentTexelSize));
+    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));
     vkStream->write((VkBool32*)&forMarshaling->layeredShadingRateAttachments, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->fragmentShadingRateNonTrivialCombinerOps, sizeof(VkBool32));
-    marshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->maxFragmentSize));
+    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));
@@ -9207,17 +12199,23 @@
 
 void unmarshal_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceFragmentShadingRatePropertiesKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->minFragmentShadingRateAttachmentTexelSize));
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->maxFragmentShadingRateAttachmentTexelSize));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
     vkStream->read((VkBool32*)&forUnmarshaling->layeredShadingRateAttachments, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->fragmentShadingRateNonTrivialCombinerOps, sizeof(VkBool32));
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->maxFragmentSize));
+    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));
@@ -9232,22 +12230,34 @@
 
 void marshal_VkPhysicalDeviceFragmentShadingRateKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkSampleCountFlags*)&forMarshaling->sampleCounts, sizeof(VkSampleCountFlags));
-    marshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->fragmentSize));
+    marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->fragmentSize));
 }
 
 void unmarshal_VkPhysicalDeviceFragmentShadingRateKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceFragmentShadingRateKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkSampleCountFlags*)&forUnmarshaling->sampleCounts, sizeof(VkSampleCountFlags));
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->fragmentSize));
+    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->fragmentSize));
 }
 
 #endif
@@ -9256,19 +12266,31 @@
 #ifdef VK_KHR_surface_protected_capabilities
 void marshal_VkSurfaceProtectedCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceProtectedCapabilitiesKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->supportsProtected, sizeof(VkBool32));
 }
 
 void unmarshal_VkSurfaceProtectedCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSurfaceProtectedCapabilitiesKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->supportsProtected, sizeof(VkBool32));
 }
 
@@ -9284,28 +12306,46 @@
 #ifdef VK_KHR_pipeline_executable_properties
 void marshal_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->pipelineExecutableInfo, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->pipelineExecutableInfo, sizeof(VkBool32));
 }
 
 void marshal_VkPipelineInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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_VkPipeline_u64(&forMarshaling->pipeline, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -9313,10 +12353,16 @@
 
 void unmarshal_VkPipelineInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkPipeline(&cgen_var_0, (VkPipeline*)&forUnmarshaling->pipeline, 1);
@@ -9324,10 +12370,16 @@
 
 void marshal_VkPipelineExecutablePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineExecutablePropertiesKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkShaderStageFlags*)&forMarshaling->stages, sizeof(VkShaderStageFlags));
     vkStream->write((char*)forMarshaling->name, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
     vkStream->write((char*)forMarshaling->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
@@ -9336,10 +12388,16 @@
 
 void unmarshal_VkPipelineExecutablePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineExecutablePropertiesKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkShaderStageFlags*)&forUnmarshaling->stages, sizeof(VkShaderStageFlags));
     vkStream->read((char*)forUnmarshaling->name, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
     vkStream->read((char*)forUnmarshaling->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
@@ -9348,10 +12406,16 @@
 
 void marshal_VkPipelineExecutableInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineExecutableInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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_VkPipeline_u64(&forMarshaling->pipeline, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -9360,10 +12424,16 @@
 
 void unmarshal_VkPipelineExecutableInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineExecutableInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkPipeline(&cgen_var_0, (VkPipeline*)&forUnmarshaling->pipeline, 1);
@@ -9372,48 +12442,70 @@
 
 void marshal_VkPipelineExecutableStatisticValueKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineExecutableStatisticValueKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkBool32*)&forMarshaling->b32, sizeof(VkBool32));
 }
 
 void unmarshal_VkPipelineExecutableStatisticValueKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineExecutableStatisticValueKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkBool32*)&forUnmarshaling->b32, sizeof(VkBool32));
 }
 
 void marshal_VkPipelineExecutableStatisticKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineExecutableStatisticKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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, (VkPipelineExecutableStatisticValueKHR*)(&forMarshaling->value));
+    marshal_VkPipelineExecutableStatisticValueKHR(vkStream, rootType, (VkPipelineExecutableStatisticValueKHR*)(&forMarshaling->value));
 }
 
 void unmarshal_VkPipelineExecutableStatisticKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineExecutableStatisticKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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, (VkPipelineExecutableStatisticValueKHR*)(&forUnmarshaling->value));
+    unmarshal_VkPipelineExecutableStatisticValueKHR(vkStream, rootType, (VkPipelineExecutableStatisticValueKHR*)(&forUnmarshaling->value));
 }
 
 void marshal_VkPipelineExecutableInternalRepresentationKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineExecutableInternalRepresentationKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((VkBool32*)&forMarshaling->isText, sizeof(VkBool32));
@@ -9430,10 +12522,16 @@
 
 void unmarshal_VkPipelineExecutableInternalRepresentationKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineExecutableInternalRepresentationKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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((VkBool32*)&forUnmarshaling->isText, sizeof(VkBool32));
@@ -9455,10 +12553,16 @@
 #ifdef VK_KHR_pipeline_library
 void marshal_VkPipelineLibraryCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineLibraryCreateInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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)
     {
@@ -9471,10 +12575,16 @@
 
 void unmarshal_VkPipelineLibraryCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineLibraryCreateInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->libraryCount, sizeof(uint32_t));
     if (forUnmarshaling->libraryCount)
     {
@@ -9491,10 +12601,16 @@
 #ifdef VK_KHR_copy_commands2
 void marshal_VkBufferCopy2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferCopy2KHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkDeviceSize*)&forMarshaling->srcOffset, sizeof(VkDeviceSize));
     vkStream->write((VkDeviceSize*)&forMarshaling->dstOffset, sizeof(VkDeviceSize));
     vkStream->write((VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
@@ -9502,10 +12618,16 @@
 
 void unmarshal_VkBufferCopy2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBufferCopy2KHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->srcOffset, sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->dstOffset, sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->size, sizeof(VkDeviceSize));
@@ -9513,10 +12635,16 @@
 
 void marshal_VkCopyBufferInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyBufferInfo2KHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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_VkBuffer_u64(&forMarshaling->srcBuffer, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -9528,17 +12656,23 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->regionCount; ++i)
         {
-            marshal_VkBufferCopy2KHR(vkStream, (const VkBufferCopy2KHR*)(forMarshaling->pRegions + i));
+            marshal_VkBufferCopy2KHR(vkStream, rootType, (const VkBufferCopy2KHR*)(forMarshaling->pRegions + i));
         }
     }
 }
 
 void unmarshal_VkCopyBufferInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCopyBufferInfo2KHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0, (VkBuffer*)&forUnmarshaling->srcBuffer, 1);
@@ -9550,43 +12684,61 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i)
         {
-            unmarshal_VkBufferCopy2KHR(vkStream, (VkBufferCopy2KHR*)(forUnmarshaling->pRegions + i));
+            unmarshal_VkBufferCopy2KHR(vkStream, rootType, (VkBufferCopy2KHR*)(forUnmarshaling->pRegions + i));
         }
     }
 }
 
 void marshal_VkImageCopy2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageCopy2KHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource));
-    marshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->srcOffset));
-    marshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource));
-    marshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->dstOffset));
-    marshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->extent));
+    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_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->srcOffset));
+    marshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource));
+    marshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->dstOffset));
+    marshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->extent));
 }
 
 void unmarshal_VkImageCopy2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageCopy2KHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource));
-    unmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forUnmarshaling->srcOffset));
-    unmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource));
-    unmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forUnmarshaling->dstOffset));
-    unmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forUnmarshaling->extent));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource));
+    unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->srcOffset));
+    unmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource));
+    unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->dstOffset));
+    unmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->extent));
 }
 
 void marshal_VkCopyImageInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyImageInfo2KHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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_VkImage_u64(&forMarshaling->srcImage, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -9600,17 +12752,23 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->regionCount; ++i)
         {
-            marshal_VkImageCopy2KHR(vkStream, (const VkImageCopy2KHR*)(forMarshaling->pRegions + i));
+            marshal_VkImageCopy2KHR(vkStream, rootType, (const VkImageCopy2KHR*)(forMarshaling->pRegions + i));
         }
     }
 }
 
 void unmarshal_VkCopyImageInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCopyImageInfo2KHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0, (VkImage*)&forUnmarshaling->srcImage, 1);
@@ -9624,45 +12782,63 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i)
         {
-            unmarshal_VkImageCopy2KHR(vkStream, (VkImageCopy2KHR*)(forUnmarshaling->pRegions + i));
+            unmarshal_VkImageCopy2KHR(vkStream, rootType, (VkImageCopy2KHR*)(forUnmarshaling->pRegions + i));
         }
     }
 }
 
 void marshal_VkBufferImageCopy2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferImageCopy2KHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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, (VkImageSubresourceLayers*)(&forMarshaling->imageSubresource));
-    marshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->imageOffset));
-    marshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->imageExtent));
+    marshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->imageSubresource));
+    marshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->imageOffset));
+    marshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->imageExtent));
 }
 
 void unmarshal_VkBufferImageCopy2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBufferImageCopy2KHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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, (VkImageSubresourceLayers*)(&forUnmarshaling->imageSubresource));
-    unmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forUnmarshaling->imageOffset));
-    unmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forUnmarshaling->imageExtent));
+    unmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->imageSubresource));
+    unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->imageOffset));
+    unmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->imageExtent));
 }
 
 void marshal_VkCopyBufferToImageInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyBufferToImageInfo2KHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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_VkBuffer_u64(&forMarshaling->srcBuffer, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -9675,17 +12851,23 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->regionCount; ++i)
         {
-            marshal_VkBufferImageCopy2KHR(vkStream, (const VkBufferImageCopy2KHR*)(forMarshaling->pRegions + i));
+            marshal_VkBufferImageCopy2KHR(vkStream, rootType, (const VkBufferImageCopy2KHR*)(forMarshaling->pRegions + i));
         }
     }
 }
 
 void unmarshal_VkCopyBufferToImageInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCopyBufferToImageInfo2KHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0, (VkBuffer*)&forUnmarshaling->srcBuffer, 1);
@@ -9698,17 +12880,23 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i)
         {
-            unmarshal_VkBufferImageCopy2KHR(vkStream, (VkBufferImageCopy2KHR*)(forUnmarshaling->pRegions + i));
+            unmarshal_VkBufferImageCopy2KHR(vkStream, rootType, (VkBufferImageCopy2KHR*)(forUnmarshaling->pRegions + i));
         }
     }
 }
 
 void marshal_VkCopyImageToBufferInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyImageToBufferInfo2KHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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_VkImage_u64(&forMarshaling->srcImage, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -9721,17 +12909,23 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->regionCount; ++i)
         {
-            marshal_VkBufferImageCopy2KHR(vkStream, (const VkBufferImageCopy2KHR*)(forMarshaling->pRegions + i));
+            marshal_VkBufferImageCopy2KHR(vkStream, rootType, (const VkBufferImageCopy2KHR*)(forMarshaling->pRegions + i));
         }
     }
 }
 
 void unmarshal_VkCopyImageToBufferInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCopyImageToBufferInfo2KHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0, (VkImage*)&forUnmarshaling->srcImage, 1);
@@ -9744,53 +12938,71 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i)
         {
-            unmarshal_VkBufferImageCopy2KHR(vkStream, (VkBufferImageCopy2KHR*)(forUnmarshaling->pRegions + i));
+            unmarshal_VkBufferImageCopy2KHR(vkStream, rootType, (VkBufferImageCopy2KHR*)(forUnmarshaling->pRegions + i));
         }
     }
 }
 
 void marshal_VkImageBlit2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageBlit2KHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource));
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
     {
-        marshal_VkOffset3D(vkStream, (VkOffset3D*)(forMarshaling->srcOffsets + i));
+        rootType = forMarshaling->sType;
     }
-    marshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource));
+    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_VkOffset3D(vkStream, (VkOffset3D*)(forMarshaling->dstOffsets + 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_VkOffset3D(vkStream, rootType, (VkOffset3D*)(forMarshaling->dstOffsets + i));
     }
 }
 
 void unmarshal_VkImageBlit2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageBlit2KHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource));
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
     {
-        unmarshal_VkOffset3D(vkStream, (VkOffset3D*)(forUnmarshaling->srcOffsets + i));
+        rootType = forUnmarshaling->sType;
     }
-    unmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource));
+    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_VkOffset3D(vkStream, (VkOffset3D*)(forUnmarshaling->dstOffsets + 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_VkOffset3D(vkStream, rootType, (VkOffset3D*)(forUnmarshaling->dstOffsets + i));
     }
 }
 
 void marshal_VkBlitImageInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBlitImageInfo2KHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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_VkImage_u64(&forMarshaling->srcImage, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -9804,7 +13016,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->regionCount; ++i)
         {
-            marshal_VkImageBlit2KHR(vkStream, (const VkImageBlit2KHR*)(forMarshaling->pRegions + i));
+            marshal_VkImageBlit2KHR(vkStream, rootType, (const VkImageBlit2KHR*)(forMarshaling->pRegions + i));
         }
     }
     vkStream->write((VkFilter*)&forMarshaling->filter, sizeof(VkFilter));
@@ -9812,10 +13024,16 @@
 
 void unmarshal_VkBlitImageInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBlitImageInfo2KHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0, (VkImage*)&forUnmarshaling->srcImage, 1);
@@ -9829,7 +13047,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i)
         {
-            unmarshal_VkImageBlit2KHR(vkStream, (VkImageBlit2KHR*)(forUnmarshaling->pRegions + i));
+            unmarshal_VkImageBlit2KHR(vkStream, rootType, (VkImageBlit2KHR*)(forUnmarshaling->pRegions + i));
         }
     }
     vkStream->read((VkFilter*)&forUnmarshaling->filter, sizeof(VkFilter));
@@ -9837,36 +13055,54 @@
 
 void marshal_VkImageResolve2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageResolve2KHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource));
-    marshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->srcOffset));
-    marshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource));
-    marshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->dstOffset));
-    marshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->extent));
+    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_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->srcOffset));
+    marshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource));
+    marshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->dstOffset));
+    marshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->extent));
 }
 
 void unmarshal_VkImageResolve2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageResolve2KHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource));
-    unmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forUnmarshaling->srcOffset));
-    unmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource));
-    unmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forUnmarshaling->dstOffset));
-    unmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forUnmarshaling->extent));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource));
+    unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->srcOffset));
+    unmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource));
+    unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->dstOffset));
+    unmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->extent));
 }
 
 void marshal_VkResolveImageInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkResolveImageInfo2KHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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_VkImage_u64(&forMarshaling->srcImage, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -9880,17 +13116,23 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->regionCount; ++i)
         {
-            marshal_VkImageResolve2KHR(vkStream, (const VkImageResolve2KHR*)(forMarshaling->pRegions + i));
+            marshal_VkImageResolve2KHR(vkStream, rootType, (const VkImageResolve2KHR*)(forMarshaling->pRegions + i));
         }
     }
 }
 
 void unmarshal_VkResolveImageInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkResolveImageInfo2KHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0, (VkImage*)&forUnmarshaling->srcImage, 1);
@@ -9904,7 +13146,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i)
         {
-            unmarshal_VkImageResolve2KHR(vkStream, (VkImageResolve2KHR*)(forUnmarshaling->pRegions + i));
+            unmarshal_VkImageResolve2KHR(vkStream, rootType, (VkImageResolve2KHR*)(forUnmarshaling->pRegions + i));
         }
     }
 }
@@ -9913,10 +13155,16 @@
 #ifdef VK_ANDROID_native_buffer
 void marshal_VkNativeBufferANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkNativeBufferANDROID* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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);
@@ -9933,10 +13181,16 @@
 
 void unmarshal_VkNativeBufferANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkNativeBufferANDROID* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     // WARNING PTR CHECK
     const uint32_t* check_handle;
     check_handle = (const uint32_t*)(uintptr_t)vkStream->getBe64();
@@ -9959,10 +13213,16 @@
 #ifdef VK_EXT_debug_report
 void marshal_VkDebugReportCallbackCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugReportCallbackCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkDebugReportFlagsEXT*)&forMarshaling->flags, sizeof(VkDebugReportFlagsEXT));
     uint64_t cgen_var_0 = (uint64_t)forMarshaling->pfnCallback;
     vkStream->putBe64(cgen_var_0);
@@ -9977,10 +13237,16 @@
 
 void unmarshal_VkDebugReportCallbackCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDebugReportCallbackCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkDebugReportFlagsEXT*)&forUnmarshaling->flags, sizeof(VkDebugReportFlagsEXT));
     forUnmarshaling->pfnCallback = (PFN_vkDebugReportCallbackEXT)vkStream->getBe64();
     // WARNING PTR CHECK
@@ -10006,19 +13272,31 @@
 #ifdef VK_AMD_rasterization_order
 void marshal_VkPipelineRasterizationStateRasterizationOrderAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRasterizationStateRasterizationOrderAMD* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkRasterizationOrderAMD*)&forMarshaling->rasterizationOrder, sizeof(VkRasterizationOrderAMD));
 }
 
 void unmarshal_VkPipelineRasterizationStateRasterizationOrderAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineRasterizationStateRasterizationOrderAMD* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkRasterizationOrderAMD*)&forUnmarshaling->rasterizationOrder, sizeof(VkRasterizationOrderAMD));
 }
 
@@ -10030,10 +13308,16 @@
 #ifdef VK_EXT_debug_marker
 void marshal_VkDebugMarkerObjectNameInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugMarkerObjectNameInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint64_t*)&forMarshaling->object, sizeof(uint64_t));
     vkStream->putString(forMarshaling->pObjectName);
@@ -10041,10 +13325,16 @@
 
 void unmarshal_VkDebugMarkerObjectNameInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDebugMarkerObjectNameInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkDebugReportObjectTypeEXT*)&forUnmarshaling->objectType, sizeof(VkDebugReportObjectTypeEXT));
     vkStream->read((uint64_t*)&forUnmarshaling->object, sizeof(uint64_t));
     vkStream->loadStringInPlace((char**)&forUnmarshaling->pObjectName);
@@ -10052,10 +13342,16 @@
 
 void marshal_VkDebugMarkerObjectTagInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugMarkerObjectTagInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint64_t*)&forMarshaling->object, sizeof(uint64_t));
     vkStream->write((uint64_t*)&forMarshaling->tagName, sizeof(uint64_t));
@@ -10066,10 +13362,16 @@
 
 void unmarshal_VkDebugMarkerObjectTagInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDebugMarkerObjectTagInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     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));
@@ -10079,20 +13381,32 @@
 
 void marshal_VkDebugMarkerMarkerInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugMarkerMarkerInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->putString(forMarshaling->pMarkerName);
     vkStream->write((float*)forMarshaling->color, 4 * sizeof(float));
 }
 
 void unmarshal_VkDebugMarkerMarkerInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDebugMarkerMarkerInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->loadStringInPlace((char**)&forUnmarshaling->pMarkerName);
     vkStream->read((float*)forUnmarshaling->color, 4 * sizeof(float));
 }
@@ -10103,46 +13417,76 @@
 #ifdef VK_NV_dedicated_allocation
 void marshal_VkDedicatedAllocationImageCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDedicatedAllocationImageCreateInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->dedicatedAllocation, sizeof(VkBool32));
 }
 
 void unmarshal_VkDedicatedAllocationImageCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDedicatedAllocationImageCreateInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->dedicatedAllocation, sizeof(VkBool32));
 }
 
 void marshal_VkDedicatedAllocationBufferCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDedicatedAllocationBufferCreateInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->dedicatedAllocation, sizeof(VkBool32));
 }
 
 void unmarshal_VkDedicatedAllocationBufferCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDedicatedAllocationBufferCreateInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->dedicatedAllocation, sizeof(VkBool32));
 }
 
 void marshal_VkDedicatedAllocationMemoryAllocateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDedicatedAllocationMemoryAllocateInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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_VkImage_u64(&forMarshaling->image, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -10153,10 +13497,16 @@
 
 void unmarshal_VkDedicatedAllocationMemoryAllocateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDedicatedAllocationMemoryAllocateInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0, (VkImage*)&forUnmarshaling->image, 1);
@@ -10169,30 +13519,48 @@
 #ifdef VK_EXT_transform_feedback
 void marshal_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTransformFeedbackFeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->transformFeedback, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->geometryStreams, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceTransformFeedbackFeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->transformFeedback, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->geometryStreams, sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTransformFeedbackPropertiesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -10207,10 +13575,16 @@
 
 void unmarshal_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceTransformFeedbackPropertiesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -10225,20 +13599,32 @@
 
 void marshal_VkPipelineRasterizationStateStreamCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRasterizationStateStreamCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->rasterizationStream, sizeof(uint32_t));
 }
 
 void unmarshal_VkPipelineRasterizationStateStreamCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineRasterizationStateStreamCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineRasterizationStateStreamCreateFlagsEXT*)&forUnmarshaling->flags, sizeof(VkPipelineRasterizationStateStreamCreateFlagsEXT));
     vkStream->read((uint32_t*)&forUnmarshaling->rasterizationStream, sizeof(uint32_t));
 }
@@ -10247,10 +13633,16 @@
 #ifdef VK_NVX_image_view_handle
 void marshal_VkImageViewHandleInfoNVX(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageViewHandleInfoNVX* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -10262,10 +13654,16 @@
 
 void unmarshal_VkImageViewHandleInfoNVX(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageViewHandleInfoNVX* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkImageView(&cgen_var_0, (VkImageView*)&forUnmarshaling->imageView, 1);
@@ -10277,20 +13675,32 @@
 
 void marshal_VkImageViewAddressPropertiesNVX(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageViewAddressPropertiesNVX* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkDeviceAddress*)&forMarshaling->deviceAddress, sizeof(VkDeviceAddress));
     vkStream->write((VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
 }
 
 void unmarshal_VkImageViewAddressPropertiesNVX(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageViewAddressPropertiesNVX* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkDeviceAddress*)&forUnmarshaling->deviceAddress, sizeof(VkDeviceAddress));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->size, sizeof(VkDeviceSize));
 }
@@ -10307,19 +13717,31 @@
 #ifdef VK_AMD_texture_gather_bias_lod
 void marshal_VkTextureLODGatherFormatPropertiesAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkTextureLODGatherFormatPropertiesAMD* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->supportsTextureGatherLODBiasAMD, sizeof(VkBool32));
 }
 
 void unmarshal_VkTextureLODGatherFormatPropertiesAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkTextureLODGatherFormatPropertiesAMD* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->supportsTextureGatherLODBiasAMD, sizeof(VkBool32));
 }
 
@@ -10327,8 +13749,10 @@
 #ifdef VK_AMD_shader_info
 void marshal_VkShaderResourceUsageAMD(
     VulkanStreamGuest* 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));
     vkStream->write((uint32_t*)&forMarshaling->ldsSizePerLocalWorkGroup, sizeof(uint32_t));
@@ -10340,8 +13764,10 @@
 
 void unmarshal_VkShaderResourceUsageAMD(
     VulkanStreamGuest* 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));
     vkStream->read((uint32_t*)&forUnmarshaling->ldsSizePerLocalWorkGroup, sizeof(uint32_t));
@@ -10351,10 +13777,12 @@
 
 void marshal_VkShaderStatisticsInfoAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkShaderStatisticsInfoAMD* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkShaderStageFlags*)&forMarshaling->shaderStageMask, sizeof(VkShaderStageFlags));
-    marshal_VkShaderResourceUsageAMD(vkStream, (VkShaderResourceUsageAMD*)(&forMarshaling->resourceUsage));
+    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));
@@ -10364,10 +13792,12 @@
 
 void unmarshal_VkShaderStatisticsInfoAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkShaderStatisticsInfoAMD* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkShaderStageFlags*)&forUnmarshaling->shaderStageMask, sizeof(VkShaderStageFlags));
-    unmarshal_VkShaderResourceUsageAMD(vkStream, (VkShaderResourceUsageAMD*)(&forUnmarshaling->resourceUsage));
+    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));
@@ -10381,20 +13811,32 @@
 #ifdef VK_GGP_stream_descriptor_surface
 void marshal_VkStreamDescriptorSurfaceCreateInfoGGP(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkStreamDescriptorSurfaceCreateInfoGGP* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
 }
 
 void unmarshal_VkStreamDescriptorSurfaceCreateInfoGGP(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkStreamDescriptorSurfaceCreateInfoGGP* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkStreamDescriptorSurfaceCreateFlagsGGP*)&forUnmarshaling->flags, sizeof(VkStreamDescriptorSurfaceCreateFlagsGGP));
     vkStream->read((GgpStreamDescriptor*)&forUnmarshaling->streamDescriptor, sizeof(GgpStreamDescriptor));
 }
@@ -10403,19 +13845,31 @@
 #ifdef VK_NV_corner_sampled_image
 void marshal_VkPhysicalDeviceCornerSampledImageFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCornerSampledImageFeaturesNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->cornerSampledImage, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceCornerSampledImageFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceCornerSampledImageFeaturesNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->cornerSampledImage, sizeof(VkBool32));
 }
 
@@ -10425,9 +13879,11 @@
 #ifdef VK_NV_external_memory_capabilities
 void marshal_VkExternalImageFormatPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalImageFormatPropertiesNV* forMarshaling)
 {
-    marshal_VkImageFormatProperties(vkStream, (VkImageFormatProperties*)(&forMarshaling->imageFormatProperties));
+    (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));
@@ -10435,9 +13891,11 @@
 
 void unmarshal_VkExternalImageFormatPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExternalImageFormatPropertiesNV* forUnmarshaling)
 {
-    unmarshal_VkImageFormatProperties(vkStream, (VkImageFormatProperties*)(&forUnmarshaling->imageFormatProperties));
+    (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));
@@ -10447,37 +13905,61 @@
 #ifdef VK_NV_external_memory
 void marshal_VkExternalMemoryImageCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalMemoryImageCreateInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkExternalMemoryHandleTypeFlagsNV*)&forMarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlagsNV));
 }
 
 void unmarshal_VkExternalMemoryImageCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExternalMemoryImageCreateInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkExternalMemoryHandleTypeFlagsNV*)&forUnmarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlagsNV));
 }
 
 void marshal_VkExportMemoryAllocateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportMemoryAllocateInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkExternalMemoryHandleTypeFlagsNV*)&forMarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlagsNV));
 }
 
 void unmarshal_VkExportMemoryAllocateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExportMemoryAllocateInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkExternalMemoryHandleTypeFlagsNV*)&forUnmarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlagsNV));
 }
 
@@ -10485,30 +13967,48 @@
 #ifdef VK_NV_external_memory_win32
 void marshal_VkImportMemoryWin32HandleInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportMemoryWin32HandleInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((HANDLE*)&forMarshaling->handle, sizeof(HANDLE));
 }
 
 void unmarshal_VkImportMemoryWin32HandleInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImportMemoryWin32HandleInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkExternalMemoryHandleTypeFlagsNV*)&forUnmarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagsNV));
     vkStream->read((HANDLE*)&forUnmarshaling->handle, sizeof(HANDLE));
 }
 
 void marshal_VkExportMemoryWin32HandleInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportMemoryWin32HandleInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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);
@@ -10521,10 +14021,16 @@
 
 void unmarshal_VkExportMemoryWin32HandleInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExportMemoryWin32HandleInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     // WARNING PTR CHECK
     const SECURITY_ATTRIBUTES* check_pAttributes;
     check_pAttributes = (const SECURITY_ATTRIBUTES*)(uintptr_t)vkStream->getBe64();
@@ -10543,10 +14049,16 @@
 #ifdef VK_NV_win32_keyed_mutex
 void marshal_VkWin32KeyedMutexAcquireReleaseInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWin32KeyedMutexAcquireReleaseInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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)
     {
@@ -10570,10 +14082,16 @@
 
 void unmarshal_VkWin32KeyedMutexAcquireReleaseInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkWin32KeyedMutexAcquireReleaseInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->acquireCount, sizeof(uint32_t));
     if (forUnmarshaling->acquireCount)
     {
@@ -10599,20 +14117,32 @@
 #ifdef VK_EXT_validation_flags
 void marshal_VkValidationFlagsEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkValidationFlagsEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
 }
 
 void unmarshal_VkValidationFlagsEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkValidationFlagsEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->disabledValidationCheckCount, sizeof(uint32_t));
     vkStream->read((VkValidationCheckEXT*)forUnmarshaling->pDisabledValidationChecks, forUnmarshaling->disabledValidationCheckCount * sizeof(const VkValidationCheckEXT));
 }
@@ -10621,10 +14151,16 @@
 #ifdef VK_NN_vi_surface
 void marshal_VkViSurfaceCreateInfoNN(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkViSurfaceCreateInfoNN* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkViSurfaceCreateFlagsNN*)&forMarshaling->flags, sizeof(VkViSurfaceCreateFlagsNN));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->window;
@@ -10637,10 +14173,16 @@
 
 void unmarshal_VkViSurfaceCreateInfoNN(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkViSurfaceCreateInfoNN* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkViSurfaceCreateFlagsNN*)&forUnmarshaling->flags, sizeof(VkViSurfaceCreateFlagsNN));
     // WARNING PTR CHECK
     void* check_window;
@@ -10663,19 +14205,31 @@
 #ifdef VK_EXT_texture_compression_astc_hdr
 void marshal_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->textureCompressionASTC_HDR, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->textureCompressionASTC_HDR, sizeof(VkBool32));
 }
 
@@ -10683,37 +14237,61 @@
 #ifdef VK_EXT_astc_decode_mode
 void marshal_VkImageViewASTCDecodeModeEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageViewASTCDecodeModeEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageViewASTCDecodeModeEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkFormat*)&forUnmarshaling->decodeMode, sizeof(VkFormat));
 }
 
 void marshal_VkPhysicalDeviceASTCDecodeFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceASTCDecodeFeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->decodeModeSharedExponent, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceASTCDecodeFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceASTCDecodeFeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->decodeModeSharedExponent, sizeof(VkBool32));
 }
 
@@ -10721,10 +14299,16 @@
 #ifdef VK_EXT_conditional_rendering
 void marshal_VkConditionalRenderingBeginInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkConditionalRenderingBeginInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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_VkBuffer_u64(&forMarshaling->buffer, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -10734,10 +14318,16 @@
 
 void unmarshal_VkConditionalRenderingBeginInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkConditionalRenderingBeginInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0, (VkBuffer*)&forUnmarshaling->buffer, 1);
@@ -10747,39 +14337,63 @@
 
 void marshal_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceConditionalRenderingFeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->conditionalRendering, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->inheritedConditionalRendering, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceConditionalRenderingFeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->conditionalRendering, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->inheritedConditionalRendering, sizeof(VkBool32));
 }
 
 void marshal_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCommandBufferInheritanceConditionalRenderingInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->conditionalRenderingEnable, sizeof(VkBool32));
 }
 
 void unmarshal_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCommandBufferInheritanceConditionalRenderingInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->conditionalRenderingEnable, sizeof(VkBool32));
 }
 
@@ -10787,26 +14401,36 @@
 #ifdef VK_NV_clip_space_w_scaling
 void marshal_VkViewportWScalingNV(
     VulkanStreamGuest* 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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkViewportWScalingNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((float*)&forUnmarshaling->xcoeff, sizeof(float));
     vkStream->read((float*)&forUnmarshaling->ycoeff, sizeof(float));
 }
 
 void marshal_VkPipelineViewportWScalingStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineViewportWScalingStateCreateInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->viewportWScalingEnable, sizeof(VkBool32));
     vkStream->write((uint32_t*)&forMarshaling->viewportCount, sizeof(uint32_t));
     // WARNING PTR CHECK
@@ -10818,7 +14442,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forMarshaling->viewportCount; ++i)
             {
-                marshal_VkViewportWScalingNV(vkStream, (const VkViewportWScalingNV*)(forMarshaling->pViewportWScalings + i));
+                marshal_VkViewportWScalingNV(vkStream, rootType, (const VkViewportWScalingNV*)(forMarshaling->pViewportWScalings + i));
             }
         }
     }
@@ -10826,10 +14450,16 @@
 
 void unmarshal_VkPipelineViewportWScalingStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineViewportWScalingStateCreateInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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
@@ -10845,7 +14475,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->viewportCount; ++i)
             {
-                unmarshal_VkViewportWScalingNV(vkStream, (VkViewportWScalingNV*)(forUnmarshaling->pViewportWScalings + i));
+                unmarshal_VkViewportWScalingNV(vkStream, rootType, (VkViewportWScalingNV*)(forUnmarshaling->pViewportWScalings + i));
             }
         }
     }
@@ -10859,15 +14489,21 @@
 #ifdef VK_EXT_display_surface_counter
 void marshal_VkSurfaceCapabilities2EXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceCapabilities2EXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->minImageCount, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxImageCount, sizeof(uint32_t));
-    marshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->currentExtent));
-    marshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->minImageExtent));
-    marshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->maxImageExtent));
+    marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->currentExtent));
+    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));
@@ -10878,15 +14514,21 @@
 
 void unmarshal_VkSurfaceCapabilities2EXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSurfaceCapabilities2EXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->minImageCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxImageCount, sizeof(uint32_t));
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->currentExtent));
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->minImageExtent));
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->maxImageExtent));
+    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->currentExtent));
+    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));
@@ -10899,73 +14541,121 @@
 #ifdef VK_EXT_display_control
 void marshal_VkDisplayPowerInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPowerInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkDisplayPowerStateEXT*)&forMarshaling->powerState, sizeof(VkDisplayPowerStateEXT));
 }
 
 void unmarshal_VkDisplayPowerInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayPowerInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkDisplayPowerStateEXT*)&forUnmarshaling->powerState, sizeof(VkDisplayPowerStateEXT));
 }
 
 void marshal_VkDeviceEventInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceEventInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkDeviceEventTypeEXT*)&forMarshaling->deviceEvent, sizeof(VkDeviceEventTypeEXT));
 }
 
 void unmarshal_VkDeviceEventInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceEventInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkDeviceEventTypeEXT*)&forUnmarshaling->deviceEvent, sizeof(VkDeviceEventTypeEXT));
 }
 
 void marshal_VkDisplayEventInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayEventInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkDisplayEventTypeEXT*)&forMarshaling->displayEvent, sizeof(VkDisplayEventTypeEXT));
 }
 
 void unmarshal_VkDisplayEventInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayEventInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkDisplayEventTypeEXT*)&forUnmarshaling->displayEvent, sizeof(VkDisplayEventTypeEXT));
 }
 
 void marshal_VkSwapchainCounterCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSwapchainCounterCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkSurfaceCounterFlagsEXT*)&forMarshaling->surfaceCounters, sizeof(VkSurfaceCounterFlagsEXT));
 }
 
 void unmarshal_VkSwapchainCounterCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSwapchainCounterCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkSurfaceCounterFlagsEXT*)&forUnmarshaling->surfaceCounters, sizeof(VkSurfaceCounterFlagsEXT));
 }
 
@@ -10973,22 +14663,28 @@
 #ifdef VK_GOOGLE_display_timing
 void marshal_VkRefreshCycleDurationGOOGLE(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRefreshCycleDurationGOOGLE* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((uint64_t*)&forMarshaling->refreshDuration, sizeof(uint64_t));
 }
 
 void unmarshal_VkRefreshCycleDurationGOOGLE(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRefreshCycleDurationGOOGLE* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((uint64_t*)&forUnmarshaling->refreshDuration, sizeof(uint64_t));
 }
 
 void marshal_VkPastPresentationTimingGOOGLE(
     VulkanStreamGuest* 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));
     vkStream->write((uint64_t*)&forMarshaling->actualPresentTime, sizeof(uint64_t));
@@ -10998,8 +14694,10 @@
 
 void unmarshal_VkPastPresentationTimingGOOGLE(
     VulkanStreamGuest* 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));
     vkStream->read((uint64_t*)&forUnmarshaling->actualPresentTime, sizeof(uint64_t));
@@ -11009,26 +14707,36 @@
 
 void marshal_VkPresentTimeGOOGLE(
     VulkanStreamGuest* 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(
     VulkanStreamGuest* 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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPresentTimesInfoGOOGLE* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pTimes;
@@ -11039,7 +14747,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forMarshaling->swapchainCount; ++i)
             {
-                marshal_VkPresentTimeGOOGLE(vkStream, (const VkPresentTimeGOOGLE*)(forMarshaling->pTimes + i));
+                marshal_VkPresentTimeGOOGLE(vkStream, rootType, (const VkPresentTimeGOOGLE*)(forMarshaling->pTimes + i));
             }
         }
     }
@@ -11047,10 +14755,16 @@
 
 void unmarshal_VkPresentTimesInfoGOOGLE(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPresentTimesInfoGOOGLE* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->swapchainCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     const VkPresentTimeGOOGLE* check_pTimes;
@@ -11065,7 +14779,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->swapchainCount; ++i)
             {
-                unmarshal_VkPresentTimeGOOGLE(vkStream, (VkPresentTimeGOOGLE*)(forUnmarshaling->pTimes + i));
+                unmarshal_VkPresentTimeGOOGLE(vkStream, rootType, (VkPresentTimeGOOGLE*)(forUnmarshaling->pTimes + i));
             }
         }
     }
@@ -11081,19 +14795,31 @@
 #ifdef VK_NVX_multiview_per_view_attributes
 void marshal_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->perViewPositionAllComponents, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->perViewPositionAllComponents, sizeof(VkBool32));
 }
 
@@ -11101,8 +14827,10 @@
 #ifdef VK_NV_viewport_swizzle
 void marshal_VkViewportSwizzleNV(
     VulkanStreamGuest* 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));
@@ -11111,8 +14839,10 @@
 
 void unmarshal_VkViewportSwizzleNV(
     VulkanStreamGuest* 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));
@@ -11121,10 +14851,16 @@
 
 void marshal_VkPipelineViewportSwizzleStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineViewportSwizzleStateCreateInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->viewportCount, sizeof(uint32_t));
     // WARNING PTR CHECK
@@ -11136,7 +14872,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forMarshaling->viewportCount; ++i)
             {
-                marshal_VkViewportSwizzleNV(vkStream, (const VkViewportSwizzleNV*)(forMarshaling->pViewportSwizzles + i));
+                marshal_VkViewportSwizzleNV(vkStream, rootType, (const VkViewportSwizzleNV*)(forMarshaling->pViewportSwizzles + i));
             }
         }
     }
@@ -11144,10 +14880,16 @@
 
 void unmarshal_VkPipelineViewportSwizzleStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineViewportSwizzleStateCreateInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineViewportSwizzleStateCreateFlagsNV*)&forUnmarshaling->flags, sizeof(VkPipelineViewportSwizzleStateCreateFlagsNV));
     vkStream->read((uint32_t*)&forUnmarshaling->viewportCount, sizeof(uint32_t));
     // WARNING PTR CHECK
@@ -11163,7 +14905,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->viewportCount; ++i)
             {
-                unmarshal_VkViewportSwizzleNV(vkStream, (VkViewportSwizzleNV*)(forUnmarshaling->pViewportSwizzles + i));
+                unmarshal_VkViewportSwizzleNV(vkStream, rootType, (VkViewportSwizzleNV*)(forUnmarshaling->pViewportSwizzles + i));
             }
         }
     }
@@ -11173,28 +14915,46 @@
 #ifdef VK_EXT_discard_rectangles
 void marshal_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDiscardRectanglePropertiesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->maxDiscardRectangles, sizeof(uint32_t));
 }
 
 void unmarshal_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceDiscardRectanglePropertiesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->maxDiscardRectangles, sizeof(uint32_t));
 }
 
 void marshal_VkPipelineDiscardRectangleStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineDiscardRectangleStateCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->discardRectangleCount, sizeof(uint32_t));
@@ -11207,7 +14967,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forMarshaling->discardRectangleCount; ++i)
             {
-                marshal_VkRect2D(vkStream, (const VkRect2D*)(forMarshaling->pDiscardRectangles + i));
+                marshal_VkRect2D(vkStream, rootType, (const VkRect2D*)(forMarshaling->pDiscardRectangles + i));
             }
         }
     }
@@ -11215,10 +14975,16 @@
 
 void unmarshal_VkPipelineDiscardRectangleStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineDiscardRectangleStateCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineDiscardRectangleStateCreateFlagsEXT*)&forUnmarshaling->flags, sizeof(VkPipelineDiscardRectangleStateCreateFlagsEXT));
     vkStream->read((VkDiscardRectangleModeEXT*)&forUnmarshaling->discardRectangleMode, sizeof(VkDiscardRectangleModeEXT));
     vkStream->read((uint32_t*)&forUnmarshaling->discardRectangleCount, sizeof(uint32_t));
@@ -11235,7 +15001,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->discardRectangleCount; ++i)
             {
-                unmarshal_VkRect2D(vkStream, (VkRect2D*)(forUnmarshaling->pDiscardRectangles + i));
+                unmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(forUnmarshaling->pDiscardRectangles + i));
             }
         }
     }
@@ -11245,10 +15011,16 @@
 #ifdef VK_EXT_conservative_rasterization
 void marshal_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceConservativeRasterizationPropertiesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -11262,10 +15034,16 @@
 
 void unmarshal_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceConservativeRasterizationPropertiesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -11279,10 +15057,16 @@
 
 void marshal_VkPipelineRasterizationConservativeStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRasterizationConservativeStateCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((float*)&forMarshaling->extraPrimitiveOverestimationSize, sizeof(float));
@@ -11290,10 +15074,16 @@
 
 void unmarshal_VkPipelineRasterizationConservativeStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineRasterizationConservativeStateCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineRasterizationConservativeStateCreateFlagsEXT*)&forUnmarshaling->flags, sizeof(VkPipelineRasterizationConservativeStateCreateFlagsEXT));
     vkStream->read((VkConservativeRasterizationModeEXT*)&forUnmarshaling->conservativeRasterizationMode, sizeof(VkConservativeRasterizationModeEXT));
     vkStream->read((float*)&forUnmarshaling->extraPrimitiveOverestimationSize, sizeof(float));
@@ -11303,38 +15093,62 @@
 #ifdef VK_EXT_depth_clip_enable
 void marshal_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDepthClipEnableFeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->depthClipEnable, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceDepthClipEnableFeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->depthClipEnable, sizeof(VkBool32));
 }
 
 void marshal_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRasterizationDepthClipStateCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((VkBool32*)&forMarshaling->depthClipEnable, sizeof(VkBool32));
 }
 
 void unmarshal_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineRasterizationDepthClipStateCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineRasterizationDepthClipStateCreateFlagsEXT*)&forUnmarshaling->flags, sizeof(VkPipelineRasterizationDepthClipStateCreateFlagsEXT));
     vkStream->read((VkBool32*)&forUnmarshaling->depthClipEnable, sizeof(VkBool32));
 }
@@ -11345,30 +15159,40 @@
 #ifdef VK_EXT_hdr_metadata
 void marshal_VkXYColorEXT(
     VulkanStreamGuest* 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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkXYColorEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((float*)&forUnmarshaling->x, sizeof(float));
     vkStream->read((float*)&forUnmarshaling->y, sizeof(float));
 }
 
 void marshal_VkHdrMetadataEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkHdrMetadataEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkXYColorEXT(vkStream, (VkXYColorEXT*)(&forMarshaling->displayPrimaryRed));
-    marshal_VkXYColorEXT(vkStream, (VkXYColorEXT*)(&forMarshaling->displayPrimaryGreen));
-    marshal_VkXYColorEXT(vkStream, (VkXYColorEXT*)(&forMarshaling->displayPrimaryBlue));
-    marshal_VkXYColorEXT(vkStream, (VkXYColorEXT*)(&forMarshaling->whitePoint));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    marshal_VkXYColorEXT(vkStream, rootType, (VkXYColorEXT*)(&forMarshaling->displayPrimaryRed));
+    marshal_VkXYColorEXT(vkStream, rootType, (VkXYColorEXT*)(&forMarshaling->displayPrimaryGreen));
+    marshal_VkXYColorEXT(vkStream, rootType, (VkXYColorEXT*)(&forMarshaling->displayPrimaryBlue));
+    marshal_VkXYColorEXT(vkStream, rootType, (VkXYColorEXT*)(&forMarshaling->whitePoint));
     vkStream->write((float*)&forMarshaling->maxLuminance, sizeof(float));
     vkStream->write((float*)&forMarshaling->minLuminance, sizeof(float));
     vkStream->write((float*)&forMarshaling->maxContentLightLevel, sizeof(float));
@@ -11377,14 +15201,20 @@
 
 void unmarshal_VkHdrMetadataEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkHdrMetadataEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkXYColorEXT(vkStream, (VkXYColorEXT*)(&forUnmarshaling->displayPrimaryRed));
-    unmarshal_VkXYColorEXT(vkStream, (VkXYColorEXT*)(&forUnmarshaling->displayPrimaryGreen));
-    unmarshal_VkXYColorEXT(vkStream, (VkXYColorEXT*)(&forUnmarshaling->displayPrimaryBlue));
-    unmarshal_VkXYColorEXT(vkStream, (VkXYColorEXT*)(&forUnmarshaling->whitePoint));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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->whitePoint));
     vkStream->read((float*)&forUnmarshaling->maxLuminance, sizeof(float));
     vkStream->read((float*)&forUnmarshaling->minLuminance, sizeof(float));
     vkStream->read((float*)&forUnmarshaling->maxContentLightLevel, sizeof(float));
@@ -11395,10 +15225,16 @@
 #ifdef VK_MVK_ios_surface
 void marshal_VkIOSSurfaceCreateInfoMVK(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkIOSSurfaceCreateInfoMVK* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkIOSSurfaceCreateFlagsMVK*)&forMarshaling->flags, sizeof(VkIOSSurfaceCreateFlagsMVK));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pView;
@@ -11411,10 +15247,16 @@
 
 void unmarshal_VkIOSSurfaceCreateInfoMVK(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkIOSSurfaceCreateInfoMVK* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkIOSSurfaceCreateFlagsMVK*)&forUnmarshaling->flags, sizeof(VkIOSSurfaceCreateFlagsMVK));
     // WARNING PTR CHECK
     const void* check_pView;
@@ -11433,10 +15275,16 @@
 #ifdef VK_MVK_macos_surface
 void marshal_VkMacOSSurfaceCreateInfoMVK(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMacOSSurfaceCreateInfoMVK* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkMacOSSurfaceCreateFlagsMVK*)&forMarshaling->flags, sizeof(VkMacOSSurfaceCreateFlagsMVK));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pView;
@@ -11449,10 +15297,16 @@
 
 void unmarshal_VkMacOSSurfaceCreateInfoMVK(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMacOSSurfaceCreateInfoMVK* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkMacOSSurfaceCreateFlagsMVK*)&forUnmarshaling->flags, sizeof(VkMacOSSurfaceCreateFlagsMVK));
     // WARNING PTR CHECK
     const void* check_pView;
@@ -11477,30 +15331,48 @@
 #ifdef VK_EXT_debug_utils
 void marshal_VkDebugUtilsLabelEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugUtilsLabelEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->putString(forMarshaling->pLabelName);
     vkStream->write((float*)forMarshaling->color, 4 * sizeof(float));
 }
 
 void unmarshal_VkDebugUtilsLabelEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDebugUtilsLabelEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->loadStringInPlace((char**)&forUnmarshaling->pLabelName);
     vkStream->read((float*)forUnmarshaling->color, 4 * sizeof(float));
 }
 
 void marshal_VkDebugUtilsObjectNameInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugUtilsObjectNameInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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)
@@ -11521,10 +15393,16 @@
 
 void unmarshal_VkDebugUtilsObjectNameInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDebugUtilsObjectNameInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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)
@@ -11549,10 +15427,16 @@
 
 void marshal_VkDebugUtilsMessengerCallbackDataEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugUtilsMessengerCallbackDataEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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)
     {
@@ -11580,7 +15464,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forMarshaling->queueLabelCount; ++i)
             {
-                marshal_VkDebugUtilsLabelEXT(vkStream, (VkDebugUtilsLabelEXT*)(forMarshaling->pQueueLabels + i));
+                marshal_VkDebugUtilsLabelEXT(vkStream, rootType, (VkDebugUtilsLabelEXT*)(forMarshaling->pQueueLabels + i));
             }
         }
     }
@@ -11594,7 +15478,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forMarshaling->cmdBufLabelCount; ++i)
             {
-                marshal_VkDebugUtilsLabelEXT(vkStream, (VkDebugUtilsLabelEXT*)(forMarshaling->pCmdBufLabels + i));
+                marshal_VkDebugUtilsLabelEXT(vkStream, rootType, (VkDebugUtilsLabelEXT*)(forMarshaling->pCmdBufLabels + i));
             }
         }
     }
@@ -11608,7 +15492,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forMarshaling->objectCount; ++i)
             {
-                marshal_VkDebugUtilsObjectNameInfoEXT(vkStream, (VkDebugUtilsObjectNameInfoEXT*)(forMarshaling->pObjects + i));
+                marshal_VkDebugUtilsObjectNameInfoEXT(vkStream, rootType, (VkDebugUtilsObjectNameInfoEXT*)(forMarshaling->pObjects + i));
             }
         }
     }
@@ -11616,10 +15500,16 @@
 
 void unmarshal_VkDebugUtilsMessengerCallbackDataEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDebugUtilsMessengerCallbackDataEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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)
     {
@@ -11655,7 +15545,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->queueLabelCount; ++i)
             {
-                unmarshal_VkDebugUtilsLabelEXT(vkStream, (VkDebugUtilsLabelEXT*)(forUnmarshaling->pQueueLabels + i));
+                unmarshal_VkDebugUtilsLabelEXT(vkStream, rootType, (VkDebugUtilsLabelEXT*)(forUnmarshaling->pQueueLabels + i));
             }
         }
     }
@@ -11673,7 +15563,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->cmdBufLabelCount; ++i)
             {
-                unmarshal_VkDebugUtilsLabelEXT(vkStream, (VkDebugUtilsLabelEXT*)(forUnmarshaling->pCmdBufLabels + i));
+                unmarshal_VkDebugUtilsLabelEXT(vkStream, rootType, (VkDebugUtilsLabelEXT*)(forUnmarshaling->pCmdBufLabels + i));
             }
         }
     }
@@ -11691,7 +15581,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->objectCount; ++i)
             {
-                unmarshal_VkDebugUtilsObjectNameInfoEXT(vkStream, (VkDebugUtilsObjectNameInfoEXT*)(forUnmarshaling->pObjects + i));
+                unmarshal_VkDebugUtilsObjectNameInfoEXT(vkStream, rootType, (VkDebugUtilsObjectNameInfoEXT*)(forUnmarshaling->pObjects + i));
             }
         }
     }
@@ -11699,10 +15589,16 @@
 
 void marshal_VkDebugUtilsMessengerCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugUtilsMessengerCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -11719,10 +15615,16 @@
 
 void unmarshal_VkDebugUtilsMessengerCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDebugUtilsMessengerCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -11742,10 +15644,16 @@
 
 void marshal_VkDebugUtilsObjectTagInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugUtilsObjectTagInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
     vkStream->write((uint64_t*)&forMarshaling->tagName, sizeof(uint64_t));
@@ -11756,10 +15664,16 @@
 
 void unmarshal_VkDebugUtilsObjectTagInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDebugUtilsObjectTagInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkObjectType*)&forUnmarshaling->objectType, sizeof(VkObjectType));
     vkStream->read((uint64_t*)&forUnmarshaling->objectHandle, sizeof(uint64_t));
     vkStream->read((uint64_t*)&forUnmarshaling->tagName, sizeof(uint64_t));
@@ -11771,52 +15685,82 @@
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
 void marshal_VkAndroidHardwareBufferUsageANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAndroidHardwareBufferUsageANDROID* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint64_t*)&forMarshaling->androidHardwareBufferUsage, sizeof(uint64_t));
 }
 
 void unmarshal_VkAndroidHardwareBufferUsageANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAndroidHardwareBufferUsageANDROID* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint64_t*)&forUnmarshaling->androidHardwareBufferUsage, sizeof(uint64_t));
 }
 
 void marshal_VkAndroidHardwareBufferPropertiesANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAndroidHardwareBufferPropertiesANDROID* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkDeviceSize*)&forMarshaling->allocationSize, sizeof(VkDeviceSize));
     vkStream->write((uint32_t*)&forMarshaling->memoryTypeBits, sizeof(uint32_t));
 }
 
 void unmarshal_VkAndroidHardwareBufferPropertiesANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAndroidHardwareBufferPropertiesANDROID* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->allocationSize, sizeof(VkDeviceSize));
     vkStream->read((uint32_t*)&forUnmarshaling->memoryTypeBits, sizeof(uint32_t));
 }
 
 void marshal_VkAndroidHardwareBufferFormatPropertiesANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAndroidHardwareBufferFormatPropertiesANDROID* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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, (VkComponentMapping*)(&forMarshaling->samplerYcbcrConversionComponents));
+    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));
@@ -11825,14 +15769,20 @@
 
 void unmarshal_VkAndroidHardwareBufferFormatPropertiesANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAndroidHardwareBufferFormatPropertiesANDROID* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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, (VkComponentMapping*)(&forUnmarshaling->samplerYcbcrConversionComponents));
+    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));
@@ -11841,28 +15791,46 @@
 
 void marshal_VkImportAndroidHardwareBufferInfoANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportAndroidHardwareBufferInfoANDROID* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((AHardwareBuffer*)forMarshaling->buffer, sizeof(AHardwareBuffer));
 }
 
 void unmarshal_VkImportAndroidHardwareBufferInfoANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImportAndroidHardwareBufferInfoANDROID* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((AHardwareBuffer*)forUnmarshaling->buffer, sizeof(AHardwareBuffer));
 }
 
 void marshal_VkMemoryGetAndroidHardwareBufferInfoANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryGetAndroidHardwareBufferInfoANDROID* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -11870,10 +15838,16 @@
 
 void unmarshal_VkMemoryGetAndroidHardwareBufferInfoANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryGetAndroidHardwareBufferInfoANDROID* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(&cgen_var_0, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
@@ -11881,19 +15855,31 @@
 
 void marshal_VkExternalFormatANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalFormatANDROID* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExternalFormatANDROID* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint64_t*)&forUnmarshaling->externalFormat, sizeof(uint64_t));
 }
 
@@ -11909,30 +15895,48 @@
 #ifdef VK_EXT_inline_uniform_block
 void marshal_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceInlineUniformBlockFeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
 }
 
 void unmarshal_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceInlineUniformBlockFeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->inlineUniformBlock, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingInlineUniformBlockUpdateAfterBind, sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceInlineUniformBlockPropertiesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -11942,10 +15946,16 @@
 
 void unmarshal_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceInlineUniformBlockPropertiesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -11955,39 +15965,63 @@
 
 void marshal_VkWriteDescriptorSetInlineUniformBlockEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWriteDescriptorSetInlineUniformBlockEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
 }
 
 void unmarshal_VkWriteDescriptorSetInlineUniformBlockEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkWriteDescriptorSetInlineUniformBlockEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->dataSize, sizeof(uint32_t));
     vkStream->read((void*)forUnmarshaling->pData, forUnmarshaling->dataSize * sizeof(const uint8_t));
 }
 
 void marshal_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorPoolInlineUniformBlockCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->maxInlineUniformBlockBindings, sizeof(uint32_t));
 }
 
 void unmarshal_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDescriptorPoolInlineUniformBlockCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->maxInlineUniformBlockBindings, sizeof(uint32_t));
 }
 
@@ -11997,100 +16031,130 @@
 #ifdef VK_EXT_sample_locations
 void marshal_VkSampleLocationEXT(
     VulkanStreamGuest* 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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSampleLocationEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((float*)&forUnmarshaling->x, sizeof(float));
     vkStream->read((float*)&forUnmarshaling->y, sizeof(float));
 }
 
 void marshal_VkSampleLocationsInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSampleLocationsInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkSampleCountFlagBits*)&forMarshaling->sampleLocationsPerPixel, sizeof(VkSampleCountFlagBits));
-    marshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->sampleLocationGridSize));
+    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, (const VkSampleLocationEXT*)(forMarshaling->pSampleLocations + i));
+            marshal_VkSampleLocationEXT(vkStream, rootType, (const VkSampleLocationEXT*)(forMarshaling->pSampleLocations + i));
         }
     }
 }
 
 void unmarshal_VkSampleLocationsInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSampleLocationsInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkSampleCountFlagBits*)&forUnmarshaling->sampleLocationsPerPixel, sizeof(VkSampleCountFlagBits));
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->sampleLocationGridSize));
+    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->sampleLocationGridSize));
     vkStream->read((uint32_t*)&forUnmarshaling->sampleLocationsCount, sizeof(uint32_t));
     if (forUnmarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->sampleLocationsCount; ++i)
         {
-            unmarshal_VkSampleLocationEXT(vkStream, (VkSampleLocationEXT*)(forUnmarshaling->pSampleLocations + i));
+            unmarshal_VkSampleLocationEXT(vkStream, rootType, (VkSampleLocationEXT*)(forUnmarshaling->pSampleLocations + i));
         }
     }
 }
 
 void marshal_VkAttachmentSampleLocationsEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentSampleLocationsEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->attachmentIndex, sizeof(uint32_t));
-    marshal_VkSampleLocationsInfoEXT(vkStream, (VkSampleLocationsInfoEXT*)(&forMarshaling->sampleLocationsInfo));
+    marshal_VkSampleLocationsInfoEXT(vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forMarshaling->sampleLocationsInfo));
 }
 
 void unmarshal_VkAttachmentSampleLocationsEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAttachmentSampleLocationsEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->attachmentIndex, sizeof(uint32_t));
-    unmarshal_VkSampleLocationsInfoEXT(vkStream, (VkSampleLocationsInfoEXT*)(&forUnmarshaling->sampleLocationsInfo));
+    unmarshal_VkSampleLocationsInfoEXT(vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forUnmarshaling->sampleLocationsInfo));
 }
 
 void marshal_VkSubpassSampleLocationsEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassSampleLocationsEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->subpassIndex, sizeof(uint32_t));
-    marshal_VkSampleLocationsInfoEXT(vkStream, (VkSampleLocationsInfoEXT*)(&forMarshaling->sampleLocationsInfo));
+    marshal_VkSampleLocationsInfoEXT(vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forMarshaling->sampleLocationsInfo));
 }
 
 void unmarshal_VkSubpassSampleLocationsEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSubpassSampleLocationsEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->subpassIndex, sizeof(uint32_t));
-    unmarshal_VkSampleLocationsInfoEXT(vkStream, (VkSampleLocationsInfoEXT*)(&forUnmarshaling->sampleLocationsInfo));
+    unmarshal_VkSampleLocationsInfoEXT(vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forUnmarshaling->sampleLocationsInfo));
 }
 
 void marshal_VkRenderPassSampleLocationsBeginInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassSampleLocationsBeginInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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, (const VkAttachmentSampleLocationsEXT*)(forMarshaling->pAttachmentInitialSampleLocations + i));
+            marshal_VkAttachmentSampleLocationsEXT(vkStream, rootType, (const VkAttachmentSampleLocationsEXT*)(forMarshaling->pAttachmentInitialSampleLocations + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->postSubpassSampleLocationsCount, sizeof(uint32_t));
@@ -12098,23 +16162,29 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->postSubpassSampleLocationsCount; ++i)
         {
-            marshal_VkSubpassSampleLocationsEXT(vkStream, (const VkSubpassSampleLocationsEXT*)(forMarshaling->pPostSubpassSampleLocations + i));
+            marshal_VkSubpassSampleLocationsEXT(vkStream, rootType, (const VkSubpassSampleLocationsEXT*)(forMarshaling->pPostSubpassSampleLocations + i));
         }
     }
 }
 
 void unmarshal_VkRenderPassSampleLocationsBeginInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRenderPassSampleLocationsBeginInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->attachmentInitialSampleLocationsCount, sizeof(uint32_t));
     if (forUnmarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->attachmentInitialSampleLocationsCount; ++i)
         {
-            unmarshal_VkAttachmentSampleLocationsEXT(vkStream, (VkAttachmentSampleLocationsEXT*)(forUnmarshaling->pAttachmentInitialSampleLocations + i));
+            unmarshal_VkAttachmentSampleLocationsEXT(vkStream, rootType, (VkAttachmentSampleLocationsEXT*)(forUnmarshaling->pAttachmentInitialSampleLocations + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->postSubpassSampleLocationsCount, sizeof(uint32_t));
@@ -12122,39 +16192,57 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->postSubpassSampleLocationsCount; ++i)
         {
-            unmarshal_VkSubpassSampleLocationsEXT(vkStream, (VkSubpassSampleLocationsEXT*)(forUnmarshaling->pPostSubpassSampleLocations + i));
+            unmarshal_VkSubpassSampleLocationsEXT(vkStream, rootType, (VkSubpassSampleLocationsEXT*)(forUnmarshaling->pPostSubpassSampleLocations + i));
         }
     }
 }
 
 void marshal_VkPipelineSampleLocationsStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineSampleLocationsStateCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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, (VkSampleLocationsInfoEXT*)(&forMarshaling->sampleLocationsInfo));
+    marshal_VkSampleLocationsInfoEXT(vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forMarshaling->sampleLocationsInfo));
 }
 
 void unmarshal_VkPipelineSampleLocationsStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineSampleLocationsStateCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->sampleLocationsEnable, sizeof(VkBool32));
-    unmarshal_VkSampleLocationsInfoEXT(vkStream, (VkSampleLocationsInfoEXT*)(&forUnmarshaling->sampleLocationsInfo));
+    unmarshal_VkSampleLocationsInfoEXT(vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forUnmarshaling->sampleLocationsInfo));
 }
 
 void marshal_VkPhysicalDeviceSampleLocationsPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSampleLocationsPropertiesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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, (VkExtent2D*)(&forMarshaling->maxSampleLocationGridSize));
+    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));
@@ -12162,12 +16250,18 @@
 
 void unmarshal_VkPhysicalDeviceSampleLocationsPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceSampleLocationsPropertiesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkSampleCountFlags*)&forUnmarshaling->sampleLocationSampleCounts, sizeof(VkSampleCountFlags));
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->maxSampleLocationGridSize));
+    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));
@@ -12175,48 +16269,78 @@
 
 void marshal_VkMultisamplePropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMultisamplePropertiesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->maxSampleLocationGridSize));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->maxSampleLocationGridSize));
 }
 
 void unmarshal_VkMultisamplePropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMultisamplePropertiesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->maxSampleLocationGridSize));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxSampleLocationGridSize));
 }
 
 #endif
 #ifdef VK_EXT_blend_operation_advanced
 void marshal_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->advancedBlendCoherentOperations, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->advancedBlendCoherentOperations, sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -12227,10 +16351,16 @@
 
 void unmarshal_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -12241,10 +16371,16 @@
 
 void marshal_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineColorBlendAdvancedStateCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->srcPremultiplied, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->dstPremultiplied, sizeof(VkBool32));
     vkStream->write((VkBlendOverlapEXT*)&forMarshaling->blendOverlap, sizeof(VkBlendOverlapEXT));
@@ -12252,10 +16388,16 @@
 
 void unmarshal_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineColorBlendAdvancedStateCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->srcPremultiplied, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->dstPremultiplied, sizeof(VkBool32));
     vkStream->read((VkBlendOverlapEXT*)&forUnmarshaling->blendOverlap, sizeof(VkBlendOverlapEXT));
@@ -12265,10 +16407,16 @@
 #ifdef VK_NV_fragment_coverage_to_color
 void marshal_VkPipelineCoverageToColorStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCoverageToColorStateCreateInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((VkBool32*)&forMarshaling->coverageToColorEnable, sizeof(VkBool32));
     vkStream->write((uint32_t*)&forMarshaling->coverageToColorLocation, sizeof(uint32_t));
@@ -12276,10 +16424,16 @@
 
 void unmarshal_VkPipelineCoverageToColorStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineCoverageToColorStateCreateInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineCoverageToColorStateCreateFlagsNV*)&forUnmarshaling->flags, sizeof(VkPipelineCoverageToColorStateCreateFlagsNV));
     vkStream->read((VkBool32*)&forUnmarshaling->coverageToColorEnable, sizeof(VkBool32));
     vkStream->read((uint32_t*)&forUnmarshaling->coverageToColorLocation, sizeof(uint32_t));
@@ -12289,10 +16443,16 @@
 #ifdef VK_NV_framebuffer_mixed_samples
 void marshal_VkPipelineCoverageModulationStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCoverageModulationStateCreateInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((VkBool32*)&forMarshaling->coverageModulationTableEnable, sizeof(VkBool32));
@@ -12308,10 +16468,16 @@
 
 void unmarshal_VkPipelineCoverageModulationStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineCoverageModulationStateCreateInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineCoverageModulationStateCreateFlagsNV*)&forUnmarshaling->flags, sizeof(VkPipelineCoverageModulationStateCreateFlagsNV));
     vkStream->read((VkCoverageModulationModeNV*)&forUnmarshaling->coverageModulationMode, sizeof(VkCoverageModulationModeNV));
     vkStream->read((VkBool32*)&forUnmarshaling->coverageModulationTableEnable, sizeof(VkBool32));
@@ -12335,39 +16501,63 @@
 #ifdef VK_NV_shader_sm_builtins
 void marshal_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->shaderSMCount, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->shaderWarpsPerSM, sizeof(uint32_t));
 }
 
 void unmarshal_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->shaderSMCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->shaderWarpsPerSM, sizeof(uint32_t));
 }
 
 void marshal_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->shaderSMBuiltins, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderSMBuiltins, sizeof(VkBool32));
 }
 
@@ -12377,8 +16567,10 @@
 #ifdef VK_EXT_image_drm_format_modifier
 void marshal_VkDrmFormatModifierPropertiesEXT(
     VulkanStreamGuest* 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));
@@ -12386,8 +16578,10 @@
 
 void unmarshal_VkDrmFormatModifierPropertiesEXT(
     VulkanStreamGuest* 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));
@@ -12395,10 +16589,16 @@
 
 void marshal_VkDrmFormatModifierPropertiesListEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDrmFormatModifierPropertiesListEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pDrmFormatModifierProperties;
@@ -12409,7 +16609,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forMarshaling->drmFormatModifierCount; ++i)
             {
-                marshal_VkDrmFormatModifierPropertiesEXT(vkStream, (VkDrmFormatModifierPropertiesEXT*)(forMarshaling->pDrmFormatModifierProperties + i));
+                marshal_VkDrmFormatModifierPropertiesEXT(vkStream, rootType, (VkDrmFormatModifierPropertiesEXT*)(forMarshaling->pDrmFormatModifierProperties + i));
             }
         }
     }
@@ -12417,10 +16617,16 @@
 
 void unmarshal_VkDrmFormatModifierPropertiesListEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDrmFormatModifierPropertiesListEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->drmFormatModifierCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     VkDrmFormatModifierPropertiesEXT* check_pDrmFormatModifierProperties;
@@ -12435,7 +16641,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->drmFormatModifierCount; ++i)
             {
-                unmarshal_VkDrmFormatModifierPropertiesEXT(vkStream, (VkDrmFormatModifierPropertiesEXT*)(forUnmarshaling->pDrmFormatModifierProperties + i));
+                unmarshal_VkDrmFormatModifierPropertiesEXT(vkStream, rootType, (VkDrmFormatModifierPropertiesEXT*)(forUnmarshaling->pDrmFormatModifierProperties + i));
             }
         }
     }
@@ -12443,10 +16649,16 @@
 
 void marshal_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageDrmFormatModifierInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((VkSharingMode*)&forMarshaling->sharingMode, sizeof(VkSharingMode));
     vkStream->write((uint32_t*)&forMarshaling->queueFamilyIndexCount, sizeof(uint32_t));
@@ -12461,10 +16673,16 @@
 
 void unmarshal_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceImageDrmFormatModifierInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint64_t*)&forUnmarshaling->drmFormatModifier, sizeof(uint64_t));
     vkStream->read((VkSharingMode*)&forUnmarshaling->sharingMode, sizeof(VkSharingMode));
     vkStream->read((uint32_t*)&forUnmarshaling->queueFamilyIndexCount, sizeof(uint32_t));
@@ -12483,73 +16701,109 @@
 
 void marshal_VkImageDrmFormatModifierListCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageDrmFormatModifierListCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
 }
 
 void unmarshal_VkImageDrmFormatModifierListCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageDrmFormatModifierListCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->drmFormatModifierCount, sizeof(uint32_t));
     vkStream->read((uint64_t*)forUnmarshaling->pDrmFormatModifiers, forUnmarshaling->drmFormatModifierCount * sizeof(const uint64_t));
 }
 
 void marshal_VkImageDrmFormatModifierExplicitCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageDrmFormatModifierExplicitCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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, (const VkSubresourceLayout*)(forMarshaling->pPlaneLayouts + i));
+            marshal_VkSubresourceLayout(vkStream, rootType, (const VkSubresourceLayout*)(forMarshaling->pPlaneLayouts + i));
         }
     }
 }
 
 void unmarshal_VkImageDrmFormatModifierExplicitCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageDrmFormatModifierExplicitCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
     if (forUnmarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->drmFormatModifierPlaneCount; ++i)
         {
-            unmarshal_VkSubresourceLayout(vkStream, (VkSubresourceLayout*)(forUnmarshaling->pPlaneLayouts + i));
+            unmarshal_VkSubresourceLayout(vkStream, rootType, (VkSubresourceLayout*)(forUnmarshaling->pPlaneLayouts + i));
         }
     }
 }
 
 void marshal_VkImageDrmFormatModifierPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageDrmFormatModifierPropertiesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
 }
 
 void unmarshal_VkImageDrmFormatModifierPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageDrmFormatModifierPropertiesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint64_t*)&forUnmarshaling->drmFormatModifier, sizeof(uint64_t));
 }
 
@@ -12557,10 +16811,16 @@
 #ifdef VK_EXT_validation_cache
 void marshal_VkValidationCacheCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkValidationCacheCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkValidationCacheCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkValidationCacheCreateFlagsEXT));
     uint64_t cgen_var_0 = (uint64_t)forMarshaling->initialDataSize;
     vkStream->putBe64(cgen_var_0);
@@ -12569,10 +16829,16 @@
 
 void unmarshal_VkValidationCacheCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkValidationCacheCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkValidationCacheCreateFlagsEXT*)&forUnmarshaling->flags, sizeof(VkValidationCacheCreateFlagsEXT));
     forUnmarshaling->initialDataSize = (size_t)vkStream->getBe64();
     vkStream->read((void*)forUnmarshaling->pInitialData, forUnmarshaling->initialDataSize * sizeof(const uint8_t));
@@ -12580,10 +16846,16 @@
 
 void marshal_VkShaderModuleValidationCacheCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkShaderModuleValidationCacheCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -12591,10 +16863,16 @@
 
 void unmarshal_VkShaderModuleValidationCacheCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkShaderModuleValidationCacheCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkValidationCacheEXT(&cgen_var_0, (VkValidationCacheEXT*)&forUnmarshaling->validationCache, 1);
@@ -12608,26 +16886,36 @@
 #ifdef VK_NV_shading_rate_image
 void marshal_VkShadingRatePaletteNV(
     VulkanStreamGuest* 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));
 }
 
 void unmarshal_VkShadingRatePaletteNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkShadingRatePaletteNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->shadingRatePaletteEntryCount, sizeof(uint32_t));
     vkStream->read((VkShadingRatePaletteEntryNV*)forUnmarshaling->pShadingRatePaletteEntries, forUnmarshaling->shadingRatePaletteEntryCount * sizeof(const VkShadingRatePaletteEntryNV));
 }
 
 void marshal_VkPipelineViewportShadingRateImageStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineViewportShadingRateImageStateCreateInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->shadingRateImageEnable, sizeof(VkBool32));
     vkStream->write((uint32_t*)&forMarshaling->viewportCount, sizeof(uint32_t));
     // WARNING PTR CHECK
@@ -12639,7 +16927,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forMarshaling->viewportCount; ++i)
             {
-                marshal_VkShadingRatePaletteNV(vkStream, (const VkShadingRatePaletteNV*)(forMarshaling->pShadingRatePalettes + i));
+                marshal_VkShadingRatePaletteNV(vkStream, rootType, (const VkShadingRatePaletteNV*)(forMarshaling->pShadingRatePalettes + i));
             }
         }
     }
@@ -12647,10 +16935,16 @@
 
 void unmarshal_VkPipelineViewportShadingRateImageStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineViewportShadingRateImageStateCreateInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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
@@ -12666,7 +16960,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->viewportCount; ++i)
             {
-                unmarshal_VkShadingRatePaletteNV(vkStream, (VkShadingRatePaletteNV*)(forUnmarshaling->pShadingRatePalettes + i));
+                unmarshal_VkShadingRatePaletteNV(vkStream, rootType, (VkShadingRatePaletteNV*)(forUnmarshaling->pShadingRatePalettes + i));
             }
         }
     }
@@ -12674,50 +16968,76 @@
 
 void marshal_VkPhysicalDeviceShadingRateImageFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShadingRateImageFeaturesNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->shadingRateImage, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->shadingRateCoarseSampleOrder, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceShadingRateImageFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShadingRateImageFeaturesNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->shadingRateImage, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->shadingRateCoarseSampleOrder, sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceShadingRateImagePropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShadingRateImagePropertiesNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->shadingRateTexelSize));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->shadingRateTexelSize));
     vkStream->write((uint32_t*)&forMarshaling->shadingRatePaletteSize, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->shadingRateMaxCoarseSamples, sizeof(uint32_t));
 }
 
 void unmarshal_VkPhysicalDeviceShadingRateImagePropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShadingRateImagePropertiesNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forUnmarshaling->shadingRateTexelSize));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->shadingRateTexelSize));
     vkStream->read((uint32_t*)&forUnmarshaling->shadingRatePaletteSize, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->shadingRateMaxCoarseSamples, sizeof(uint32_t));
 }
 
 void marshal_VkCoarseSampleLocationNV(
     VulkanStreamGuest* 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));
@@ -12725,8 +17045,10 @@
 
 void unmarshal_VkCoarseSampleLocationNV(
     VulkanStreamGuest* 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));
@@ -12734,8 +17056,10 @@
 
 void marshal_VkCoarseSampleOrderCustomNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCoarseSampleOrderCustomNV* forMarshaling)
 {
+    (void)rootType;
     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));
@@ -12743,15 +17067,17 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->sampleLocationCount; ++i)
         {
-            marshal_VkCoarseSampleLocationNV(vkStream, (const VkCoarseSampleLocationNV*)(forMarshaling->pSampleLocations + i));
+            marshal_VkCoarseSampleLocationNV(vkStream, rootType, (const VkCoarseSampleLocationNV*)(forMarshaling->pSampleLocations + i));
         }
     }
 }
 
 void unmarshal_VkCoarseSampleOrderCustomNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCoarseSampleOrderCustomNV* forUnmarshaling)
 {
+    (void)rootType;
     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));
@@ -12759,41 +17085,53 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->sampleLocationCount; ++i)
         {
-            unmarshal_VkCoarseSampleLocationNV(vkStream, (VkCoarseSampleLocationNV*)(forUnmarshaling->pSampleLocations + i));
+            unmarshal_VkCoarseSampleLocationNV(vkStream, rootType, (VkCoarseSampleLocationNV*)(forUnmarshaling->pSampleLocations + i));
         }
     }
 }
 
 void marshal_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->customSampleOrderCount, sizeof(uint32_t));
     if (forMarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->customSampleOrderCount; ++i)
         {
-            marshal_VkCoarseSampleOrderCustomNV(vkStream, (const VkCoarseSampleOrderCustomNV*)(forMarshaling->pCustomSampleOrders + i));
+            marshal_VkCoarseSampleOrderCustomNV(vkStream, rootType, (const VkCoarseSampleOrderCustomNV*)(forMarshaling->pCustomSampleOrders + i));
         }
     }
 }
 
 void unmarshal_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkCoarseSampleOrderTypeNV*)&forUnmarshaling->sampleOrderType, sizeof(VkCoarseSampleOrderTypeNV));
     vkStream->read((uint32_t*)&forUnmarshaling->customSampleOrderCount, sizeof(uint32_t));
     if (forUnmarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->customSampleOrderCount; ++i)
         {
-            unmarshal_VkCoarseSampleOrderCustomNV(vkStream, (VkCoarseSampleOrderCustomNV*)(forUnmarshaling->pCustomSampleOrders + i));
+            unmarshal_VkCoarseSampleOrderCustomNV(vkStream, rootType, (VkCoarseSampleOrderCustomNV*)(forUnmarshaling->pCustomSampleOrders + i));
         }
     }
 }
@@ -12802,10 +17140,16 @@
 #ifdef VK_NV_ray_tracing
 void marshal_VkRayTracingShaderGroupCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRayTracingShaderGroupCreateInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->generalShader, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->closestHitShader, sizeof(uint32_t));
@@ -12815,10 +17159,16 @@
 
 void unmarshal_VkRayTracingShaderGroupCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRayTracingShaderGroupCreateInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     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));
@@ -12828,17 +17178,23 @@
 
 void marshal_VkRayTracingPipelineCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRayTracingPipelineCreateInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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, (const VkPipelineShaderStageCreateInfo*)(forMarshaling->pStages + i));
+            marshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (const VkPipelineShaderStageCreateInfo*)(forMarshaling->pStages + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->groupCount, sizeof(uint32_t));
@@ -12846,7 +17202,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->groupCount; ++i)
         {
-            marshal_VkRayTracingShaderGroupCreateInfoNV(vkStream, (const VkRayTracingShaderGroupCreateInfoNV*)(forMarshaling->pGroups + i));
+            marshal_VkRayTracingShaderGroupCreateInfoNV(vkStream, rootType, (const VkRayTracingShaderGroupCreateInfoNV*)(forMarshaling->pGroups + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->maxRecursionDepth, sizeof(uint32_t));
@@ -12861,17 +17217,23 @@
 
 void unmarshal_VkRayTracingPipelineCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRayTracingPipelineCreateInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->stageCount, sizeof(uint32_t));
     if (forUnmarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->stageCount; ++i)
         {
-            unmarshal_VkPipelineShaderStageCreateInfo(vkStream, (VkPipelineShaderStageCreateInfo*)(forUnmarshaling->pStages + i));
+            unmarshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (VkPipelineShaderStageCreateInfo*)(forUnmarshaling->pStages + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->groupCount, sizeof(uint32_t));
@@ -12879,7 +17241,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->groupCount; ++i)
         {
-            unmarshal_VkRayTracingShaderGroupCreateInfoNV(vkStream, (VkRayTracingShaderGroupCreateInfoNV*)(forUnmarshaling->pGroups + i));
+            unmarshal_VkRayTracingShaderGroupCreateInfoNV(vkStream, rootType, (VkRayTracingShaderGroupCreateInfoNV*)(forUnmarshaling->pGroups + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->maxRecursionDepth, sizeof(uint32_t));
@@ -12894,10 +17256,16 @@
 
 void marshal_VkGeometryTrianglesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGeometryTrianglesNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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_VkBuffer_u64(&forMarshaling->vertexData, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -12919,10 +17287,16 @@
 
 void unmarshal_VkGeometryTrianglesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkGeometryTrianglesNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0, (VkBuffer*)&forUnmarshaling->vertexData, 1);
@@ -12944,10 +17318,16 @@
 
 void marshal_VkGeometryAABBNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGeometryAABBNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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_VkBuffer_u64(&forMarshaling->aabbData, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -12958,10 +17338,16 @@
 
 void unmarshal_VkGeometryAABBNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkGeometryAABBNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0, (VkBuffer*)&forUnmarshaling->aabbData, 1);
@@ -12972,48 +17358,70 @@
 
 void marshal_VkGeometryDataNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGeometryDataNV* forMarshaling)
 {
-    marshal_VkGeometryTrianglesNV(vkStream, (VkGeometryTrianglesNV*)(&forMarshaling->triangles));
-    marshal_VkGeometryAABBNV(vkStream, (VkGeometryAABBNV*)(&forMarshaling->aabbs));
+    (void)rootType;
+    marshal_VkGeometryTrianglesNV(vkStream, rootType, (VkGeometryTrianglesNV*)(&forMarshaling->triangles));
+    marshal_VkGeometryAABBNV(vkStream, rootType, (VkGeometryAABBNV*)(&forMarshaling->aabbs));
 }
 
 void unmarshal_VkGeometryDataNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkGeometryDataNV* forUnmarshaling)
 {
-    unmarshal_VkGeometryTrianglesNV(vkStream, (VkGeometryTrianglesNV*)(&forUnmarshaling->triangles));
-    unmarshal_VkGeometryAABBNV(vkStream, (VkGeometryAABBNV*)(&forUnmarshaling->aabbs));
+    (void)rootType;
+    unmarshal_VkGeometryTrianglesNV(vkStream, rootType, (VkGeometryTrianglesNV*)(&forUnmarshaling->triangles));
+    unmarshal_VkGeometryAABBNV(vkStream, rootType, (VkGeometryAABBNV*)(&forUnmarshaling->aabbs));
 }
 
 void marshal_VkGeometryNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGeometryNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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_VkGeometryDataNV(vkStream, (VkGeometryDataNV*)(&forMarshaling->geometry));
+    marshal_VkGeometryDataNV(vkStream, rootType, (VkGeometryDataNV*)(&forMarshaling->geometry));
     vkStream->write((VkGeometryFlagsKHR*)&forMarshaling->flags, sizeof(VkGeometryFlagsKHR));
 }
 
 void unmarshal_VkGeometryNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkGeometryNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkGeometryTypeKHR*)&forUnmarshaling->geometryType, sizeof(VkGeometryTypeKHR));
-    unmarshal_VkGeometryDataNV(vkStream, (VkGeometryDataNV*)(&forUnmarshaling->geometry));
+    unmarshal_VkGeometryDataNV(vkStream, rootType, (VkGeometryDataNV*)(&forUnmarshaling->geometry));
     vkStream->read((VkGeometryFlagsKHR*)&forUnmarshaling->flags, sizeof(VkGeometryFlagsKHR));
 }
 
 void marshal_VkAccelerationStructureInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->instanceCount, sizeof(uint32_t));
@@ -13022,17 +17430,23 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->geometryCount; ++i)
         {
-            marshal_VkGeometryNV(vkStream, (const VkGeometryNV*)(forMarshaling->pGeometries + i));
+            marshal_VkGeometryNV(vkStream, rootType, (const VkGeometryNV*)(forMarshaling->pGeometries + i));
         }
     }
 }
 
 void unmarshal_VkAccelerationStructureInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkAccelerationStructureTypeNV*)&forUnmarshaling->type, sizeof(VkAccelerationStructureTypeNV));
     vkStream->read((VkBuildAccelerationStructureFlagsNV*)&forUnmarshaling->flags, sizeof(VkBuildAccelerationStructureFlagsNV));
     vkStream->read((uint32_t*)&forUnmarshaling->instanceCount, sizeof(uint32_t));
@@ -13041,37 +17455,55 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->geometryCount; ++i)
         {
-            unmarshal_VkGeometryNV(vkStream, (VkGeometryNV*)(forUnmarshaling->pGeometries + i));
+            unmarshal_VkGeometryNV(vkStream, rootType, (VkGeometryNV*)(forUnmarshaling->pGeometries + i));
         }
     }
 }
 
 void marshal_VkAccelerationStructureCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureCreateInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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, (VkAccelerationStructureInfoNV*)(&forMarshaling->info));
+    marshal_VkAccelerationStructureInfoNV(vkStream, rootType, (VkAccelerationStructureInfoNV*)(&forMarshaling->info));
 }
 
 void unmarshal_VkAccelerationStructureCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureCreateInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->compactedSize, sizeof(VkDeviceSize));
-    unmarshal_VkAccelerationStructureInfoNV(vkStream, (VkAccelerationStructureInfoNV*)(&forUnmarshaling->info));
+    unmarshal_VkAccelerationStructureInfoNV(vkStream, rootType, (VkAccelerationStructureInfoNV*)(&forUnmarshaling->info));
 }
 
 void marshal_VkBindAccelerationStructureMemoryInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindAccelerationStructureMemoryInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -13085,10 +17517,16 @@
 
 void unmarshal_VkBindAccelerationStructureMemoryInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBindAccelerationStructureMemoryInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkAccelerationStructureNV(&cgen_var_0, (VkAccelerationStructureNV*)&forUnmarshaling->accelerationStructure, 1);
@@ -13102,10 +17540,16 @@
 
 void marshal_VkWriteDescriptorSetAccelerationStructureNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWriteDescriptorSetAccelerationStructureNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->accelerationStructureCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pAccelerationStructures;
@@ -13124,10 +17568,16 @@
 
 void unmarshal_VkWriteDescriptorSetAccelerationStructureNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkWriteDescriptorSetAccelerationStructureNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->accelerationStructureCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     const VkAccelerationStructureNV* check_pAccelerationStructures;
@@ -13150,10 +17600,16 @@
 
 void marshal_VkAccelerationStructureMemoryRequirementsInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureMemoryRequirementsInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkAccelerationStructureMemoryRequirementsTypeNV*)&forMarshaling->type, sizeof(VkAccelerationStructureMemoryRequirementsTypeNV));
     uint64_t cgen_var_0;
     vkStream->handleMapping()->mapHandles_VkAccelerationStructureNV_u64(&forMarshaling->accelerationStructure, &cgen_var_0, 1);
@@ -13162,10 +17618,16 @@
 
 void unmarshal_VkAccelerationStructureMemoryRequirementsInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureMemoryRequirementsInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkAccelerationStructureMemoryRequirementsTypeNV*)&forUnmarshaling->type, sizeof(VkAccelerationStructureMemoryRequirementsTypeNV));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
@@ -13174,10 +17636,16 @@
 
 void marshal_VkPhysicalDeviceRayTracingPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPropertiesNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->shaderGroupHandleSize, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxRecursionDepth, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxShaderGroupStride, sizeof(uint32_t));
@@ -13190,10 +17658,16 @@
 
 void unmarshal_VkPhysicalDeviceRayTracingPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceRayTracingPropertiesNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->shaderGroupHandleSize, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxRecursionDepth, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxShaderGroupStride, sizeof(uint32_t));
@@ -13206,22 +17680,28 @@
 
 void marshal_VkTransformMatrixKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkTransformMatrixKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((float*)forMarshaling->matrix, ((3)*(4)) * sizeof(float));
 }
 
 void unmarshal_VkTransformMatrixKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkTransformMatrixKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((float*)forUnmarshaling->matrix, ((3)*(4)) * sizeof(float));
 }
 
 void marshal_VkAabbPositionsKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAabbPositionsKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((float*)&forMarshaling->minX, sizeof(float));
     vkStream->write((float*)&forMarshaling->minY, sizeof(float));
     vkStream->write((float*)&forMarshaling->minZ, sizeof(float));
@@ -13232,8 +17712,10 @@
 
 void unmarshal_VkAabbPositionsKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAabbPositionsKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((float*)&forUnmarshaling->minX, sizeof(float));
     vkStream->read((float*)&forUnmarshaling->minY, sizeof(float));
     vkStream->read((float*)&forUnmarshaling->minZ, sizeof(float));
@@ -13244,8 +17726,10 @@
 
 void marshal_VkAccelerationStructureInstanceKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureInstanceKHR* forMarshaling)
 {
+    (void)rootType;
     
     typedef struct VkAccelerationStructureInstanceKHRWithoutBitFields {
         VkTransformMatrixKHR          transform;
@@ -13254,7 +17738,7 @@
     } VkAccelerationStructureInstanceKHRWithoutBitFields;
     
     const VkAccelerationStructureInstanceKHRWithoutBitFields* forMarshaling_new = (const VkAccelerationStructureInstanceKHRWithoutBitFields*)(forMarshaling);
-    marshal_VkTransformMatrixKHR(vkStream, (VkTransformMatrixKHR*)(&forMarshaling_new->transform));
+    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));
     }
@@ -13264,8 +17748,10 @@
 
 void unmarshal_VkAccelerationStructureInstanceKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureInstanceKHR* forUnmarshaling)
 {
+    (void)rootType;
     
     typedef struct VkAccelerationStructureInstanceKHRWithoutBitFields {
         VkTransformMatrixKHR          transform;
@@ -13274,7 +17760,7 @@
     } VkAccelerationStructureInstanceKHRWithoutBitFields;
     
     VkAccelerationStructureInstanceKHRWithoutBitFields* forUnmarshaling_new = (VkAccelerationStructureInstanceKHRWithoutBitFields*)(forUnmarshaling);
-    unmarshal_VkTransformMatrixKHR(vkStream, (VkTransformMatrixKHR*)(&forUnmarshaling_new->transform));
+    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));
     }
@@ -13286,37 +17772,61 @@
 #ifdef VK_NV_representative_fragment_test
 void marshal_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->representativeFragmentTest, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->representativeFragmentTest, sizeof(VkBool32));
 }
 
 void marshal_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRepresentativeFragmentTestStateCreateInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->representativeFragmentTestEnable, sizeof(VkBool32));
 }
 
 void unmarshal_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineRepresentativeFragmentTestStateCreateInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->representativeFragmentTestEnable, sizeof(VkBool32));
 }
 
@@ -13324,38 +17834,62 @@
 #ifdef VK_EXT_filter_cubic
 void marshal_VkPhysicalDeviceImageViewImageFormatInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageViewImageFormatInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkImageViewType*)&forMarshaling->imageViewType, sizeof(VkImageViewType));
 }
 
 void unmarshal_VkPhysicalDeviceImageViewImageFormatInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceImageViewImageFormatInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkImageViewType*)&forUnmarshaling->imageViewType, sizeof(VkImageViewType));
 }
 
 void marshal_VkFilterCubicImageViewImageFormatPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFilterCubicImageViewImageFormatPropertiesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->filterCubic, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->filterCubicMinmax, sizeof(VkBool32));
 }
 
 void unmarshal_VkFilterCubicImageViewImageFormatPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkFilterCubicImageViewImageFormatPropertiesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->filterCubic, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->filterCubicMinmax, sizeof(VkBool32));
 }
@@ -13366,19 +17900,31 @@
 #ifdef VK_EXT_global_priority
 void marshal_VkDeviceQueueGlobalPriorityCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceQueueGlobalPriorityCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkQueueGlobalPriorityEXT*)&forMarshaling->globalPriority, sizeof(VkQueueGlobalPriorityEXT));
 }
 
 void unmarshal_VkDeviceQueueGlobalPriorityCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceQueueGlobalPriorityCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkQueueGlobalPriorityEXT*)&forUnmarshaling->globalPriority, sizeof(VkQueueGlobalPriorityEXT));
 }
 
@@ -13386,10 +17932,16 @@
 #ifdef VK_EXT_external_memory_host
 void marshal_VkImportMemoryHostPointerInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportMemoryHostPointerInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pHostPointer;
@@ -13402,10 +17954,16 @@
 
 void unmarshal_VkImportMemoryHostPointerInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImportMemoryHostPointerInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
     // WARNING PTR CHECK
     void* check_pHostPointer;
@@ -13422,37 +17980,61 @@
 
 void marshal_VkMemoryHostPointerPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryHostPointerPropertiesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryHostPointerPropertiesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->memoryTypeBits, sizeof(uint32_t));
 }
 
 void marshal_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalMemoryHostPropertiesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkDeviceSize*)&forMarshaling->minImportedHostPointerAlignment, sizeof(VkDeviceSize));
 }
 
 void unmarshal_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceExternalMemoryHostPropertiesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->minImportedHostPointerAlignment, sizeof(VkDeviceSize));
 }
 
@@ -13462,19 +18044,31 @@
 #ifdef VK_AMD_pipeline_compiler_control
 void marshal_VkPipelineCompilerControlCreateInfoAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCompilerControlCreateInfoAMD* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkPipelineCompilerControlFlagsAMD*)&forMarshaling->compilerControlFlags, sizeof(VkPipelineCompilerControlFlagsAMD));
 }
 
 void unmarshal_VkPipelineCompilerControlCreateInfoAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineCompilerControlCreateInfoAMD* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineCompilerControlFlagsAMD*)&forUnmarshaling->compilerControlFlags, sizeof(VkPipelineCompilerControlFlagsAMD));
 }
 
@@ -13482,19 +18076,31 @@
 #ifdef VK_EXT_calibrated_timestamps
 void marshal_VkCalibratedTimestampInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCalibratedTimestampInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCalibratedTimestampInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkTimeDomainEXT*)&forUnmarshaling->timeDomain, sizeof(VkTimeDomainEXT));
 }
 
@@ -13502,10 +18108,16 @@
 #ifdef VK_AMD_shader_core_properties
 void marshal_VkPhysicalDeviceShaderCorePropertiesAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderCorePropertiesAMD* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->shaderEngineCount, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->shaderArraysPerEngineCount, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->computeUnitsPerShaderArray, sizeof(uint32_t));
@@ -13524,10 +18136,16 @@
 
 void unmarshal_VkPhysicalDeviceShaderCorePropertiesAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderCorePropertiesAMD* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->shaderEngineCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->shaderArraysPerEngineCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->computeUnitsPerShaderArray, sizeof(uint32_t));
@@ -13548,19 +18166,31 @@
 #ifdef VK_AMD_memory_overallocation_behavior
 void marshal_VkDeviceMemoryOverallocationCreateInfoAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceMemoryOverallocationCreateInfoAMD* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkMemoryOverallocationBehaviorAMD*)&forMarshaling->overallocationBehavior, sizeof(VkMemoryOverallocationBehaviorAMD));
 }
 
 void unmarshal_VkDeviceMemoryOverallocationCreateInfoAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceMemoryOverallocationCreateInfoAMD* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkMemoryOverallocationBehaviorAMD*)&forUnmarshaling->overallocationBehavior, sizeof(VkMemoryOverallocationBehaviorAMD));
 }
 
@@ -13568,86 +18198,126 @@
 #ifdef VK_EXT_vertex_attribute_divisor
 void marshal_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->maxVertexAttribDivisor, sizeof(uint32_t));
 }
 
 void unmarshal_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->maxVertexAttribDivisor, sizeof(uint32_t));
 }
 
 void marshal_VkVertexInputBindingDivisorDescriptionEXT(
     VulkanStreamGuest* 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(
     VulkanStreamGuest* 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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineVertexInputDivisorStateCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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, (const VkVertexInputBindingDivisorDescriptionEXT*)(forMarshaling->pVertexBindingDivisors + i));
+            marshal_VkVertexInputBindingDivisorDescriptionEXT(vkStream, rootType, (const VkVertexInputBindingDivisorDescriptionEXT*)(forMarshaling->pVertexBindingDivisors + i));
         }
     }
 }
 
 void unmarshal_VkPipelineVertexInputDivisorStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineVertexInputDivisorStateCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->vertexBindingDivisorCount, sizeof(uint32_t));
     if (forUnmarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->vertexBindingDivisorCount; ++i)
         {
-            unmarshal_VkVertexInputBindingDivisorDescriptionEXT(vkStream, (VkVertexInputBindingDivisorDescriptionEXT*)(forUnmarshaling->pVertexBindingDivisors + i));
+            unmarshal_VkVertexInputBindingDivisorDescriptionEXT(vkStream, rootType, (VkVertexInputBindingDivisorDescriptionEXT*)(forUnmarshaling->pVertexBindingDivisors + i));
         }
     }
 }
 
 void marshal_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
 }
 
 void unmarshal_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->vertexAttributeInstanceRateDivisor, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->vertexAttributeInstanceRateZeroDivisor, sizeof(VkBool32));
 }
@@ -13656,19 +18326,31 @@
 #ifdef VK_GGP_frame_token
 void marshal_VkPresentFrameTokenGGP(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPresentFrameTokenGGP* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPresentFrameTokenGGP* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((GgpFrameToken*)&forUnmarshaling->frameToken, sizeof(GgpFrameToken));
 }
 
@@ -13676,50 +18358,66 @@
 #ifdef VK_EXT_pipeline_creation_feedback
 void marshal_VkPipelineCreationFeedbackEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCreationFeedbackEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkPipelineCreationFeedbackFlagsEXT*)&forMarshaling->flags, sizeof(VkPipelineCreationFeedbackFlagsEXT));
     vkStream->write((uint64_t*)&forMarshaling->duration, sizeof(uint64_t));
 }
 
 void unmarshal_VkPipelineCreationFeedbackEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineCreationFeedbackEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkPipelineCreationFeedbackFlagsEXT*)&forUnmarshaling->flags, sizeof(VkPipelineCreationFeedbackFlagsEXT));
     vkStream->read((uint64_t*)&forUnmarshaling->duration, sizeof(uint64_t));
 }
 
 void marshal_VkPipelineCreationFeedbackCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCreationFeedbackCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkPipelineCreationFeedbackEXT(vkStream, (VkPipelineCreationFeedbackEXT*)(forMarshaling->pPipelineCreationFeedback));
+    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, (VkPipelineCreationFeedbackEXT*)(forMarshaling->pPipelineStageCreationFeedbacks + i));
+            marshal_VkPipelineCreationFeedbackEXT(vkStream, rootType, (VkPipelineCreationFeedbackEXT*)(forMarshaling->pPipelineStageCreationFeedbacks + i));
         }
     }
 }
 
 void unmarshal_VkPipelineCreationFeedbackCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineCreationFeedbackCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkPipelineCreationFeedbackEXT(vkStream, (VkPipelineCreationFeedbackEXT*)(forUnmarshaling->pPipelineCreationFeedback));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkPipelineCreationFeedbackEXT(vkStream, rootType, (VkPipelineCreationFeedbackEXT*)(forUnmarshaling->pPipelineCreationFeedback));
     vkStream->read((uint32_t*)&forUnmarshaling->pipelineStageCreationFeedbackCount, sizeof(uint32_t));
     if (forUnmarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->pipelineStageCreationFeedbackCount; ++i)
         {
-            unmarshal_VkPipelineCreationFeedbackEXT(vkStream, (VkPipelineCreationFeedbackEXT*)(forUnmarshaling->pPipelineStageCreationFeedbacks + i));
+            unmarshal_VkPipelineCreationFeedbackEXT(vkStream, rootType, (VkPipelineCreationFeedbackEXT*)(forUnmarshaling->pPipelineStageCreationFeedbacks + i));
         }
     }
 }
@@ -13730,20 +18428,32 @@
 #ifdef VK_NV_compute_shader_derivatives
 void marshal_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->computeDerivativeGroupQuads, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->computeDerivativeGroupLinear, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->computeDerivativeGroupQuads, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->computeDerivativeGroupLinear, sizeof(VkBool32));
 }
@@ -13752,30 +18462,48 @@
 #ifdef VK_NV_mesh_shader
 void marshal_VkPhysicalDeviceMeshShaderFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMeshShaderFeaturesNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->taskShader, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->meshShader, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceMeshShaderFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceMeshShaderFeaturesNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->taskShader, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->meshShader, sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceMeshShaderPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMeshShaderPropertiesNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->maxDrawMeshTasksCount, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxTaskWorkGroupInvocations, sizeof(uint32_t));
     vkStream->write((uint32_t*)forMarshaling->maxTaskWorkGroupSize, 3 * sizeof(uint32_t));
@@ -13793,10 +18521,16 @@
 
 void unmarshal_VkPhysicalDeviceMeshShaderPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceMeshShaderPropertiesNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->maxDrawMeshTasksCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxTaskWorkGroupInvocations, sizeof(uint32_t));
     vkStream->read((uint32_t*)forUnmarshaling->maxTaskWorkGroupSize, 3 * sizeof(uint32_t));
@@ -13814,16 +18548,20 @@
 
 void marshal_VkDrawMeshTasksIndirectCommandNV(
     VulkanStreamGuest* 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(
     VulkanStreamGuest* 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));
 }
@@ -13832,19 +18570,31 @@
 #ifdef VK_NV_fragment_shader_barycentric
 void marshal_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->fragmentShaderBarycentric, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->fragmentShaderBarycentric, sizeof(VkBool32));
 }
 
@@ -13852,19 +18602,31 @@
 #ifdef VK_NV_shader_image_footprint
 void marshal_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderImageFootprintFeaturesNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->imageFootprint, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderImageFootprintFeaturesNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->imageFootprint, sizeof(VkBool32));
 }
 
@@ -13872,10 +18634,16 @@
 #ifdef VK_NV_scissor_exclusive
 void marshal_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineViewportExclusiveScissorStateCreateInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->exclusiveScissorCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pExclusiveScissors;
@@ -13886,7 +18654,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forMarshaling->exclusiveScissorCount; ++i)
             {
-                marshal_VkRect2D(vkStream, (const VkRect2D*)(forMarshaling->pExclusiveScissors + i));
+                marshal_VkRect2D(vkStream, rootType, (const VkRect2D*)(forMarshaling->pExclusiveScissors + i));
             }
         }
     }
@@ -13894,10 +18662,16 @@
 
 void unmarshal_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineViewportExclusiveScissorStateCreateInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->exclusiveScissorCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     const VkRect2D* check_pExclusiveScissors;
@@ -13912,7 +18686,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->exclusiveScissorCount; ++i)
             {
-                unmarshal_VkRect2D(vkStream, (VkRect2D*)(forUnmarshaling->pExclusiveScissors + i));
+                unmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(forUnmarshaling->pExclusiveScissors + i));
             }
         }
     }
@@ -13920,19 +18694,31 @@
 
 void marshal_VkPhysicalDeviceExclusiveScissorFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExclusiveScissorFeaturesNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->exclusiveScissor, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceExclusiveScissorFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceExclusiveScissorFeaturesNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->exclusiveScissor, sizeof(VkBool32));
 }
 
@@ -13940,28 +18726,46 @@
 #ifdef VK_NV_device_diagnostic_checkpoints
 void marshal_VkQueueFamilyCheckpointPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkQueueFamilyCheckpointPropertiesNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkPipelineStageFlags*)&forMarshaling->checkpointExecutionStageMask, sizeof(VkPipelineStageFlags));
 }
 
 void unmarshal_VkQueueFamilyCheckpointPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkQueueFamilyCheckpointPropertiesNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineStageFlags*)&forUnmarshaling->checkpointExecutionStageMask, sizeof(VkPipelineStageFlags));
 }
 
 void marshal_VkCheckpointDataNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCheckpointDataNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkPipelineStageFlagBits*)&forMarshaling->stage, sizeof(VkPipelineStageFlagBits));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pCheckpointMarker;
@@ -13974,10 +18778,16 @@
 
 void unmarshal_VkCheckpointDataNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCheckpointDataNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineStageFlagBits*)&forUnmarshaling->stage, sizeof(VkPipelineStageFlagBits));
     // WARNING PTR CHECK
     void* check_pCheckpointMarker;
@@ -13996,19 +18806,31 @@
 #ifdef VK_INTEL_shader_integer_functions2
 void marshal_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->shaderIntegerFunctions2, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderIntegerFunctions2, sizeof(VkBool32));
 }
 
@@ -14016,40 +18838,54 @@
 #ifdef VK_INTEL_performance_query
 void marshal_VkPerformanceValueDataINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceValueDataINTEL* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->value32, sizeof(uint32_t));
 }
 
 void unmarshal_VkPerformanceValueDataINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPerformanceValueDataINTEL* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->value32, sizeof(uint32_t));
 }
 
 void marshal_VkPerformanceValueINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceValueINTEL* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkPerformanceValueTypeINTEL*)&forMarshaling->type, sizeof(VkPerformanceValueTypeINTEL));
-    marshal_VkPerformanceValueDataINTEL(vkStream, (VkPerformanceValueDataINTEL*)(&forMarshaling->data));
+    marshal_VkPerformanceValueDataINTEL(vkStream, rootType, (VkPerformanceValueDataINTEL*)(&forMarshaling->data));
 }
 
 void unmarshal_VkPerformanceValueINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPerformanceValueINTEL* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkPerformanceValueTypeINTEL*)&forUnmarshaling->type, sizeof(VkPerformanceValueTypeINTEL));
-    unmarshal_VkPerformanceValueDataINTEL(vkStream, (VkPerformanceValueDataINTEL*)(&forUnmarshaling->data));
+    unmarshal_VkPerformanceValueDataINTEL(vkStream, rootType, (VkPerformanceValueDataINTEL*)(&forUnmarshaling->data));
 }
 
 void marshal_VkInitializePerformanceApiInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkInitializePerformanceApiInfoINTEL* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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);
@@ -14061,10 +18897,16 @@
 
 void unmarshal_VkInitializePerformanceApiInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkInitializePerformanceApiInfoINTEL* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     // WARNING PTR CHECK
     void* check_pUserData;
     check_pUserData = (void*)(uintptr_t)vkStream->getBe64();
@@ -14080,64 +18922,106 @@
 
 void marshal_VkQueryPoolPerformanceQueryCreateInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkQueryPoolPerformanceQueryCreateInfoINTEL* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkQueryPoolSamplingModeINTEL*)&forMarshaling->performanceCountersSampling, sizeof(VkQueryPoolSamplingModeINTEL));
 }
 
 void unmarshal_VkQueryPoolPerformanceQueryCreateInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkQueryPoolPerformanceQueryCreateInfoINTEL* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkQueryPoolSamplingModeINTEL*)&forUnmarshaling->performanceCountersSampling, sizeof(VkQueryPoolSamplingModeINTEL));
 }
 
 void marshal_VkPerformanceMarkerInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceMarkerInfoINTEL* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPerformanceMarkerInfoINTEL* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint64_t*)&forUnmarshaling->marker, sizeof(uint64_t));
 }
 
 void marshal_VkPerformanceStreamMarkerInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceStreamMarkerInfoINTEL* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->marker, sizeof(uint32_t));
 }
 
 void unmarshal_VkPerformanceStreamMarkerInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPerformanceStreamMarkerInfoINTEL* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->marker, sizeof(uint32_t));
 }
 
 void marshal_VkPerformanceOverrideInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceOverrideInfoINTEL* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((VkBool32*)&forMarshaling->enable, sizeof(VkBool32));
     vkStream->write((uint64_t*)&forMarshaling->parameter, sizeof(uint64_t));
@@ -14145,10 +19029,16 @@
 
 void unmarshal_VkPerformanceOverrideInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPerformanceOverrideInfoINTEL* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPerformanceOverrideTypeINTEL*)&forUnmarshaling->type, sizeof(VkPerformanceOverrideTypeINTEL));
     vkStream->read((VkBool32*)&forUnmarshaling->enable, sizeof(VkBool32));
     vkStream->read((uint64_t*)&forUnmarshaling->parameter, sizeof(uint64_t));
@@ -14156,19 +19046,31 @@
 
 void marshal_VkPerformanceConfigurationAcquireInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceConfigurationAcquireInfoINTEL* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkPerformanceConfigurationTypeINTEL*)&forMarshaling->type, sizeof(VkPerformanceConfigurationTypeINTEL));
 }
 
 void unmarshal_VkPerformanceConfigurationAcquireInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPerformanceConfigurationAcquireInfoINTEL* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPerformanceConfigurationTypeINTEL*)&forUnmarshaling->type, sizeof(VkPerformanceConfigurationTypeINTEL));
 }
 
@@ -14176,10 +19078,16 @@
 #ifdef VK_EXT_pci_bus_info
 void marshal_VkPhysicalDevicePCIBusInfoPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePCIBusInfoPropertiesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->pciDomain, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->pciBus, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->pciDevice, sizeof(uint32_t));
@@ -14188,10 +19096,16 @@
 
 void unmarshal_VkPhysicalDevicePCIBusInfoPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDevicePCIBusInfoPropertiesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->pciDomain, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->pciBus, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->pciDevice, sizeof(uint32_t));
@@ -14202,37 +19116,61 @@
 #ifdef VK_AMD_display_native_hdr
 void marshal_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayNativeHdrSurfaceCapabilitiesAMD* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->localDimmingSupport, sizeof(VkBool32));
 }
 
 void unmarshal_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayNativeHdrSurfaceCapabilitiesAMD* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->localDimmingSupport, sizeof(VkBool32));
 }
 
 void marshal_VkSwapchainDisplayNativeHdrCreateInfoAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSwapchainDisplayNativeHdrCreateInfoAMD* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->localDimmingEnable, sizeof(VkBool32));
 }
 
 void unmarshal_VkSwapchainDisplayNativeHdrCreateInfoAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSwapchainDisplayNativeHdrCreateInfoAMD* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->localDimmingEnable, sizeof(VkBool32));
 }
 
@@ -14240,20 +19178,32 @@
 #ifdef VK_FUCHSIA_imagepipe_surface
 void marshal_VkImagePipeSurfaceCreateInfoFUCHSIA(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImagePipeSurfaceCreateInfoFUCHSIA* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((zx_handle_t*)&forMarshaling->imagePipeHandle, sizeof(zx_handle_t));
 }
 
 void unmarshal_VkImagePipeSurfaceCreateInfoFUCHSIA(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImagePipeSurfaceCreateInfoFUCHSIA* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkImagePipeSurfaceCreateFlagsFUCHSIA*)&forUnmarshaling->flags, sizeof(VkImagePipeSurfaceCreateFlagsFUCHSIA));
     vkStream->read((zx_handle_t*)&forUnmarshaling->imagePipeHandle, sizeof(zx_handle_t));
 }
@@ -14262,10 +19212,16 @@
 #ifdef VK_EXT_metal_surface
 void marshal_VkMetalSurfaceCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMetalSurfaceCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkMetalSurfaceCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkMetalSurfaceCreateFlagsEXT));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pLayer;
@@ -14278,10 +19234,16 @@
 
 void unmarshal_VkMetalSurfaceCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMetalSurfaceCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkMetalSurfaceCreateFlagsEXT*)&forUnmarshaling->flags, sizeof(VkMetalSurfaceCreateFlagsEXT));
     // WARNING PTR CHECK
     const CAMetalLayer* check_pLayer;
@@ -14297,67 +19259,106 @@
 }
 
 #endif
-#ifdef VK_GOOGLE_color_buffer
-void marshal_VkImportColorBufferGOOGLE(
+#ifdef VK_EXT_fragment_density_map
+void marshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
     VulkanStreamGuest* vkStream,
-    const VkImportColorBufferGOOGLE* forMarshaling)
+    VkStructureType rootType,
+    const VkPhysicalDeviceFragmentDensityMapFeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    vkStream->write((uint32_t*)&forMarshaling->colorBuffer, sizeof(uint32_t));
+    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));
 }
 
-void unmarshal_VkImportColorBufferGOOGLE(
+void unmarshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
     VulkanStreamGuest* vkStream,
-    VkImportColorBufferGOOGLE* forUnmarshaling)
+    VkStructureType rootType,
+    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    vkStream->read((uint32_t*)&forUnmarshaling->colorBuffer, sizeof(uint32_t));
+    forUnmarshaling->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
 }
 
-void marshal_VkImportBufferGOOGLE(
+void marshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
     VulkanStreamGuest* vkStream,
-    const VkImportBufferGOOGLE* forMarshaling)
+    VkStructureType rootType,
+    const VkPhysicalDeviceFragmentDensityMapPropertiesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    vkStream->write((uint32_t*)&forMarshaling->buffer, sizeof(uint32_t));
+    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));
+    vkStream->write((VkBool32*)&forMarshaling->fragmentDensityInvocations, sizeof(VkBool32));
 }
 
-void unmarshal_VkImportBufferGOOGLE(
+void unmarshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
     VulkanStreamGuest* vkStream,
-    VkImportBufferGOOGLE* forUnmarshaling)
+    VkStructureType rootType,
+    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    vkStream->read((uint32_t*)&forUnmarshaling->buffer, sizeof(uint32_t));
+    forUnmarshaling->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->minFragmentDensityTexelSize));
+    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxFragmentDensityTexelSize));
+    vkStream->read((VkBool32*)&forUnmarshaling->fragmentDensityInvocations, sizeof(VkBool32));
 }
 
-void marshal_VkImportPhysicalAddressGOOGLE(
+void marshal_VkRenderPassFragmentDensityMapCreateInfoEXT(
     VulkanStreamGuest* vkStream,
-    const VkImportPhysicalAddressGOOGLE* forMarshaling)
+    VkStructureType rootType,
+    const VkRenderPassFragmentDensityMapCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    vkStream->write((uint64_t*)&forMarshaling->physicalAddress, sizeof(uint64_t));
-    vkStream->write((VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
-    vkStream->write((VkFormat*)&forMarshaling->format, sizeof(VkFormat));
-    vkStream->write((VkImageTiling*)&forMarshaling->tiling, sizeof(VkImageTiling));
-    vkStream->write((uint32_t*)&forMarshaling->tilingParameter, sizeof(uint32_t));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    marshal_VkAttachmentReference(vkStream, rootType, (VkAttachmentReference*)(&forMarshaling->fragmentDensityMapAttachment));
 }
 
-void unmarshal_VkImportPhysicalAddressGOOGLE(
+void unmarshal_VkRenderPassFragmentDensityMapCreateInfoEXT(
     VulkanStreamGuest* vkStream,
-    VkImportPhysicalAddressGOOGLE* forUnmarshaling)
+    VkStructureType rootType,
+    VkRenderPassFragmentDensityMapCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    vkStream->read((uint64_t*)&forUnmarshaling->physicalAddress, sizeof(uint64_t));
-    vkStream->read((VkDeviceSize*)&forUnmarshaling->size, sizeof(VkDeviceSize));
-    vkStream->read((VkFormat*)&forUnmarshaling->format, sizeof(VkFormat));
-    vkStream->read((VkImageTiling*)&forUnmarshaling->tiling, sizeof(VkImageTiling));
-    vkStream->read((uint32_t*)&forUnmarshaling->tilingParameter, sizeof(uint32_t));
+    forUnmarshaling->sType = VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT;
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkAttachmentReference(vkStream, rootType, (VkAttachmentReference*)(&forUnmarshaling->fragmentDensityMapAttachment));
 }
 
 #endif
@@ -14370,30 +19371,48 @@
 #ifdef VK_EXT_subgroup_size_control
 void marshal_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->subgroupSizeControl, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->computeFullSubgroups, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->subgroupSizeControl, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->computeFullSubgroups, sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -14402,10 +19421,16 @@
 
 void unmarshal_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -14414,19 +19439,31 @@
 
 void marshal_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->requiredSubgroupSize, sizeof(uint32_t));
 }
 
 void unmarshal_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->requiredSubgroupSize, sizeof(uint32_t));
 }
 
@@ -14434,20 +19471,32 @@
 #ifdef VK_AMD_shader_core_properties2
 void marshal_VkPhysicalDeviceShaderCoreProperties2AMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderCoreProperties2AMD* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->activeComputeUnitCount, sizeof(uint32_t));
 }
 
 void unmarshal_VkPhysicalDeviceShaderCoreProperties2AMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderCoreProperties2AMD* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkShaderCorePropertiesFlagsAMD*)&forUnmarshaling->shaderCoreFeatures, sizeof(VkShaderCorePropertiesFlagsAMD));
     vkStream->read((uint32_t*)&forUnmarshaling->activeComputeUnitCount, sizeof(uint32_t));
 }
@@ -14456,19 +19505,31 @@
 #ifdef VK_AMD_device_coherent_memory
 void marshal_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCoherentMemoryFeaturesAMD* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->deviceCoherentMemory, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceCoherentMemoryFeaturesAMD* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->deviceCoherentMemory, sizeof(VkBool32));
 }
 
@@ -14476,20 +19537,32 @@
 #ifdef VK_EXT_shader_image_atomic_int64
 void marshal_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->shaderImageInt64Atomics, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->sparseImageInt64Atomics, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderImageInt64Atomics, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->sparseImageInt64Atomics, sizeof(VkBool32));
 }
@@ -14498,20 +19571,32 @@
 #ifdef VK_EXT_memory_budget
 void marshal_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryBudgetPropertiesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
 }
 
 void unmarshal_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceMemoryBudgetPropertiesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
 }
@@ -14520,37 +19605,61 @@
 #ifdef VK_EXT_memory_priority
 void marshal_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryPriorityFeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->memoryPriority, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceMemoryPriorityFeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->memoryPriority, sizeof(VkBool32));
 }
 
 void marshal_VkMemoryPriorityAllocateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryPriorityAllocateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryPriorityAllocateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((float*)&forUnmarshaling->priority, sizeof(float));
 }
 
@@ -14558,19 +19667,31 @@
 #ifdef VK_NV_dedicated_allocation_image_aliasing
 void marshal_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->dedicatedAllocationImageAliasing, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->dedicatedAllocationImageAliasing, sizeof(VkBool32));
 }
 
@@ -14578,10 +19699,16 @@
 #ifdef VK_EXT_buffer_device_address
 void marshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->bufferDeviceAddress, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->bufferDeviceAddressCaptureReplay, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->bufferDeviceAddressMultiDevice, sizeof(VkBool32));
@@ -14589,10 +19716,16 @@
 
 void unmarshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->bufferDeviceAddress, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->bufferDeviceAddressCaptureReplay, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->bufferDeviceAddressMultiDevice, sizeof(VkBool32));
@@ -14600,19 +19733,31 @@
 
 void marshal_VkBufferDeviceAddressCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferDeviceAddressCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkDeviceAddress*)&forMarshaling->deviceAddress, sizeof(VkDeviceAddress));
 }
 
 void unmarshal_VkBufferDeviceAddressCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBufferDeviceAddressCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkDeviceAddress*)&forUnmarshaling->deviceAddress, sizeof(VkDeviceAddress));
 }
 
@@ -14620,10 +19765,16 @@
 #ifdef VK_EXT_tooling_info
 void marshal_VkPhysicalDeviceToolPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceToolPropertiesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -14633,10 +19784,16 @@
 
 void unmarshal_VkPhysicalDeviceToolPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceToolPropertiesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -14650,10 +19807,16 @@
 #ifdef VK_EXT_validation_features
 void marshal_VkValidationFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkValidationFeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->disabledValidationFeatureCount, sizeof(uint32_t));
@@ -14662,10 +19825,16 @@
 
 void unmarshal_VkValidationFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkValidationFeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->enabledValidationFeatureCount, sizeof(uint32_t));
     vkStream->read((VkValidationFeatureEnableEXT*)forUnmarshaling->pEnabledValidationFeatures, forUnmarshaling->enabledValidationFeatureCount * sizeof(const VkValidationFeatureEnableEXT));
     vkStream->read((uint32_t*)&forUnmarshaling->disabledValidationFeatureCount, sizeof(uint32_t));
@@ -14676,10 +19845,16 @@
 #ifdef VK_NV_cooperative_matrix
 void marshal_VkCooperativeMatrixPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCooperativeMatrixPropertiesNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->MSize, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->NSize, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->KSize, sizeof(uint32_t));
@@ -14692,10 +19867,16 @@
 
 void unmarshal_VkCooperativeMatrixPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCooperativeMatrixPropertiesNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->MSize, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->NSize, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->KSize, sizeof(uint32_t));
@@ -14708,39 +19889,63 @@
 
 void marshal_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCooperativeMatrixFeaturesNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
 }
 
 void unmarshal_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceCooperativeMatrixFeaturesNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->cooperativeMatrix, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->cooperativeMatrixRobustBufferAccess, sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCooperativeMatrixPropertiesNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkShaderStageFlags*)&forMarshaling->cooperativeMatrixSupportedStages, sizeof(VkShaderStageFlags));
 }
 
 void unmarshal_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceCooperativeMatrixPropertiesNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkShaderStageFlags*)&forUnmarshaling->cooperativeMatrixSupportedStages, sizeof(VkShaderStageFlags));
 }
 
@@ -14748,48 +19953,78 @@
 #ifdef VK_NV_coverage_reduction_mode
 void marshal_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCoverageReductionModeFeaturesNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->coverageReductionMode, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceCoverageReductionModeFeaturesNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->coverageReductionMode, sizeof(VkBool32));
 }
 
 void marshal_VkPipelineCoverageReductionStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCoverageReductionStateCreateInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
 }
 
 void unmarshal_VkPipelineCoverageReductionStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineCoverageReductionStateCreateInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineCoverageReductionStateCreateFlagsNV*)&forUnmarshaling->flags, sizeof(VkPipelineCoverageReductionStateCreateFlagsNV));
     vkStream->read((VkCoverageReductionModeNV*)&forUnmarshaling->coverageReductionMode, sizeof(VkCoverageReductionModeNV));
 }
 
 void marshal_VkFramebufferMixedSamplesCombinationNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFramebufferMixedSamplesCombinationNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -14798,10 +20033,16 @@
 
 void unmarshal_VkFramebufferMixedSamplesCombinationNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkFramebufferMixedSamplesCombinationNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -14812,10 +20053,16 @@
 #ifdef VK_EXT_fragment_shader_interlock
 void marshal_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -14823,10 +20070,16 @@
 
 void unmarshal_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -14836,19 +20089,31 @@
 #ifdef VK_EXT_ycbcr_image_arrays
 void marshal_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->ycbcrImageArrays, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->ycbcrImageArrays, sizeof(VkBool32));
 }
 
@@ -14856,55 +20121,91 @@
 #ifdef VK_EXT_full_screen_exclusive
 void marshal_VkSurfaceFullScreenExclusiveInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceFullScreenExclusiveInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkFullScreenExclusiveEXT*)&forMarshaling->fullScreenExclusive, sizeof(VkFullScreenExclusiveEXT));
 }
 
 void unmarshal_VkSurfaceFullScreenExclusiveInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSurfaceFullScreenExclusiveInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkFullScreenExclusiveEXT*)&forUnmarshaling->fullScreenExclusive, sizeof(VkFullScreenExclusiveEXT));
 }
 
 void marshal_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceCapabilitiesFullScreenExclusiveEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->fullScreenExclusiveSupported, sizeof(VkBool32));
 }
 
 void unmarshal_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSurfaceCapabilitiesFullScreenExclusiveEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->fullScreenExclusiveSupported, sizeof(VkBool32));
 }
 
 void marshal_VkSurfaceFullScreenExclusiveWin32InfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceFullScreenExclusiveWin32InfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((HMONITOR*)&forMarshaling->hmonitor, sizeof(HMONITOR));
 }
 
 void unmarshal_VkSurfaceFullScreenExclusiveWin32InfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSurfaceFullScreenExclusiveWin32InfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((HMONITOR*)&forUnmarshaling->hmonitor, sizeof(HMONITOR));
 }
 
@@ -14912,19 +20213,31 @@
 #ifdef VK_EXT_headless_surface
 void marshal_VkHeadlessSurfaceCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkHeadlessSurfaceCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkHeadlessSurfaceCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkHeadlessSurfaceCreateFlagsEXT));
 }
 
 void unmarshal_VkHeadlessSurfaceCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkHeadlessSurfaceCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkHeadlessSurfaceCreateFlagsEXT*)&forUnmarshaling->flags, sizeof(VkHeadlessSurfaceCreateFlagsEXT));
 }
 
@@ -14932,10 +20245,16 @@
 #ifdef VK_EXT_line_rasterization
 void marshal_VkPhysicalDeviceLineRasterizationFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceLineRasterizationFeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->rectangularLines, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->bresenhamLines, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->smoothLines, sizeof(VkBool32));
@@ -14946,10 +20265,16 @@
 
 void unmarshal_VkPhysicalDeviceLineRasterizationFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceLineRasterizationFeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->rectangularLines, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->bresenhamLines, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->smoothLines, sizeof(VkBool32));
@@ -14960,28 +20285,46 @@
 
 void marshal_VkPhysicalDeviceLineRasterizationPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceLineRasterizationPropertiesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->lineSubPixelPrecisionBits, sizeof(uint32_t));
 }
 
 void unmarshal_VkPhysicalDeviceLineRasterizationPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceLineRasterizationPropertiesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->lineSubPixelPrecisionBits, sizeof(uint32_t));
 }
 
 void marshal_VkPipelineRasterizationLineStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRasterizationLineStateCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((VkBool32*)&forMarshaling->stippledLineEnable, sizeof(VkBool32));
     vkStream->write((uint32_t*)&forMarshaling->lineStippleFactor, sizeof(uint32_t));
@@ -14990,10 +20333,16 @@
 
 void unmarshal_VkPipelineRasterizationLineStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineRasterizationLineStateCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkLineRasterizationModeEXT*)&forUnmarshaling->lineRasterizationMode, sizeof(VkLineRasterizationModeEXT));
     vkStream->read((VkBool32*)&forUnmarshaling->stippledLineEnable, sizeof(VkBool32));
     vkStream->read((uint32_t*)&forUnmarshaling->lineStippleFactor, sizeof(uint32_t));
@@ -15004,10 +20353,16 @@
 #ifdef VK_EXT_shader_atomic_float
 void marshal_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->shaderBufferFloat32Atomics, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->shaderBufferFloat32AtomicAdd, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->shaderBufferFloat64Atomics, sizeof(VkBool32));
@@ -15024,10 +20379,16 @@
 
 void unmarshal_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderBufferFloat32Atomics, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderBufferFloat32AtomicAdd, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderBufferFloat64Atomics, sizeof(VkBool32));
@@ -15048,19 +20409,31 @@
 #ifdef VK_EXT_index_type_uint8
 void marshal_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceIndexTypeUint8FeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->indexTypeUint8, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceIndexTypeUint8FeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->indexTypeUint8, sizeof(VkBool32));
 }
 
@@ -15068,19 +20441,31 @@
 #ifdef VK_EXT_extended_dynamic_state
 void marshal_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->extendedDynamicState, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->extendedDynamicState, sizeof(VkBool32));
 }
 
@@ -15088,19 +20473,31 @@
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 void marshal_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->shaderDemoteToHelperInvocation, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderDemoteToHelperInvocation, sizeof(VkBool32));
 }
 
@@ -15108,10 +20505,16 @@
 #ifdef VK_NV_device_generated_commands
 void marshal_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->maxGraphicsShaderGroupCount, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxIndirectSequenceCount, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxIndirectCommandsTokenCount, sizeof(uint32_t));
@@ -15125,10 +20528,16 @@
 
 void unmarshal_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->maxGraphicsShaderGroupCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxIndirectSequenceCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxIndirectCommandsTokenCount, sizeof(uint32_t));
@@ -15142,34 +20551,52 @@
 
 void marshal_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->deviceGeneratedCommands, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->deviceGeneratedCommands, sizeof(VkBool32));
 }
 
 void marshal_VkGraphicsShaderGroupCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGraphicsShaderGroupCreateInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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, (const VkPipelineShaderStageCreateInfo*)(forMarshaling->pStages + i));
+            marshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (const VkPipelineShaderStageCreateInfo*)(forMarshaling->pStages + i));
         }
     }
     // WARNING PTR CHECK
@@ -15177,29 +20604,35 @@
     vkStream->putBe64(cgen_var_0);
     if (forMarshaling->pVertexInputState)
     {
-        marshal_VkPipelineVertexInputStateCreateInfo(vkStream, (const VkPipelineVertexInputStateCreateInfo*)(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, (const VkPipelineTessellationStateCreateInfo*)(forMarshaling->pTessellationState));
+        marshal_VkPipelineTessellationStateCreateInfo(vkStream, rootType, (const VkPipelineTessellationStateCreateInfo*)(forMarshaling->pTessellationState));
     }
 }
 
 void unmarshal_VkGraphicsShaderGroupCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkGraphicsShaderGroupCreateInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->stageCount, sizeof(uint32_t));
     if (forUnmarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->stageCount; ++i)
         {
-            unmarshal_VkPipelineShaderStageCreateInfo(vkStream, (VkPipelineShaderStageCreateInfo*)(forUnmarshaling->pStages + i));
+            unmarshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (VkPipelineShaderStageCreateInfo*)(forUnmarshaling->pStages + i));
         }
     }
     // WARNING PTR CHECK
@@ -15211,7 +20644,7 @@
         {
             fprintf(stderr, "fatal: forUnmarshaling->pVertexInputState inconsistent between guest and host\n");
         }
-        unmarshal_VkPipelineVertexInputStateCreateInfo(vkStream, (VkPipelineVertexInputStateCreateInfo*)(forUnmarshaling->pVertexInputState));
+        unmarshal_VkPipelineVertexInputStateCreateInfo(vkStream, rootType, (VkPipelineVertexInputStateCreateInfo*)(forUnmarshaling->pVertexInputState));
     }
     // WARNING PTR CHECK
     const VkPipelineTessellationStateCreateInfo* check_pTessellationState;
@@ -15222,22 +20655,28 @@
         {
             fprintf(stderr, "fatal: forUnmarshaling->pTessellationState inconsistent between guest and host\n");
         }
-        unmarshal_VkPipelineTessellationStateCreateInfo(vkStream, (VkPipelineTessellationStateCreateInfo*)(forUnmarshaling->pTessellationState));
+        unmarshal_VkPipelineTessellationStateCreateInfo(vkStream, rootType, (VkPipelineTessellationStateCreateInfo*)(forUnmarshaling->pTessellationState));
     }
 }
 
 void marshal_VkGraphicsPipelineShaderGroupsCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGraphicsPipelineShaderGroupsCreateInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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, (const VkGraphicsShaderGroupCreateInfoNV*)(forMarshaling->pGroups + i));
+            marshal_VkGraphicsShaderGroupCreateInfoNV(vkStream, rootType, (const VkGraphicsShaderGroupCreateInfoNV*)(forMarshaling->pGroups + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->pipelineCount, sizeof(uint32_t));
@@ -15252,16 +20691,22 @@
 
 void unmarshal_VkGraphicsPipelineShaderGroupsCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkGraphicsPipelineShaderGroupsCreateInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->groupCount, sizeof(uint32_t));
     if (forUnmarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->groupCount; ++i)
         {
-            unmarshal_VkGraphicsShaderGroupCreateInfoNV(vkStream, (VkGraphicsShaderGroupCreateInfoNV*)(forUnmarshaling->pGroups + i));
+            unmarshal_VkGraphicsShaderGroupCreateInfoNV(vkStream, rootType, (VkGraphicsShaderGroupCreateInfoNV*)(forUnmarshaling->pGroups + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->pipelineCount, sizeof(uint32_t));
@@ -15276,22 +20721,28 @@
 
 void marshal_VkBindShaderGroupIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindShaderGroupIndirectCommandNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->groupIndex, sizeof(uint32_t));
 }
 
 void unmarshal_VkBindShaderGroupIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBindShaderGroupIndirectCommandNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->groupIndex, sizeof(uint32_t));
 }
 
 void marshal_VkBindIndexBufferIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindIndexBufferIndirectCommandNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkDeviceAddress*)&forMarshaling->bufferAddress, sizeof(VkDeviceAddress));
     vkStream->write((uint32_t*)&forMarshaling->size, sizeof(uint32_t));
     vkStream->write((VkIndexType*)&forMarshaling->indexType, sizeof(VkIndexType));
@@ -15299,8 +20750,10 @@
 
 void unmarshal_VkBindIndexBufferIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBindIndexBufferIndirectCommandNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkDeviceAddress*)&forUnmarshaling->bufferAddress, sizeof(VkDeviceAddress));
     vkStream->read((uint32_t*)&forUnmarshaling->size, sizeof(uint32_t));
     vkStream->read((VkIndexType*)&forUnmarshaling->indexType, sizeof(VkIndexType));
@@ -15308,8 +20761,10 @@
 
 void marshal_VkBindVertexBufferIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindVertexBufferIndirectCommandNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkDeviceAddress*)&forMarshaling->bufferAddress, sizeof(VkDeviceAddress));
     vkStream->write((uint32_t*)&forMarshaling->size, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->stride, sizeof(uint32_t));
@@ -15317,8 +20772,10 @@
 
 void unmarshal_VkBindVertexBufferIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBindVertexBufferIndirectCommandNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkDeviceAddress*)&forUnmarshaling->bufferAddress, sizeof(VkDeviceAddress));
     vkStream->read((uint32_t*)&forUnmarshaling->size, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->stride, sizeof(uint32_t));
@@ -15326,22 +20783,28 @@
 
 void marshal_VkSetStateFlagsIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSetStateFlagsIndirectCommandNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->data, sizeof(uint32_t));
 }
 
 void unmarshal_VkSetStateFlagsIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSetStateFlagsIndirectCommandNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->data, sizeof(uint32_t));
 }
 
 void marshal_VkIndirectCommandsStreamNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkIndirectCommandsStreamNV* 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);
@@ -15350,8 +20813,10 @@
 
 void unmarshal_VkIndirectCommandsStreamNV(
     VulkanStreamGuest* 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);
@@ -15360,10 +20825,16 @@
 
 void marshal_VkIndirectCommandsLayoutTokenNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkIndirectCommandsLayoutTokenNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->stream, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->offset, sizeof(uint32_t));
@@ -15383,10 +20854,16 @@
 
 void unmarshal_VkIndirectCommandsLayoutTokenNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkIndirectCommandsLayoutTokenNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     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));
@@ -15406,10 +20883,16 @@
 
 void marshal_VkIndirectCommandsLayoutCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkIndirectCommandsLayoutCreateInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->tokenCount, sizeof(uint32_t));
@@ -15417,7 +20900,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->tokenCount; ++i)
         {
-            marshal_VkIndirectCommandsLayoutTokenNV(vkStream, (const VkIndirectCommandsLayoutTokenNV*)(forMarshaling->pTokens + i));
+            marshal_VkIndirectCommandsLayoutTokenNV(vkStream, rootType, (const VkIndirectCommandsLayoutTokenNV*)(forMarshaling->pTokens + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->streamCount, sizeof(uint32_t));
@@ -15426,10 +20909,16 @@
 
 void unmarshal_VkIndirectCommandsLayoutCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkIndirectCommandsLayoutCreateInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkIndirectCommandsLayoutUsageFlagsNV*)&forUnmarshaling->flags, sizeof(VkIndirectCommandsLayoutUsageFlagsNV));
     vkStream->read((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
     vkStream->read((uint32_t*)&forUnmarshaling->tokenCount, sizeof(uint32_t));
@@ -15437,7 +20926,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->tokenCount; ++i)
         {
-            unmarshal_VkIndirectCommandsLayoutTokenNV(vkStream, (VkIndirectCommandsLayoutTokenNV*)(forUnmarshaling->pTokens + i));
+            unmarshal_VkIndirectCommandsLayoutTokenNV(vkStream, rootType, (VkIndirectCommandsLayoutTokenNV*)(forUnmarshaling->pTokens + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->streamCount, sizeof(uint32_t));
@@ -15446,10 +20935,16 @@
 
 void marshal_VkGeneratedCommandsInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGeneratedCommandsInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkPipelineBindPoint*)&forMarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
     uint64_t cgen_var_0;
     vkStream->handleMapping()->mapHandles_VkPipeline_u64(&forMarshaling->pipeline, &cgen_var_0, 1);
@@ -15462,7 +20957,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->streamCount; ++i)
         {
-            marshal_VkIndirectCommandsStreamNV(vkStream, (const VkIndirectCommandsStreamNV*)(forMarshaling->pStreams + i));
+            marshal_VkIndirectCommandsStreamNV(vkStream, rootType, (const VkIndirectCommandsStreamNV*)(forMarshaling->pStreams + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->sequencesCount, sizeof(uint32_t));
@@ -15483,10 +20978,16 @@
 
 void unmarshal_VkGeneratedCommandsInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkGeneratedCommandsInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
@@ -15499,7 +21000,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->streamCount; ++i)
         {
-            unmarshal_VkIndirectCommandsStreamNV(vkStream, (VkIndirectCommandsStreamNV*)(forUnmarshaling->pStreams + i));
+            unmarshal_VkIndirectCommandsStreamNV(vkStream, rootType, (VkIndirectCommandsStreamNV*)(forUnmarshaling->pStreams + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->sequencesCount, sizeof(uint32_t));
@@ -15520,10 +21021,16 @@
 
 void marshal_VkGeneratedCommandsMemoryRequirementsInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGeneratedCommandsMemoryRequirementsInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkPipelineBindPoint*)&forMarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
     uint64_t cgen_var_0;
     vkStream->handleMapping()->mapHandles_VkPipeline_u64(&forMarshaling->pipeline, &cgen_var_0, 1);
@@ -15536,10 +21043,16 @@
 
 void unmarshal_VkGeneratedCommandsMemoryRequirementsInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkGeneratedCommandsMemoryRequirementsInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
@@ -15554,28 +21067,46 @@
 #ifdef VK_EXT_texel_buffer_alignment
 void marshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->texelBufferAlignment, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->texelBufferAlignment, sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -15584,10 +21115,16 @@
 
 void unmarshal_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -15598,68 +21135,110 @@
 #ifdef VK_QCOM_render_pass_transform
 void marshal_VkRenderPassTransformBeginInfoQCOM(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassTransformBeginInfoQCOM* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkSurfaceTransformFlagBitsKHR*)&forMarshaling->transform, sizeof(VkSurfaceTransformFlagBitsKHR));
 }
 
 void unmarshal_VkRenderPassTransformBeginInfoQCOM(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRenderPassTransformBeginInfoQCOM* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->transform, sizeof(VkSurfaceTransformFlagBitsKHR));
 }
 
 void marshal_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCommandBufferInheritanceRenderPassTransformInfoQCOM* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkSurfaceTransformFlagBitsKHR*)&forMarshaling->transform, sizeof(VkSurfaceTransformFlagBitsKHR));
-    marshal_VkRect2D(vkStream, (VkRect2D*)(&forMarshaling->renderArea));
+    marshal_VkRect2D(vkStream, rootType, (VkRect2D*)(&forMarshaling->renderArea));
 }
 
 void unmarshal_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCommandBufferInheritanceRenderPassTransformInfoQCOM* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->transform, sizeof(VkSurfaceTransformFlagBitsKHR));
-    unmarshal_VkRect2D(vkStream, (VkRect2D*)(&forUnmarshaling->renderArea));
+    unmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(&forUnmarshaling->renderArea));
 }
 
 #endif
 #ifdef VK_EXT_device_memory_report
 void marshal_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->deviceMemoryReport, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->deviceMemoryReport, sizeof(VkBool32));
 }
 
 void marshal_VkDeviceMemoryReportCallbackDataEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceMemoryReportCallbackDataEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint64_t*)&forMarshaling->memoryObjectId, sizeof(uint64_t));
@@ -15671,10 +21250,16 @@
 
 void unmarshal_VkDeviceMemoryReportCallbackDataEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceMemoryReportCallbackDataEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkDeviceMemoryReportFlagsEXT*)&forUnmarshaling->flags, sizeof(VkDeviceMemoryReportFlagsEXT));
     vkStream->read((VkDeviceMemoryReportEventTypeEXT*)&forUnmarshaling->type, sizeof(VkDeviceMemoryReportEventTypeEXT));
     vkStream->read((uint64_t*)&forUnmarshaling->memoryObjectId, sizeof(uint64_t));
@@ -15686,10 +21271,16 @@
 
 void marshal_VkDeviceDeviceMemoryReportCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceDeviceMemoryReportCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkDeviceMemoryReportFlagsEXT*)&forMarshaling->flags, sizeof(VkDeviceMemoryReportFlagsEXT));
     uint64_t cgen_var_0 = (uint64_t)forMarshaling->pfnUserCallback;
     vkStream->putBe64(cgen_var_0);
@@ -15698,10 +21289,16 @@
 
 void unmarshal_VkDeviceDeviceMemoryReportCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceDeviceMemoryReportCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkDeviceMemoryReportFlagsEXT*)&forUnmarshaling->flags, sizeof(VkDeviceMemoryReportFlagsEXT));
     forUnmarshaling->pfnUserCallback = (PFN_vkDeviceMemoryReportCallbackEXT)vkStream->getBe64();
     vkStream->read((void*)forUnmarshaling->pUserData, sizeof(uint8_t));
@@ -15711,10 +21308,16 @@
 #ifdef VK_EXT_robustness2
 void marshal_VkPhysicalDeviceRobustness2FeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRobustness2FeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->robustBufferAccess2, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->robustImageAccess2, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->nullDescriptor, sizeof(VkBool32));
@@ -15722,10 +21325,16 @@
 
 void unmarshal_VkPhysicalDeviceRobustness2FeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceRobustness2FeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->robustBufferAccess2, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->robustImageAccess2, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->nullDescriptor, sizeof(VkBool32));
@@ -15733,20 +21342,32 @@
 
 void marshal_VkPhysicalDeviceRobustness2PropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRobustness2PropertiesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
 }
 
 void unmarshal_VkPhysicalDeviceRobustness2PropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceRobustness2PropertiesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->robustStorageBufferAccessSizeAlignment, sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->robustUniformBufferAccessSizeAlignment, sizeof(VkDeviceSize));
 }
@@ -15755,58 +21376,94 @@
 #ifdef VK_EXT_custom_border_color
 void marshal_VkSamplerCustomBorderColorCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSamplerCustomBorderColorCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkClearColorValue(vkStream, (VkClearColorValue*)(&forMarshaling->customBorderColor));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    marshal_VkClearColorValue(vkStream, rootType, (VkClearColorValue*)(&forMarshaling->customBorderColor));
     vkStream->write((VkFormat*)&forMarshaling->format, sizeof(VkFormat));
 }
 
 void unmarshal_VkSamplerCustomBorderColorCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSamplerCustomBorderColorCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkClearColorValue(vkStream, (VkClearColorValue*)(&forUnmarshaling->customBorderColor));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkClearColorValue(vkStream, rootType, (VkClearColorValue*)(&forUnmarshaling->customBorderColor));
     vkStream->read((VkFormat*)&forUnmarshaling->format, sizeof(VkFormat));
 }
 
 void marshal_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCustomBorderColorPropertiesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->maxCustomBorderColorSamplers, sizeof(uint32_t));
 }
 
 void unmarshal_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceCustomBorderColorPropertiesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->maxCustomBorderColorSamplers, sizeof(uint32_t));
 }
 
 void marshal_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCustomBorderColorFeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->customBorderColors, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->customBorderColorWithoutFormat, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceCustomBorderColorFeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->customBorderColors, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->customBorderColorWithoutFormat, sizeof(VkBool32));
 }
@@ -15817,55 +21474,91 @@
 #ifdef VK_EXT_private_data
 void marshal_VkPhysicalDevicePrivateDataFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePrivateDataFeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->privateData, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDevicePrivateDataFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDevicePrivateDataFeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->privateData, sizeof(VkBool32));
 }
 
 void marshal_VkDevicePrivateDataCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDevicePrivateDataCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDevicePrivateDataCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->privateDataSlotRequestCount, sizeof(uint32_t));
 }
 
 void marshal_VkPrivateDataSlotCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPrivateDataSlotCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkPrivateDataSlotCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkPrivateDataSlotCreateFlagsEXT));
 }
 
 void unmarshal_VkPrivateDataSlotCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPrivateDataSlotCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPrivateDataSlotCreateFlagsEXT*)&forUnmarshaling->flags, sizeof(VkPrivateDataSlotCreateFlagsEXT));
 }
 
@@ -15873,19 +21566,31 @@
 #ifdef VK_EXT_pipeline_creation_cache_control
 void marshal_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->pipelineCreationCacheControl, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->pipelineCreationCacheControl, sizeof(VkBool32));
 }
 
@@ -15893,37 +21598,61 @@
 #ifdef VK_NV_device_diagnostics_config
 void marshal_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDiagnosticsConfigFeaturesNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->diagnosticsConfig, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceDiagnosticsConfigFeaturesNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->diagnosticsConfig, sizeof(VkBool32));
 }
 
 void marshal_VkDeviceDiagnosticsConfigCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceDiagnosticsConfigCreateInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkDeviceDiagnosticsConfigFlagsNV*)&forMarshaling->flags, sizeof(VkDeviceDiagnosticsConfigFlagsNV));
 }
 
 void unmarshal_VkDeviceDiagnosticsConfigCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceDiagnosticsConfigCreateInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkDeviceDiagnosticsConfigFlagsNV*)&forUnmarshaling->flags, sizeof(VkDeviceDiagnosticsConfigFlagsNV));
 }
 
@@ -15933,10 +21662,16 @@
 #ifdef VK_NV_fragment_shading_rate_enums
 void marshal_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->fragmentShadingRateEnums, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->supersampleFragmentShadingRates, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->noInvocationFragmentShadingRates, sizeof(VkBool32));
@@ -15944,10 +21679,16 @@
 
 void unmarshal_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->fragmentShadingRateEnums, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->supersampleFragmentShadingRates, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->noInvocationFragmentShadingRates, sizeof(VkBool32));
@@ -15955,28 +21696,46 @@
 
 void marshal_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkSampleCountFlagBits*)&forMarshaling->maxFragmentShadingRateInvocationCount, sizeof(VkSampleCountFlagBits));
 }
 
 void unmarshal_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkSampleCountFlagBits*)&forUnmarshaling->maxFragmentShadingRateInvocationCount, sizeof(VkSampleCountFlagBits));
 }
 
 void marshal_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineFragmentShadingRateEnumStateCreateInfoNV* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -15984,10 +21743,16 @@
 
 void unmarshal_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineFragmentShadingRateEnumStateCreateInfoNV* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -15997,28 +21762,46 @@
 #ifdef VK_EXT_fragment_density_map2
 void marshal_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->fragmentDensityMapDeferred, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->fragmentDensityMapDeferred, sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->maxSubsampledArrayLayers, sizeof(uint32_t));
@@ -16027,10 +21810,16 @@
 
 void unmarshal_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->subsampledLoads, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->subsampledCoarseReconstructionEarlyAccess, sizeof(VkBool32));
     vkStream->read((uint32_t*)&forUnmarshaling->maxSubsampledArrayLayers, sizeof(uint32_t));
@@ -16041,19 +21830,31 @@
 #ifdef VK_QCOM_rotated_copy_commands
 void marshal_VkCopyCommandTransformInfoQCOM(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyCommandTransformInfoQCOM* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkSurfaceTransformFlagBitsKHR*)&forMarshaling->transform, sizeof(VkSurfaceTransformFlagBitsKHR));
 }
 
 void unmarshal_VkCopyCommandTransformInfoQCOM(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCopyCommandTransformInfoQCOM* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->transform, sizeof(VkSurfaceTransformFlagBitsKHR));
 }
 
@@ -16061,19 +21862,31 @@
 #ifdef VK_EXT_image_robustness
 void marshal_VkPhysicalDeviceImageRobustnessFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageRobustnessFeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->robustImageAccess, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceImageRobustnessFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceImageRobustnessFeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->robustImageAccess, sizeof(VkBool32));
 }
 
@@ -16081,20 +21894,32 @@
 #ifdef VK_EXT_4444_formats
 void marshal_VkPhysicalDevice4444FormatsFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevice4444FormatsFeaturesEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->formatA4R4G4B4, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->formatA4B4G4R4, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDevice4444FormatsFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDevice4444FormatsFeaturesEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->formatA4R4G4B4, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->formatA4B4G4R4, sizeof(VkBool32));
 }
@@ -16103,10 +21928,16 @@
 #ifdef VK_EXT_directfb_surface
 void marshal_VkDirectFBSurfaceCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDirectFBSurfaceCreateInfoEXT* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkDirectFBSurfaceCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkDirectFBSurfaceCreateFlagsEXT));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->dfb;
@@ -16126,10 +21957,16 @@
 
 void unmarshal_VkDirectFBSurfaceCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDirectFBSurfaceCreateInfoEXT* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkDirectFBSurfaceCreateFlagsEXT*)&forUnmarshaling->flags, sizeof(VkDirectFBSurfaceCreateFlagsEXT));
     // WARNING PTR CHECK
     IDirectFB* check_dfb;
@@ -16157,40 +21994,151 @@
 
 #endif
 #ifdef VK_GOOGLE_gfxstream
+void marshal_VkImportColorBufferGOOGLE(
+    VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
+    const VkImportColorBufferGOOGLE* forMarshaling)
+{
+    (void)rootType;
+    vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    vkStream->write((uint32_t*)&forMarshaling->colorBuffer, sizeof(uint32_t));
+}
+
+void unmarshal_VkImportColorBufferGOOGLE(
+    VulkanStreamGuest* 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)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    vkStream->read((uint32_t*)&forUnmarshaling->colorBuffer, sizeof(uint32_t));
+}
+
+void marshal_VkImportBufferGOOGLE(
+    VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
+    const VkImportBufferGOOGLE* forMarshaling)
+{
+    (void)rootType;
+    vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    vkStream->write((uint32_t*)&forMarshaling->buffer, sizeof(uint32_t));
+}
+
+void unmarshal_VkImportBufferGOOGLE(
+    VulkanStreamGuest* 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)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    vkStream->read((uint32_t*)&forUnmarshaling->buffer, sizeof(uint32_t));
+}
+
+void marshal_VkImportPhysicalAddressGOOGLE(
+    VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
+    const VkImportPhysicalAddressGOOGLE* forMarshaling)
+{
+    (void)rootType;
+    vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    vkStream->write((uint64_t*)&forMarshaling->physicalAddress, sizeof(uint64_t));
+    vkStream->write((VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
+    vkStream->write((VkFormat*)&forMarshaling->format, sizeof(VkFormat));
+    vkStream->write((VkImageTiling*)&forMarshaling->tiling, sizeof(VkImageTiling));
+    vkStream->write((uint32_t*)&forMarshaling->tilingParameter, sizeof(uint32_t));
+}
+
+void unmarshal_VkImportPhysicalAddressGOOGLE(
+    VulkanStreamGuest* 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)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    vkStream->read((uint64_t*)&forUnmarshaling->physicalAddress, sizeof(uint64_t));
+    vkStream->read((VkDeviceSize*)&forUnmarshaling->size, sizeof(VkDeviceSize));
+    vkStream->read((VkFormat*)&forUnmarshaling->format, sizeof(VkFormat));
+    vkStream->read((VkImageTiling*)&forUnmarshaling->tiling, sizeof(VkImageTiling));
+    vkStream->read((uint32_t*)&forUnmarshaling->tilingParameter, sizeof(uint32_t));
+}
+
 #endif
 #ifdef VK_KHR_acceleration_structure
 void marshal_VkDeviceOrHostAddressKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceOrHostAddressKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkDeviceAddress*)&forMarshaling->deviceAddress, sizeof(VkDeviceAddress));
 }
 
 void unmarshal_VkDeviceOrHostAddressKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceOrHostAddressKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkDeviceAddress*)&forUnmarshaling->deviceAddress, sizeof(VkDeviceAddress));
 }
 
 void marshal_VkDeviceOrHostAddressConstKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceOrHostAddressConstKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkDeviceAddress*)&forMarshaling->deviceAddress, sizeof(VkDeviceAddress));
 }
 
 void unmarshal_VkDeviceOrHostAddressConstKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceOrHostAddressConstKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkDeviceAddress*)&forUnmarshaling->deviceAddress, sizeof(VkDeviceAddress));
 }
 
 void marshal_VkAccelerationStructureBuildRangeInfoKHR(
     VulkanStreamGuest* 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));
     vkStream->write((uint32_t*)&forMarshaling->firstVertex, sizeof(uint32_t));
@@ -16199,8 +22147,10 @@
 
 void unmarshal_VkAccelerationStructureBuildRangeInfoKHR(
     VulkanStreamGuest* 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));
     vkStream->read((uint32_t*)&forUnmarshaling->firstVertex, sizeof(uint32_t));
@@ -16209,116 +22159,174 @@
 
 void marshal_VkAccelerationStructureGeometryTrianglesDataKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryTrianglesDataKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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, (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, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->indexData));
-    marshal_VkDeviceOrHostAddressConstKHR(vkStream, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->transformData));
+    marshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->indexData));
+    marshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->transformData));
 }
 
 void unmarshal_VkAccelerationStructureGeometryTrianglesDataKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureGeometryTrianglesDataKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkFormat*)&forUnmarshaling->vertexFormat, sizeof(VkFormat));
-    unmarshal_VkDeviceOrHostAddressConstKHR(vkStream, (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, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->indexData));
-    unmarshal_VkDeviceOrHostAddressConstKHR(vkStream, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->transformData));
+    unmarshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->indexData));
+    unmarshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->transformData));
 }
 
 void marshal_VkAccelerationStructureGeometryAabbsDataKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryAabbsDataKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkDeviceOrHostAddressConstKHR(vkStream, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->data));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    marshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->data));
     vkStream->write((VkDeviceSize*)&forMarshaling->stride, sizeof(VkDeviceSize));
 }
 
 void unmarshal_VkAccelerationStructureGeometryAabbsDataKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureGeometryAabbsDataKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkDeviceOrHostAddressConstKHR(vkStream, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->data));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    unmarshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->data));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->stride, sizeof(VkDeviceSize));
 }
 
 void marshal_VkAccelerationStructureGeometryInstancesDataKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryInstancesDataKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->data));
+    marshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->data));
 }
 
 void unmarshal_VkAccelerationStructureGeometryInstancesDataKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureGeometryInstancesDataKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->arrayOfPointers, sizeof(VkBool32));
-    unmarshal_VkDeviceOrHostAddressConstKHR(vkStream, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->data));
+    unmarshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->data));
 }
 
 void marshal_VkAccelerationStructureGeometryDataKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryDataKHR* forMarshaling)
 {
-    marshal_VkAccelerationStructureGeometryTrianglesDataKHR(vkStream, (VkAccelerationStructureGeometryTrianglesDataKHR*)(&forMarshaling->triangles));
+    (void)rootType;
+    marshal_VkAccelerationStructureGeometryTrianglesDataKHR(vkStream, rootType, (VkAccelerationStructureGeometryTrianglesDataKHR*)(&forMarshaling->triangles));
 }
 
 void unmarshal_VkAccelerationStructureGeometryDataKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureGeometryDataKHR* forUnmarshaling)
 {
-    unmarshal_VkAccelerationStructureGeometryTrianglesDataKHR(vkStream, (VkAccelerationStructureGeometryTrianglesDataKHR*)(&forUnmarshaling->triangles));
+    (void)rootType;
+    unmarshal_VkAccelerationStructureGeometryTrianglesDataKHR(vkStream, rootType, (VkAccelerationStructureGeometryTrianglesDataKHR*)(&forUnmarshaling->triangles));
 }
 
 void marshal_VkAccelerationStructureGeometryKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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, (VkAccelerationStructureGeometryDataKHR*)(&forMarshaling->geometry));
+    marshal_VkAccelerationStructureGeometryDataKHR(vkStream, rootType, (VkAccelerationStructureGeometryDataKHR*)(&forMarshaling->geometry));
     vkStream->write((VkGeometryFlagsKHR*)&forMarshaling->flags, sizeof(VkGeometryFlagsKHR));
 }
 
 void unmarshal_VkAccelerationStructureGeometryKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureGeometryKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkGeometryTypeKHR*)&forUnmarshaling->geometryType, sizeof(VkGeometryTypeKHR));
-    unmarshal_VkAccelerationStructureGeometryDataKHR(vkStream, (VkAccelerationStructureGeometryDataKHR*)(&forUnmarshaling->geometry));
+    unmarshal_VkAccelerationStructureGeometryDataKHR(vkStream, rootType, (VkAccelerationStructureGeometryDataKHR*)(&forUnmarshaling->geometry));
     vkStream->read((VkGeometryFlagsKHR*)&forUnmarshaling->flags, sizeof(VkGeometryFlagsKHR));
 }
 
 void marshal_VkAccelerationStructureBuildGeometryInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureBuildGeometryInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -16338,19 +22346,25 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forMarshaling->geometryCount; ++i)
             {
-                marshal_VkAccelerationStructureGeometryKHR(vkStream, (const VkAccelerationStructureGeometryKHR*)(forMarshaling->pGeometries + i));
+                marshal_VkAccelerationStructureGeometryKHR(vkStream, rootType, (const VkAccelerationStructureGeometryKHR*)(forMarshaling->pGeometries + i));
             }
         }
     }
-    marshal_VkDeviceOrHostAddressKHR(vkStream, (VkDeviceOrHostAddressKHR*)(&forMarshaling->scratchData));
+    marshal_VkDeviceOrHostAddressKHR(vkStream, rootType, (VkDeviceOrHostAddressKHR*)(&forMarshaling->scratchData));
 }
 
 void unmarshal_VkAccelerationStructureBuildGeometryInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureBuildGeometryInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -16374,19 +22388,25 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->geometryCount; ++i)
             {
-                unmarshal_VkAccelerationStructureGeometryKHR(vkStream, (VkAccelerationStructureGeometryKHR*)(forUnmarshaling->pGeometries + i));
+                unmarshal_VkAccelerationStructureGeometryKHR(vkStream, rootType, (VkAccelerationStructureGeometryKHR*)(forUnmarshaling->pGeometries + i));
             }
         }
     }
-    unmarshal_VkDeviceOrHostAddressKHR(vkStream, (VkDeviceOrHostAddressKHR*)(&forUnmarshaling->scratchData));
+    unmarshal_VkDeviceOrHostAddressKHR(vkStream, rootType, (VkDeviceOrHostAddressKHR*)(&forUnmarshaling->scratchData));
 }
 
 void marshal_VkAccelerationStructureCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureCreateInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkAccelerationStructureCreateFlagsKHR*)&forMarshaling->createFlags, sizeof(VkAccelerationStructureCreateFlagsKHR));
     uint64_t cgen_var_0;
     vkStream->handleMapping()->mapHandles_VkBuffer_u64(&forMarshaling->buffer, &cgen_var_0, 1);
@@ -16399,10 +22419,16 @@
 
 void unmarshal_VkAccelerationStructureCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureCreateInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkAccelerationStructureCreateFlagsKHR*)&forUnmarshaling->createFlags, sizeof(VkAccelerationStructureCreateFlagsKHR));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
@@ -16415,10 +22441,16 @@
 
 void marshal_VkWriteDescriptorSetAccelerationStructureKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWriteDescriptorSetAccelerationStructureKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->accelerationStructureCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pAccelerationStructures;
@@ -16437,10 +22469,16 @@
 
 void unmarshal_VkWriteDescriptorSetAccelerationStructureKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkWriteDescriptorSetAccelerationStructureKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->accelerationStructureCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     const VkAccelerationStructureKHR* check_pAccelerationStructures;
@@ -16463,10 +22501,16 @@
 
 void marshal_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceAccelerationStructureFeaturesKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -16476,10 +22520,16 @@
 
 void unmarshal_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceAccelerationStructureFeaturesKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -16489,10 +22539,16 @@
 
 void marshal_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceAccelerationStructurePropertiesKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -16505,10 +22561,16 @@
 
 void unmarshal_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceAccelerationStructurePropertiesKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -16521,10 +22583,16 @@
 
 void marshal_VkAccelerationStructureDeviceAddressInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureDeviceAddressInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -16532,10 +22600,16 @@
 
 void unmarshal_VkAccelerationStructureDeviceAddressInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureDeviceAddressInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkAccelerationStructureKHR(&cgen_var_0, (VkAccelerationStructureKHR*)&forUnmarshaling->accelerationStructure, 1);
@@ -16543,55 +22617,85 @@
 
 void marshal_VkAccelerationStructureVersionInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureVersionInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
 }
 
 void unmarshal_VkAccelerationStructureVersionInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureVersionInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint8_t*)forUnmarshaling->pVersionData, 2*VK_UUID_SIZE * sizeof(const uint8_t));
 }
 
 void marshal_VkCopyAccelerationStructureToMemoryInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyAccelerationStructureToMemoryInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->write((uint64_t*)&cgen_var_0, 1 * 8);
-    marshal_VkDeviceOrHostAddressKHR(vkStream, (VkDeviceOrHostAddressKHR*)(&forMarshaling->dst));
+    marshal_VkDeviceOrHostAddressKHR(vkStream, rootType, (VkDeviceOrHostAddressKHR*)(&forMarshaling->dst));
     vkStream->write((VkCopyAccelerationStructureModeKHR*)&forMarshaling->mode, sizeof(VkCopyAccelerationStructureModeKHR));
 }
 
 void unmarshal_VkCopyAccelerationStructureToMemoryInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCopyAccelerationStructureToMemoryInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkAccelerationStructureKHR(&cgen_var_0, (VkAccelerationStructureKHR*)&forUnmarshaling->src, 1);
-    unmarshal_VkDeviceOrHostAddressKHR(vkStream, (VkDeviceOrHostAddressKHR*)(&forUnmarshaling->dst));
+    unmarshal_VkDeviceOrHostAddressKHR(vkStream, rootType, (VkDeviceOrHostAddressKHR*)(&forUnmarshaling->dst));
     vkStream->read((VkCopyAccelerationStructureModeKHR*)&forUnmarshaling->mode, sizeof(VkCopyAccelerationStructureModeKHR));
 }
 
 void marshal_VkCopyMemoryToAccelerationStructureInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyMemoryToAccelerationStructureInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
-    marshal_VkDeviceOrHostAddressConstKHR(vkStream, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->src));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
+    marshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->src));
     uint64_t cgen_var_0;
     vkStream->handleMapping()->mapHandles_VkAccelerationStructureKHR_u64(&forMarshaling->dst, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -16600,11 +22704,17 @@
 
 void unmarshal_VkCopyMemoryToAccelerationStructureInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCopyMemoryToAccelerationStructureInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
-    unmarshal_VkDeviceOrHostAddressConstKHR(vkStream, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->src));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
+    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);
@@ -16613,10 +22723,16 @@
 
 void marshal_VkCopyAccelerationStructureInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyAccelerationStructureInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -16628,10 +22744,16 @@
 
 void unmarshal_VkCopyAccelerationStructureInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCopyAccelerationStructureInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->handleMapping()->mapHandles_u64_VkAccelerationStructureKHR(&cgen_var_0, (VkAccelerationStructureKHR*)&forUnmarshaling->src, 1);
@@ -16643,10 +22765,16 @@
 
 void marshal_VkAccelerationStructureBuildSizesInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureBuildSizesInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkDeviceSize*)&forMarshaling->accelerationStructureSize, sizeof(VkDeviceSize));
     vkStream->write((VkDeviceSize*)&forMarshaling->updateScratchSize, sizeof(VkDeviceSize));
     vkStream->write((VkDeviceSize*)&forMarshaling->buildScratchSize, sizeof(VkDeviceSize));
@@ -16654,10 +22782,16 @@
 
 void unmarshal_VkAccelerationStructureBuildSizesInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureBuildSizesInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->accelerationStructureSize, sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->updateScratchSize, sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->buildScratchSize, sizeof(VkDeviceSize));
@@ -16667,10 +22801,16 @@
 #ifdef VK_KHR_ray_tracing_pipeline
 void marshal_VkRayTracingShaderGroupCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRayTracingShaderGroupCreateInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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((uint32_t*)&forMarshaling->generalShader, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->closestHitShader, sizeof(uint32_t));
@@ -16687,10 +22827,16 @@
 
 void unmarshal_VkRayTracingShaderGroupCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRayTracingShaderGroupCreateInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     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));
@@ -16711,37 +22857,55 @@
 
 void marshal_VkRayTracingPipelineInterfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRayTracingPipelineInterfaceCreateInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->maxPipelineRayPayloadSize, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxPipelineRayHitAttributeSize, sizeof(uint32_t));
 }
 
 void unmarshal_VkRayTracingPipelineInterfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRayTracingPipelineInterfaceCreateInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->maxPipelineRayPayloadSize, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxPipelineRayHitAttributeSize, sizeof(uint32_t));
 }
 
 void marshal_VkRayTracingPipelineCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRayTracingPipelineCreateInfoKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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, (const VkPipelineShaderStageCreateInfo*)(forMarshaling->pStages + i));
+            marshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (const VkPipelineShaderStageCreateInfo*)(forMarshaling->pStages + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->groupCount, sizeof(uint32_t));
@@ -16749,7 +22913,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->groupCount; ++i)
         {
-            marshal_VkRayTracingShaderGroupCreateInfoKHR(vkStream, (const VkRayTracingShaderGroupCreateInfoKHR*)(forMarshaling->pGroups + i));
+            marshal_VkRayTracingShaderGroupCreateInfoKHR(vkStream, rootType, (const VkRayTracingShaderGroupCreateInfoKHR*)(forMarshaling->pGroups + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->maxPipelineRayRecursionDepth, sizeof(uint32_t));
@@ -16758,21 +22922,21 @@
     vkStream->putBe64(cgen_var_0);
     if (forMarshaling->pLibraryInfo)
     {
-        marshal_VkPipelineLibraryCreateInfoKHR(vkStream, (const VkPipelineLibraryCreateInfoKHR*)(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, (const VkRayTracingPipelineInterfaceCreateInfoKHR*)(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, (const VkPipelineDynamicStateCreateInfo*)(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);
@@ -16785,17 +22949,23 @@
 
 void unmarshal_VkRayTracingPipelineCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRayTracingPipelineCreateInfoKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkPipelineCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->stageCount, sizeof(uint32_t));
     if (forUnmarshaling)
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->stageCount; ++i)
         {
-            unmarshal_VkPipelineShaderStageCreateInfo(vkStream, (VkPipelineShaderStageCreateInfo*)(forUnmarshaling->pStages + i));
+            unmarshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (VkPipelineShaderStageCreateInfo*)(forUnmarshaling->pStages + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->groupCount, sizeof(uint32_t));
@@ -16803,7 +22973,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->groupCount; ++i)
         {
-            unmarshal_VkRayTracingShaderGroupCreateInfoKHR(vkStream, (VkRayTracingShaderGroupCreateInfoKHR*)(forUnmarshaling->pGroups + i));
+            unmarshal_VkRayTracingShaderGroupCreateInfoKHR(vkStream, rootType, (VkRayTracingShaderGroupCreateInfoKHR*)(forUnmarshaling->pGroups + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->maxPipelineRayRecursionDepth, sizeof(uint32_t));
@@ -16816,7 +22986,7 @@
         {
             fprintf(stderr, "fatal: forUnmarshaling->pLibraryInfo inconsistent between guest and host\n");
         }
-        unmarshal_VkPipelineLibraryCreateInfoKHR(vkStream, (VkPipelineLibraryCreateInfoKHR*)(forUnmarshaling->pLibraryInfo));
+        unmarshal_VkPipelineLibraryCreateInfoKHR(vkStream, rootType, (VkPipelineLibraryCreateInfoKHR*)(forUnmarshaling->pLibraryInfo));
     }
     // WARNING PTR CHECK
     const VkRayTracingPipelineInterfaceCreateInfoKHR* check_pLibraryInterface;
@@ -16827,7 +22997,7 @@
         {
             fprintf(stderr, "fatal: forUnmarshaling->pLibraryInterface inconsistent between guest and host\n");
         }
-        unmarshal_VkRayTracingPipelineInterfaceCreateInfoKHR(vkStream, (VkRayTracingPipelineInterfaceCreateInfoKHR*)(forUnmarshaling->pLibraryInterface));
+        unmarshal_VkRayTracingPipelineInterfaceCreateInfoKHR(vkStream, rootType, (VkRayTracingPipelineInterfaceCreateInfoKHR*)(forUnmarshaling->pLibraryInterface));
     }
     // WARNING PTR CHECK
     const VkPipelineDynamicStateCreateInfo* check_pDynamicState;
@@ -16838,7 +23008,7 @@
         {
             fprintf(stderr, "fatal: forUnmarshaling->pDynamicState inconsistent between guest and host\n");
         }
-        unmarshal_VkPipelineDynamicStateCreateInfo(vkStream, (VkPipelineDynamicStateCreateInfo*)(forUnmarshaling->pDynamicState));
+        unmarshal_VkPipelineDynamicStateCreateInfo(vkStream, rootType, (VkPipelineDynamicStateCreateInfo*)(forUnmarshaling->pDynamicState));
     }
     uint64_t cgen_var_3;
     vkStream->read((uint64_t*)&cgen_var_3, 1 * 8);
@@ -16851,10 +23021,16 @@
 
 void marshal_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPipelineFeaturesKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    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));
@@ -16864,10 +23040,16 @@
 
 void unmarshal_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceRayTracingPipelineFeaturesKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    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));
@@ -16877,10 +23059,16 @@
 
 void marshal_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPipelinePropertiesKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->shaderGroupHandleSize, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxRayRecursionDepth, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxShaderGroupStride, sizeof(uint32_t));
@@ -16893,10 +23081,16 @@
 
 void unmarshal_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceRayTracingPipelinePropertiesKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((uint32_t*)&forUnmarshaling->shaderGroupHandleSize, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxRayRecursionDepth, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxShaderGroupStride, sizeof(uint32_t));
@@ -16909,8 +23103,10 @@
 
 void marshal_VkStridedDeviceAddressRegionKHR(
     VulkanStreamGuest* 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));
@@ -16918,8 +23114,10 @@
 
 void unmarshal_VkStridedDeviceAddressRegionKHR(
     VulkanStreamGuest* 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));
@@ -16927,8 +23125,10 @@
 
 void marshal_VkTraceRaysIndirectCommandKHR(
     VulkanStreamGuest* 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));
@@ -16936,8 +23136,10 @@
 
 void unmarshal_VkTraceRaysIndirectCommandKHR(
     VulkanStreamGuest* 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));
     vkStream->read((uint32_t*)&forUnmarshaling->depth, sizeof(uint32_t));
@@ -16947,33 +23149,46 @@
 #ifdef VK_KHR_ray_query
 void marshal_VkPhysicalDeviceRayQueryFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayQueryFeaturesKHR* forMarshaling)
 {
+    (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    marshal_extension_struct(vkStream, forMarshaling->pNext);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->rayQuery, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceRayQueryFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceRayQueryFeaturesKHR* forUnmarshaling)
 {
+    (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    unmarshal_extension_struct(vkStream, (void*)(forUnmarshaling->pNext));
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forUnmarshaling->sType;
+    }
+    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     vkStream->read((VkBool32*)&forUnmarshaling->rayQuery, sizeof(VkBool32));
 }
 
 #endif
 void marshal_extension_struct(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const void* structExtension)
 {
     VkInstanceCreateInfo* structAccess = (VkInstanceCreateInfo*)(structExtension);
-    size_t currExtSize = goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), 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, (void*)structAccess->pNext);
+        marshal_extension_struct(vkStream, rootType, (void*)structAccess->pNext);
         return;
     }
     else
@@ -16997,1535 +23212,1613 @@
 #ifdef VK_VERSION_1_1
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES:
         {
-            marshal_VkPhysicalDeviceSubgroupProperties(vkStream, reinterpret_cast<const VkPhysicalDeviceSubgroupProperties*>(structExtension));
+            marshal_VkPhysicalDeviceSubgroupProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceSubgroupProperties*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES:
         {
-            marshal_VkPhysicalDevice16BitStorageFeatures(vkStream, reinterpret_cast<const VkPhysicalDevice16BitStorageFeatures*>(structExtension));
+            marshal_VkPhysicalDevice16BitStorageFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDevice16BitStorageFeatures*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS:
         {
-            marshal_VkMemoryDedicatedRequirements(vkStream, reinterpret_cast<const VkMemoryDedicatedRequirements*>(structExtension));
+            marshal_VkMemoryDedicatedRequirements(vkStream, rootType, reinterpret_cast<const VkMemoryDedicatedRequirements*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO:
         {
-            marshal_VkMemoryDedicatedAllocateInfo(vkStream, reinterpret_cast<const VkMemoryDedicatedAllocateInfo*>(structExtension));
+            marshal_VkMemoryDedicatedAllocateInfo(vkStream, rootType, reinterpret_cast<const VkMemoryDedicatedAllocateInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO:
         {
-            marshal_VkMemoryAllocateFlagsInfo(vkStream, reinterpret_cast<const VkMemoryAllocateFlagsInfo*>(structExtension));
+            marshal_VkMemoryAllocateFlagsInfo(vkStream, rootType, reinterpret_cast<const VkMemoryAllocateFlagsInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO:
         {
-            marshal_VkDeviceGroupRenderPassBeginInfo(vkStream, reinterpret_cast<const VkDeviceGroupRenderPassBeginInfo*>(structExtension));
+            marshal_VkDeviceGroupRenderPassBeginInfo(vkStream, rootType, reinterpret_cast<const VkDeviceGroupRenderPassBeginInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO:
         {
-            marshal_VkDeviceGroupCommandBufferBeginInfo(vkStream, reinterpret_cast<const VkDeviceGroupCommandBufferBeginInfo*>(structExtension));
+            marshal_VkDeviceGroupCommandBufferBeginInfo(vkStream, rootType, reinterpret_cast<const VkDeviceGroupCommandBufferBeginInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO:
         {
-            marshal_VkDeviceGroupSubmitInfo(vkStream, reinterpret_cast<const VkDeviceGroupSubmitInfo*>(structExtension));
+            marshal_VkDeviceGroupSubmitInfo(vkStream, rootType, reinterpret_cast<const VkDeviceGroupSubmitInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO:
         {
-            marshal_VkDeviceGroupBindSparseInfo(vkStream, reinterpret_cast<const VkDeviceGroupBindSparseInfo*>(structExtension));
+            marshal_VkDeviceGroupBindSparseInfo(vkStream, rootType, reinterpret_cast<const VkDeviceGroupBindSparseInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO:
         {
-            marshal_VkBindBufferMemoryDeviceGroupInfo(vkStream, reinterpret_cast<const VkBindBufferMemoryDeviceGroupInfo*>(structExtension));
+            marshal_VkBindBufferMemoryDeviceGroupInfo(vkStream, rootType, reinterpret_cast<const VkBindBufferMemoryDeviceGroupInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO:
         {
-            marshal_VkBindImageMemoryDeviceGroupInfo(vkStream, reinterpret_cast<const VkBindImageMemoryDeviceGroupInfo*>(structExtension));
+            marshal_VkBindImageMemoryDeviceGroupInfo(vkStream, rootType, reinterpret_cast<const VkBindImageMemoryDeviceGroupInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO:
         {
-            marshal_VkDeviceGroupDeviceCreateInfo(vkStream, reinterpret_cast<const VkDeviceGroupDeviceCreateInfo*>(structExtension));
+            marshal_VkDeviceGroupDeviceCreateInfo(vkStream, rootType, reinterpret_cast<const VkDeviceGroupDeviceCreateInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
         {
-            marshal_VkPhysicalDeviceFeatures2(vkStream, reinterpret_cast<const VkPhysicalDeviceFeatures2*>(structExtension));
+            marshal_VkPhysicalDeviceFeatures2(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFeatures2*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES:
         {
-            marshal_VkPhysicalDevicePointClippingProperties(vkStream, reinterpret_cast<const VkPhysicalDevicePointClippingProperties*>(structExtension));
+            marshal_VkPhysicalDevicePointClippingProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePointClippingProperties*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO:
         {
-            marshal_VkRenderPassInputAttachmentAspectCreateInfo(vkStream, reinterpret_cast<const VkRenderPassInputAttachmentAspectCreateInfo*>(structExtension));
+            marshal_VkRenderPassInputAttachmentAspectCreateInfo(vkStream, rootType, reinterpret_cast<const VkRenderPassInputAttachmentAspectCreateInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO:
         {
-            marshal_VkImageViewUsageCreateInfo(vkStream, reinterpret_cast<const VkImageViewUsageCreateInfo*>(structExtension));
+            marshal_VkImageViewUsageCreateInfo(vkStream, rootType, reinterpret_cast<const VkImageViewUsageCreateInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO:
         {
-            marshal_VkPipelineTessellationDomainOriginStateCreateInfo(vkStream, reinterpret_cast<const VkPipelineTessellationDomainOriginStateCreateInfo*>(structExtension));
+            marshal_VkPipelineTessellationDomainOriginStateCreateInfo(vkStream, rootType, reinterpret_cast<const VkPipelineTessellationDomainOriginStateCreateInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO:
         {
-            marshal_VkRenderPassMultiviewCreateInfo(vkStream, reinterpret_cast<const VkRenderPassMultiviewCreateInfo*>(structExtension));
+            marshal_VkRenderPassMultiviewCreateInfo(vkStream, rootType, reinterpret_cast<const VkRenderPassMultiviewCreateInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES:
         {
-            marshal_VkPhysicalDeviceMultiviewFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceMultiviewFeatures*>(structExtension));
+            marshal_VkPhysicalDeviceMultiviewFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceMultiviewFeatures*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES:
         {
-            marshal_VkPhysicalDeviceMultiviewProperties(vkStream, reinterpret_cast<const VkPhysicalDeviceMultiviewProperties*>(structExtension));
+            marshal_VkPhysicalDeviceMultiviewProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceMultiviewProperties*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES:
         {
-            marshal_VkPhysicalDeviceVariablePointersFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceVariablePointersFeatures*>(structExtension));
+            marshal_VkPhysicalDeviceVariablePointersFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceVariablePointersFeatures*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES:
         {
-            marshal_VkPhysicalDeviceProtectedMemoryFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension));
+            marshal_VkPhysicalDeviceProtectedMemoryFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES:
         {
-            marshal_VkPhysicalDeviceProtectedMemoryProperties(vkStream, reinterpret_cast<const VkPhysicalDeviceProtectedMemoryProperties*>(structExtension));
+            marshal_VkPhysicalDeviceProtectedMemoryProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceProtectedMemoryProperties*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO:
         {
-            marshal_VkProtectedSubmitInfo(vkStream, reinterpret_cast<const VkProtectedSubmitInfo*>(structExtension));
+            marshal_VkProtectedSubmitInfo(vkStream, rootType, reinterpret_cast<const VkProtectedSubmitInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO:
         {
-            marshal_VkSamplerYcbcrConversionInfo(vkStream, reinterpret_cast<const VkSamplerYcbcrConversionInfo*>(structExtension));
+            marshal_VkSamplerYcbcrConversionInfo(vkStream, rootType, reinterpret_cast<const VkSamplerYcbcrConversionInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO:
         {
-            marshal_VkBindImagePlaneMemoryInfo(vkStream, reinterpret_cast<const VkBindImagePlaneMemoryInfo*>(structExtension));
+            marshal_VkBindImagePlaneMemoryInfo(vkStream, rootType, reinterpret_cast<const VkBindImagePlaneMemoryInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO:
         {
-            marshal_VkImagePlaneMemoryRequirementsInfo(vkStream, reinterpret_cast<const VkImagePlaneMemoryRequirementsInfo*>(structExtension));
+            marshal_VkImagePlaneMemoryRequirementsInfo(vkStream, rootType, reinterpret_cast<const VkImagePlaneMemoryRequirementsInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES:
         {
-            marshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(structExtension));
+            marshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES:
         {
-            marshal_VkSamplerYcbcrConversionImageFormatProperties(vkStream, reinterpret_cast<const VkSamplerYcbcrConversionImageFormatProperties*>(structExtension));
+            marshal_VkSamplerYcbcrConversionImageFormatProperties(vkStream, rootType, reinterpret_cast<const VkSamplerYcbcrConversionImageFormatProperties*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO:
         {
-            marshal_VkPhysicalDeviceExternalImageFormatInfo(vkStream, reinterpret_cast<const VkPhysicalDeviceExternalImageFormatInfo*>(structExtension));
+            marshal_VkPhysicalDeviceExternalImageFormatInfo(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceExternalImageFormatInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES:
         {
-            marshal_VkExternalImageFormatProperties(vkStream, reinterpret_cast<const VkExternalImageFormatProperties*>(structExtension));
+            marshal_VkExternalImageFormatProperties(vkStream, rootType, reinterpret_cast<const VkExternalImageFormatProperties*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES:
         {
-            marshal_VkPhysicalDeviceIDProperties(vkStream, reinterpret_cast<const VkPhysicalDeviceIDProperties*>(structExtension));
+            marshal_VkPhysicalDeviceIDProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceIDProperties*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO:
         {
-            marshal_VkExternalMemoryImageCreateInfo(vkStream, reinterpret_cast<const VkExternalMemoryImageCreateInfo*>(structExtension));
+            marshal_VkExternalMemoryImageCreateInfo(vkStream, rootType, reinterpret_cast<const VkExternalMemoryImageCreateInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO:
         {
-            marshal_VkExternalMemoryBufferCreateInfo(vkStream, reinterpret_cast<const VkExternalMemoryBufferCreateInfo*>(structExtension));
+            marshal_VkExternalMemoryBufferCreateInfo(vkStream, rootType, reinterpret_cast<const VkExternalMemoryBufferCreateInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO:
         {
-            marshal_VkExportMemoryAllocateInfo(vkStream, reinterpret_cast<const VkExportMemoryAllocateInfo*>(structExtension));
+            marshal_VkExportMemoryAllocateInfo(vkStream, rootType, reinterpret_cast<const VkExportMemoryAllocateInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO:
         {
-            marshal_VkExportFenceCreateInfo(vkStream, reinterpret_cast<const VkExportFenceCreateInfo*>(structExtension));
+            marshal_VkExportFenceCreateInfo(vkStream, rootType, reinterpret_cast<const VkExportFenceCreateInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO:
         {
-            marshal_VkExportSemaphoreCreateInfo(vkStream, reinterpret_cast<const VkExportSemaphoreCreateInfo*>(structExtension));
+            marshal_VkExportSemaphoreCreateInfo(vkStream, rootType, reinterpret_cast<const VkExportSemaphoreCreateInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES:
         {
-            marshal_VkPhysicalDeviceMaintenance3Properties(vkStream, reinterpret_cast<const VkPhysicalDeviceMaintenance3Properties*>(structExtension));
+            marshal_VkPhysicalDeviceMaintenance3Properties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceMaintenance3Properties*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES:
         {
-            marshal_VkPhysicalDeviceShaderDrawParametersFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceShaderDrawParametersFeatures*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceVulkan11Features*>(structExtension));
+            marshal_VkPhysicalDeviceVulkan11Features(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceVulkan11Features*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES:
         {
-            marshal_VkPhysicalDeviceVulkan11Properties(vkStream, reinterpret_cast<const VkPhysicalDeviceVulkan11Properties*>(structExtension));
+            marshal_VkPhysicalDeviceVulkan11Properties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceVulkan11Properties*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES:
         {
-            marshal_VkPhysicalDeviceVulkan12Features(vkStream, reinterpret_cast<const VkPhysicalDeviceVulkan12Features*>(structExtension));
+            marshal_VkPhysicalDeviceVulkan12Features(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceVulkan12Features*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES:
         {
-            marshal_VkPhysicalDeviceVulkan12Properties(vkStream, reinterpret_cast<const VkPhysicalDeviceVulkan12Properties*>(structExtension));
+            marshal_VkPhysicalDeviceVulkan12Properties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceVulkan12Properties*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO:
         {
-            marshal_VkImageFormatListCreateInfo(vkStream, reinterpret_cast<const VkImageFormatListCreateInfo*>(structExtension));
+            marshal_VkImageFormatListCreateInfo(vkStream, rootType, reinterpret_cast<const VkImageFormatListCreateInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES:
         {
-            marshal_VkPhysicalDevice8BitStorageFeatures(vkStream, reinterpret_cast<const VkPhysicalDevice8BitStorageFeatures*>(structExtension));
+            marshal_VkPhysicalDevice8BitStorageFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDevice8BitStorageFeatures*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES:
         {
-            marshal_VkPhysicalDeviceDriverProperties(vkStream, reinterpret_cast<const VkPhysicalDeviceDriverProperties*>(structExtension));
+            marshal_VkPhysicalDeviceDriverProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDriverProperties*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES:
         {
-            marshal_VkPhysicalDeviceShaderAtomicInt64Features(vkStream, reinterpret_cast<const VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension));
+            marshal_VkPhysicalDeviceShaderAtomicInt64Features(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES:
         {
-            marshal_VkPhysicalDeviceShaderFloat16Int8Features(vkStream, reinterpret_cast<const VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension));
+            marshal_VkPhysicalDeviceShaderFloat16Int8Features(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES:
         {
-            marshal_VkPhysicalDeviceFloatControlsProperties(vkStream, reinterpret_cast<const VkPhysicalDeviceFloatControlsProperties*>(structExtension));
+            marshal_VkPhysicalDeviceFloatControlsProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFloatControlsProperties*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO:
         {
-            marshal_VkDescriptorSetLayoutBindingFlagsCreateInfo(vkStream, reinterpret_cast<const VkDescriptorSetLayoutBindingFlagsCreateInfo*>(structExtension));
+            marshal_VkDescriptorSetLayoutBindingFlagsCreateInfo(vkStream, rootType, reinterpret_cast<const VkDescriptorSetLayoutBindingFlagsCreateInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES:
         {
-            marshal_VkPhysicalDeviceDescriptorIndexingFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension));
+            marshal_VkPhysicalDeviceDescriptorIndexingFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES:
         {
-            marshal_VkPhysicalDeviceDescriptorIndexingProperties(vkStream, reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingProperties*>(structExtension));
+            marshal_VkPhysicalDeviceDescriptorIndexingProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingProperties*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO:
         {
-            marshal_VkDescriptorSetVariableDescriptorCountAllocateInfo(vkStream, reinterpret_cast<const VkDescriptorSetVariableDescriptorCountAllocateInfo*>(structExtension));
+            marshal_VkDescriptorSetVariableDescriptorCountAllocateInfo(vkStream, rootType, reinterpret_cast<const VkDescriptorSetVariableDescriptorCountAllocateInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT:
         {
-            marshal_VkDescriptorSetVariableDescriptorCountLayoutSupport(vkStream, reinterpret_cast<const VkDescriptorSetVariableDescriptorCountLayoutSupport*>(structExtension));
+            marshal_VkDescriptorSetVariableDescriptorCountLayoutSupport(vkStream, rootType, reinterpret_cast<const VkDescriptorSetVariableDescriptorCountLayoutSupport*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE:
         {
-            marshal_VkSubpassDescriptionDepthStencilResolve(vkStream, reinterpret_cast<const VkSubpassDescriptionDepthStencilResolve*>(structExtension));
+            marshal_VkSubpassDescriptionDepthStencilResolve(vkStream, rootType, reinterpret_cast<const VkSubpassDescriptionDepthStencilResolve*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES:
         {
-            marshal_VkPhysicalDeviceDepthStencilResolveProperties(vkStream, reinterpret_cast<const VkPhysicalDeviceDepthStencilResolveProperties*>(structExtension));
+            marshal_VkPhysicalDeviceDepthStencilResolveProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDepthStencilResolveProperties*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES:
         {
-            marshal_VkPhysicalDeviceScalarBlockLayoutFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension));
+            marshal_VkPhysicalDeviceScalarBlockLayoutFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO:
         {
-            marshal_VkImageStencilUsageCreateInfo(vkStream, reinterpret_cast<const VkImageStencilUsageCreateInfo*>(structExtension));
+            marshal_VkImageStencilUsageCreateInfo(vkStream, rootType, reinterpret_cast<const VkImageStencilUsageCreateInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO:
         {
-            marshal_VkSamplerReductionModeCreateInfo(vkStream, reinterpret_cast<const VkSamplerReductionModeCreateInfo*>(structExtension));
+            marshal_VkSamplerReductionModeCreateInfo(vkStream, rootType, reinterpret_cast<const VkSamplerReductionModeCreateInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES:
         {
-            marshal_VkPhysicalDeviceSamplerFilterMinmaxProperties(vkStream, reinterpret_cast<const VkPhysicalDeviceSamplerFilterMinmaxProperties*>(structExtension));
+            marshal_VkPhysicalDeviceSamplerFilterMinmaxProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceSamplerFilterMinmaxProperties*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES:
         {
-            marshal_VkPhysicalDeviceVulkanMemoryModelFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension));
+            marshal_VkPhysicalDeviceVulkanMemoryModelFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES:
         {
-            marshal_VkPhysicalDeviceImagelessFramebufferFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceImagelessFramebufferFeatures*>(structExtension));
+            marshal_VkPhysicalDeviceImagelessFramebufferFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceImagelessFramebufferFeatures*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO:
         {
-            marshal_VkFramebufferAttachmentsCreateInfo(vkStream, reinterpret_cast<const VkFramebufferAttachmentsCreateInfo*>(structExtension));
+            marshal_VkFramebufferAttachmentsCreateInfo(vkStream, rootType, reinterpret_cast<const VkFramebufferAttachmentsCreateInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO:
         {
-            marshal_VkRenderPassAttachmentBeginInfo(vkStream, reinterpret_cast<const VkRenderPassAttachmentBeginInfo*>(structExtension));
+            marshal_VkRenderPassAttachmentBeginInfo(vkStream, rootType, reinterpret_cast<const VkRenderPassAttachmentBeginInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES:
         {
-            marshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(structExtension));
+            marshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES:
         {
-            marshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(structExtension));
+            marshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES:
         {
-            marshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(structExtension));
+            marshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT:
         {
-            marshal_VkAttachmentReferenceStencilLayout(vkStream, reinterpret_cast<const VkAttachmentReferenceStencilLayout*>(structExtension));
+            marshal_VkAttachmentReferenceStencilLayout(vkStream, rootType, reinterpret_cast<const VkAttachmentReferenceStencilLayout*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT:
         {
-            marshal_VkAttachmentDescriptionStencilLayout(vkStream, reinterpret_cast<const VkAttachmentDescriptionStencilLayout*>(structExtension));
+            marshal_VkAttachmentDescriptionStencilLayout(vkStream, rootType, reinterpret_cast<const VkAttachmentDescriptionStencilLayout*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES:
         {
-            marshal_VkPhysicalDeviceHostQueryResetFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceHostQueryResetFeatures*>(structExtension));
+            marshal_VkPhysicalDeviceHostQueryResetFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceHostQueryResetFeatures*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES:
         {
-            marshal_VkPhysicalDeviceTimelineSemaphoreFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension));
+            marshal_VkPhysicalDeviceTimelineSemaphoreFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES:
         {
-            marshal_VkPhysicalDeviceTimelineSemaphoreProperties(vkStream, reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreProperties*>(structExtension));
+            marshal_VkPhysicalDeviceTimelineSemaphoreProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreProperties*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO:
         {
-            marshal_VkSemaphoreTypeCreateInfo(vkStream, reinterpret_cast<const VkSemaphoreTypeCreateInfo*>(structExtension));
+            marshal_VkSemaphoreTypeCreateInfo(vkStream, rootType, reinterpret_cast<const VkSemaphoreTypeCreateInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO:
         {
-            marshal_VkTimelineSemaphoreSubmitInfo(vkStream, reinterpret_cast<const VkTimelineSemaphoreSubmitInfo*>(structExtension));
+            marshal_VkTimelineSemaphoreSubmitInfo(vkStream, rootType, reinterpret_cast<const VkTimelineSemaphoreSubmitInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES:
         {
-            marshal_VkPhysicalDeviceBufferDeviceAddressFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeatures*>(structExtension));
+            marshal_VkPhysicalDeviceBufferDeviceAddressFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeatures*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO:
         {
-            marshal_VkBufferOpaqueCaptureAddressCreateInfo(vkStream, reinterpret_cast<const VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension));
+            marshal_VkBufferOpaqueCaptureAddressCreateInfo(vkStream, rootType, reinterpret_cast<const VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO:
         {
-            marshal_VkMemoryOpaqueCaptureAddressAllocateInfo(vkStream, reinterpret_cast<const VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension));
+            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, reinterpret_cast<const VkImageSwapchainCreateInfoKHR*>(structExtension));
+            marshal_VkImageSwapchainCreateInfoKHR(vkStream, rootType, reinterpret_cast<const VkImageSwapchainCreateInfoKHR*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR:
         {
-            marshal_VkBindImageMemorySwapchainInfoKHR(vkStream, reinterpret_cast<const VkBindImageMemorySwapchainInfoKHR*>(structExtension));
+            marshal_VkBindImageMemorySwapchainInfoKHR(vkStream, rootType, reinterpret_cast<const VkBindImageMemorySwapchainInfoKHR*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR:
         {
-            marshal_VkDeviceGroupPresentInfoKHR(vkStream, reinterpret_cast<const VkDeviceGroupPresentInfoKHR*>(structExtension));
+            marshal_VkDeviceGroupPresentInfoKHR(vkStream, rootType, reinterpret_cast<const VkDeviceGroupPresentInfoKHR*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR:
         {
-            marshal_VkDeviceGroupSwapchainCreateInfoKHR(vkStream, reinterpret_cast<const VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension));
+            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, reinterpret_cast<const VkDisplayPresentInfoKHR*>(structExtension));
+            marshal_VkDisplayPresentInfoKHR(vkStream, rootType, reinterpret_cast<const VkDisplayPresentInfoKHR*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_external_memory_win32
         case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
         {
-            marshal_VkImportMemoryWin32HandleInfoKHR(vkStream, reinterpret_cast<const VkImportMemoryWin32HandleInfoKHR*>(structExtension));
+            marshal_VkImportMemoryWin32HandleInfoKHR(vkStream, rootType, reinterpret_cast<const VkImportMemoryWin32HandleInfoKHR*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
         {
-            marshal_VkExportMemoryWin32HandleInfoKHR(vkStream, reinterpret_cast<const VkExportMemoryWin32HandleInfoKHR*>(structExtension));
+            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, reinterpret_cast<const VkImportMemoryFdInfoKHR*>(structExtension));
+            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, reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension));
+            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, reinterpret_cast<const VkExportSemaphoreWin32HandleInfoKHR*>(structExtension));
+            marshal_VkExportSemaphoreWin32HandleInfoKHR(vkStream, rootType, reinterpret_cast<const VkExportSemaphoreWin32HandleInfoKHR*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR:
         {
-            marshal_VkD3D12FenceSubmitInfoKHR(vkStream, reinterpret_cast<const VkD3D12FenceSubmitInfoKHR*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDevicePushDescriptorPropertiesKHR*>(structExtension));
+            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, reinterpret_cast<const VkPresentRegionsKHR*>(structExtension));
+            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, reinterpret_cast<const VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension));
+            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, reinterpret_cast<const VkExportFenceWin32HandleInfoKHR*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDevicePerformanceQueryFeaturesKHR*>(structExtension));
+            marshal_VkPhysicalDevicePerformanceQueryFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePerformanceQueryFeaturesKHR*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR:
         {
-            marshal_VkPhysicalDevicePerformanceQueryPropertiesKHR(vkStream, reinterpret_cast<const VkPhysicalDevicePerformanceQueryPropertiesKHR*>(structExtension));
+            marshal_VkPhysicalDevicePerformanceQueryPropertiesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePerformanceQueryPropertiesKHR*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR:
         {
-            marshal_VkQueryPoolPerformanceCreateInfoKHR(vkStream, reinterpret_cast<const VkQueryPoolPerformanceCreateInfoKHR*>(structExtension));
+            marshal_VkQueryPoolPerformanceCreateInfoKHR(vkStream, rootType, reinterpret_cast<const VkQueryPoolPerformanceCreateInfoKHR*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR:
         {
-            marshal_VkPerformanceQuerySubmitInfoKHR(vkStream, reinterpret_cast<const VkPerformanceQuerySubmitInfoKHR*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(structExtension));
+            marshal_VkPhysicalDevicePortabilitySubsetFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR:
         {
-            marshal_VkPhysicalDevicePortabilitySubsetPropertiesKHR(vkStream, reinterpret_cast<const VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(structExtension));
+            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, reinterpret_cast<const VkFragmentShadingRateAttachmentInfoKHR*>(structExtension));
+            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, reinterpret_cast<const VkPipelineFragmentShadingRateStateCreateInfoKHR*>(structExtension));
+            marshal_VkPipelineFragmentShadingRateStateCreateInfoKHR(vkStream, rootType, reinterpret_cast<const VkPipelineFragmentShadingRateStateCreateInfoKHR*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR:
         {
-            marshal_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(vkStream, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(structExtension));
+            marshal_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR:
         {
-            marshal_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(vkStream, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(structExtension));
+            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, reinterpret_cast<const VkSurfaceProtectedCapabilitiesKHR*>(structExtension));
+            marshal_VkSurfaceProtectedCapabilitiesKHR(vkStream, rootType, reinterpret_cast<const VkSurfaceProtectedCapabilitiesKHR*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR:
         {
-            marshal_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(vkStream, reinterpret_cast<const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(structExtension));
+            marshal_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_ANDROID_native_buffer
         case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID:
         {
-            marshal_VkNativeBufferANDROID(vkStream, reinterpret_cast<const VkNativeBufferANDROID*>(structExtension));
+            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, reinterpret_cast<const VkDebugReportCallbackCreateInfoEXT*>(structExtension));
+            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, reinterpret_cast<const VkPipelineRasterizationStateRasterizationOrderAMD*>(structExtension));
+            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, reinterpret_cast<const VkDedicatedAllocationImageCreateInfoNV*>(structExtension));
+            marshal_VkDedicatedAllocationImageCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkDedicatedAllocationImageCreateInfoNV*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV:
         {
-            marshal_VkDedicatedAllocationBufferCreateInfoNV(vkStream, reinterpret_cast<const VkDedicatedAllocationBufferCreateInfoNV*>(structExtension));
+            marshal_VkDedicatedAllocationBufferCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkDedicatedAllocationBufferCreateInfoNV*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV:
         {
-            marshal_VkDedicatedAllocationMemoryAllocateInfoNV(vkStream, reinterpret_cast<const VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(structExtension));
+            marshal_VkPhysicalDeviceTransformFeedbackFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT:
         {
-            marshal_VkPhysicalDeviceTransformFeedbackPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(structExtension));
+            marshal_VkPhysicalDeviceTransformFeedbackPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT:
         {
-            marshal_VkPipelineRasterizationStateStreamCreateInfoEXT(vkStream, reinterpret_cast<const VkPipelineRasterizationStateStreamCreateInfoEXT*>(structExtension));
+            marshal_VkPipelineRasterizationStateStreamCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkPipelineRasterizationStateStreamCreateInfoEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
         case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD:
         {
-            marshal_VkTextureLODGatherFormatPropertiesAMD(vkStream, reinterpret_cast<const VkTextureLODGatherFormatPropertiesAMD*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceCornerSampledImageFeaturesNV*>(structExtension));
+            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, reinterpret_cast<const VkExternalMemoryImageCreateInfoNV*>(structExtension));
+            marshal_VkExternalMemoryImageCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkExternalMemoryImageCreateInfoNV*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV:
         {
-            marshal_VkExportMemoryAllocateInfoNV(vkStream, reinterpret_cast<const VkExportMemoryAllocateInfoNV*>(structExtension));
+            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, reinterpret_cast<const VkImportMemoryWin32HandleInfoNV*>(structExtension));
+            marshal_VkImportMemoryWin32HandleInfoNV(vkStream, rootType, reinterpret_cast<const VkImportMemoryWin32HandleInfoNV*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV:
         {
-            marshal_VkExportMemoryWin32HandleInfoNV(vkStream, reinterpret_cast<const VkExportMemoryWin32HandleInfoNV*>(structExtension));
+            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, reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension));
+            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, reinterpret_cast<const VkValidationFlagsEXT*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(structExtension));
+            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, reinterpret_cast<const VkImageViewASTCDecodeModeEXT*>(structExtension));
+            marshal_VkImageViewASTCDecodeModeEXT(vkStream, rootType, reinterpret_cast<const VkImageViewASTCDecodeModeEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT:
         {
-            marshal_VkPhysicalDeviceASTCDecodeFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(structExtension));
+            marshal_VkPhysicalDeviceConditionalRenderingFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT:
         {
-            marshal_VkCommandBufferInheritanceConditionalRenderingInfoEXT(vkStream, reinterpret_cast<const VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(structExtension));
+            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, reinterpret_cast<const VkPipelineViewportWScalingStateCreateInfoNV*>(structExtension));
+            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, reinterpret_cast<const VkSwapchainCounterCreateInfoEXT*>(structExtension));
+            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, reinterpret_cast<const VkPresentTimesInfoGOOGLE*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(structExtension));
+            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, reinterpret_cast<const VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(structExtension));
+            marshal_VkPhysicalDeviceDiscardRectanglePropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT:
         {
-            marshal_VkPipelineDiscardRectangleStateCreateInfoEXT(vkStream, reinterpret_cast<const VkPipelineDiscardRectangleStateCreateInfoEXT*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(structExtension));
+            marshal_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT:
         {
-            marshal_VkPipelineRasterizationConservativeStateCreateInfoEXT(vkStream, reinterpret_cast<const VkPipelineRasterizationConservativeStateCreateInfoEXT*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(structExtension));
+            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, reinterpret_cast<const VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(structExtension));
+            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, reinterpret_cast<const VkDebugUtilsMessengerCreateInfoEXT*>(structExtension));
+            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, reinterpret_cast<const VkAndroidHardwareBufferUsageANDROID*>(structExtension));
+            marshal_VkAndroidHardwareBufferUsageANDROID(vkStream, rootType, reinterpret_cast<const VkAndroidHardwareBufferUsageANDROID*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID:
         {
-            marshal_VkAndroidHardwareBufferFormatPropertiesANDROID(vkStream, reinterpret_cast<const VkAndroidHardwareBufferFormatPropertiesANDROID*>(structExtension));
+            marshal_VkAndroidHardwareBufferFormatPropertiesANDROID(vkStream, rootType, reinterpret_cast<const VkAndroidHardwareBufferFormatPropertiesANDROID*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID:
         {
-            marshal_VkImportAndroidHardwareBufferInfoANDROID(vkStream, reinterpret_cast<const VkImportAndroidHardwareBufferInfoANDROID*>(structExtension));
+            marshal_VkImportAndroidHardwareBufferInfoANDROID(vkStream, rootType, reinterpret_cast<const VkImportAndroidHardwareBufferInfoANDROID*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID:
         {
-            marshal_VkExternalFormatANDROID(vkStream, reinterpret_cast<const VkExternalFormatANDROID*>(structExtension));
+            marshal_VkExternalFormatANDROID(vkStream, rootType, reinterpret_cast<const VkExternalFormatANDROID*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_inline_uniform_block
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT:
         {
-            marshal_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(structExtension));
+            marshal_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT:
         {
-            marshal_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(structExtension));
+            marshal_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT:
         {
-            marshal_VkWriteDescriptorSetInlineUniformBlockEXT(vkStream, reinterpret_cast<const VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension));
+            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, reinterpret_cast<const VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(structExtension));
+            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, reinterpret_cast<const VkSampleLocationsInfoEXT*>(structExtension));
+            marshal_VkSampleLocationsInfoEXT(vkStream, rootType, reinterpret_cast<const VkSampleLocationsInfoEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT:
         {
-            marshal_VkRenderPassSampleLocationsBeginInfoEXT(vkStream, reinterpret_cast<const VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension));
+            marshal_VkRenderPassSampleLocationsBeginInfoEXT(vkStream, rootType, reinterpret_cast<const VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT:
         {
-            marshal_VkPipelineSampleLocationsStateCreateInfoEXT(vkStream, reinterpret_cast<const VkPipelineSampleLocationsStateCreateInfoEXT*>(structExtension));
+            marshal_VkPipelineSampleLocationsStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkPipelineSampleLocationsStateCreateInfoEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT:
         {
-            marshal_VkPhysicalDeviceSampleLocationsPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceSampleLocationsPropertiesEXT*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(structExtension));
+            marshal_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT:
         {
-            marshal_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(structExtension));
+            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, reinterpret_cast<const VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(structExtension));
+            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, reinterpret_cast<const VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension));
+            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, reinterpret_cast<const VkPipelineCoverageModulationStateCreateInfoNV*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(structExtension));
+            marshal_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV:
         {
-            marshal_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(structExtension));
+            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, reinterpret_cast<const VkDrmFormatModifierPropertiesListEXT*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(structExtension));
+            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, reinterpret_cast<const VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension));
+            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, reinterpret_cast<const VkImageDrmFormatModifierExplicitCreateInfoEXT*>(structExtension));
+            marshal_VkImageDrmFormatModifierExplicitCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkImageDrmFormatModifierExplicitCreateInfoEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_validation_cache
         case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT:
         {
-            marshal_VkShaderModuleValidationCacheCreateInfoEXT(vkStream, reinterpret_cast<const VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension));
+            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, reinterpret_cast<const VkPipelineViewportShadingRateImageStateCreateInfoNV*>(structExtension));
+            marshal_VkPipelineViewportShadingRateImageStateCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkPipelineViewportShadingRateImageStateCreateInfoNV*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV:
         {
-            marshal_VkPhysicalDeviceShadingRateImageFeaturesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension));
+            marshal_VkPhysicalDeviceShadingRateImageFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV:
         {
-            marshal_VkPhysicalDeviceShadingRateImagePropertiesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceShadingRateImagePropertiesNV*>(structExtension));
+            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, reinterpret_cast<const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(structExtension));
+            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, reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureNV*>(structExtension));
+            marshal_VkWriteDescriptorSetAccelerationStructureNV(vkStream, rootType, reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureNV*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV:
         {
-            marshal_VkPhysicalDeviceRayTracingPropertiesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(structExtension));
+            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, reinterpret_cast<const VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceImageViewImageFormatInfoEXT*>(structExtension));
+            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, reinterpret_cast<const VkFilterCubicImageViewImageFormatPropertiesEXT*>(structExtension));
+            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, reinterpret_cast<const VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension));
+            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, reinterpret_cast<const VkImportMemoryHostPointerInfoEXT*>(structExtension));
+            marshal_VkImportMemoryHostPointerInfoEXT(vkStream, rootType, reinterpret_cast<const VkImportMemoryHostPointerInfoEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT:
         {
-            marshal_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(structExtension));
+            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, reinterpret_cast<const VkPipelineCompilerControlCreateInfoAMD*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension));
+            marshal_VkPhysicalDeviceShaderCorePropertiesAMD(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
         case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD:
         {
-            marshal_VkDeviceMemoryOverallocationCreateInfoAMD(vkStream, reinterpret_cast<const VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(structExtension));
+            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, reinterpret_cast<const VkPipelineVertexInputDivisorStateCreateInfoEXT*>(structExtension));
+            marshal_VkPipelineVertexInputDivisorStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkPipelineVertexInputDivisorStateCreateInfoEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT:
         {
-            marshal_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(structExtension));
+            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, reinterpret_cast<const VkPresentFrameTokenGGP*>(structExtension));
+            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, reinterpret_cast<const VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension));
+            marshal_VkPhysicalDeviceMeshShaderFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV:
         {
-            marshal_VkPhysicalDeviceMeshShaderPropertiesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(structExtension));
+            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, reinterpret_cast<const VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(structExtension));
+            marshal_VkPipelineViewportExclusiveScissorStateCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV:
         {
-            marshal_VkPhysicalDeviceExclusiveScissorFeaturesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceExclusiveScissorFeaturesNV*>(structExtension));
+            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, reinterpret_cast<const VkQueueFamilyCheckpointPropertiesNV*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(structExtension));
+            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, reinterpret_cast<const VkQueryPoolPerformanceQueryCreateInfoINTEL*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension));
+            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, reinterpret_cast<const VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension));
+            marshal_VkDisplayNativeHdrSurfaceCapabilitiesAMD(vkStream, rootType, reinterpret_cast<const VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD:
         {
-            marshal_VkSwapchainDisplayNativeHdrCreateInfoAMD(vkStream, reinterpret_cast<const VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension));
+            marshal_VkSwapchainDisplayNativeHdrCreateInfoAMD(vkStream, rootType, reinterpret_cast<const VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension));
             break;
         }
 #endif
-#ifdef VK_GOOGLE_color_buffer
-        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE:
+#ifdef VK_EXT_fragment_density_map
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT:
         {
-            marshal_VkImportColorBufferGOOGLE(vkStream, reinterpret_cast<const VkImportColorBufferGOOGLE*>(structExtension));
+            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));
+                    break;
+                }
+                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));
+                    break;
+                }
+            }
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE:
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT:
         {
-            marshal_VkImportBufferGOOGLE(vkStream, reinterpret_cast<const VkImportBufferGOOGLE*>(structExtension));
+            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));
+                    break;
+                }
+                default:
+                {
+                    marshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension));
+                    break;
+                }
+            }
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
+        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT:
         {
-            marshal_VkImportPhysicalAddressGOOGLE(vkStream, reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension));
+            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));
+                    break;
+                }
+                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));
+                    break;
+                }
+            }
             break;
         }
 #endif
 #ifdef VK_EXT_subgroup_size_control
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT:
         {
-            marshal_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(structExtension));
+            marshal_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT:
         {
-            marshal_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(structExtension));
+            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, reinterpret_cast<const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension));
+            marshal_VkPhysicalDeviceMemoryPriorityFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT:
         {
-            marshal_VkMemoryPriorityAllocateInfoEXT(vkStream, reinterpret_cast<const VkMemoryPriorityAllocateInfoEXT*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(structExtension));
+            marshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT:
         {
-            marshal_VkBufferDeviceAddressCreateInfoEXT(vkStream, reinterpret_cast<const VkBufferDeviceAddressCreateInfoEXT*>(structExtension));
+            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, reinterpret_cast<const VkValidationFeaturesEXT*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(structExtension));
+            marshal_VkPhysicalDeviceCooperativeMatrixFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV:
         {
-            marshal_VkPhysicalDeviceCooperativeMatrixPropertiesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(structExtension));
+            marshal_VkPhysicalDeviceCoverageReductionModeFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV:
         {
-            marshal_VkPipelineCoverageReductionStateCreateInfoNV(vkStream, reinterpret_cast<const VkPipelineCoverageReductionStateCreateInfoNV*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(structExtension));
+            marshal_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_full_screen_exclusive
         case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT:
         {
-            marshal_VkSurfaceFullScreenExclusiveInfoEXT(vkStream, reinterpret_cast<const VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension));
+            marshal_VkSurfaceFullScreenExclusiveInfoEXT(vkStream, rootType, reinterpret_cast<const VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT:
         {
-            marshal_VkSurfaceCapabilitiesFullScreenExclusiveEXT(vkStream, reinterpret_cast<const VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(structExtension));
+            marshal_VkSurfaceCapabilitiesFullScreenExclusiveEXT(vkStream, rootType, reinterpret_cast<const VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT:
         {
-            marshal_VkSurfaceFullScreenExclusiveWin32InfoEXT(vkStream, reinterpret_cast<const VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceLineRasterizationFeaturesEXT*>(structExtension));
+            marshal_VkPhysicalDeviceLineRasterizationFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceLineRasterizationFeaturesEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT:
         {
-            marshal_VkPhysicalDeviceLineRasterizationPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceLineRasterizationPropertiesEXT*>(structExtension));
+            marshal_VkPhysicalDeviceLineRasterizationPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceLineRasterizationPropertiesEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT:
         {
-            marshal_VkPipelineRasterizationLineStateCreateInfoEXT(vkStream, reinterpret_cast<const VkPipelineRasterizationLineStateCreateInfoEXT*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(structExtension));
+            marshal_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(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, reinterpret_cast<const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(structExtension));
+            marshal_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV:
         {
-            marshal_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(structExtension));
+            marshal_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV:
         {
-            marshal_VkGraphicsPipelineShaderGroupsCreateInfoNV(vkStream, reinterpret_cast<const VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension));
+            marshal_VkGraphicsPipelineShaderGroupsCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_texel_buffer_alignment
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT:
         {
-            marshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(structExtension));
+            marshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT:
         {
-            marshal_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(structExtension));
+            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, reinterpret_cast<const VkRenderPassTransformBeginInfoQCOM*>(structExtension));
+            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, reinterpret_cast<const VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(structExtension));
+            marshal_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT:
         {
-            marshal_VkDeviceDeviceMemoryReportCreateInfoEXT(vkStream, reinterpret_cast<const VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension));
+            marshal_VkPhysicalDeviceRobustness2FeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT:
         {
-            marshal_VkPhysicalDeviceRobustness2PropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension));
+            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, reinterpret_cast<const VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension));
+            marshal_VkSamplerCustomBorderColorCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT:
         {
-            marshal_VkPhysicalDeviceCustomBorderColorPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(structExtension));
+            marshal_VkPhysicalDeviceCustomBorderColorPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT:
         {
-            marshal_VkPhysicalDeviceCustomBorderColorFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension));
+            marshal_VkPhysicalDevicePrivateDataFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT:
         {
-            marshal_VkDevicePrivateDataCreateInfoEXT(vkStream, reinterpret_cast<const VkDevicePrivateDataCreateInfoEXT*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(structExtension));
+            marshal_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV:
         {
-            marshal_VkDeviceDiagnosticsConfigCreateInfoNV(vkStream, reinterpret_cast<const VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(structExtension));
+            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, reinterpret_cast<const VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(structExtension));
+            marshal_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_density_map2
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT:
         {
-            marshal_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(structExtension));
+            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, reinterpret_cast<const VkCopyCommandTransformInfoQCOM*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceImageRobustnessFeaturesEXT*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension));
+            marshal_VkPhysicalDevice4444FormatsFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension));
+            break;
+        }
+#endif
+#ifdef VK_GOOGLE_gfxstream
+        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));
+            break;
+        }
+        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
+        {
+            marshal_VkImportPhysicalAddressGOOGLE(vkStream, rootType, reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
         case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR:
         {
-            marshal_VkWriteDescriptorSetAccelerationStructureKHR(vkStream, reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureKHR*>(structExtension));
+            marshal_VkWriteDescriptorSetAccelerationStructureKHR(vkStream, rootType, reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureKHR*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR:
         {
-            marshal_VkPhysicalDeviceAccelerationStructureFeaturesKHR(vkStream, reinterpret_cast<const VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(structExtension));
+            marshal_VkPhysicalDeviceAccelerationStructureFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR:
         {
-            marshal_VkPhysicalDeviceAccelerationStructurePropertiesKHR(vkStream, reinterpret_cast<const VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(structExtension));
+            marshal_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(structExtension));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR:
         {
-            marshal_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(vkStream, reinterpret_cast<const VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(structExtension));
+            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, reinterpret_cast<const VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension));
+            marshal_VkPhysicalDeviceRayQueryFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension));
             break;
         }
 #endif
@@ -18539,14 +24832,15 @@
 
 void unmarshal_extension_struct(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     void* structExtension_out)
 {
     VkInstanceCreateInfo* structAccess = (VkInstanceCreateInfo*)(structExtension_out);
-    size_t currExtSize = goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), 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, (void*)structAccess->pNext);
+        unmarshal_extension_struct(vkStream, rootType, (void*)structAccess->pNext);
         return;
     }
     else
@@ -18572,1535 +24866,1613 @@
 #ifdef VK_VERSION_1_1
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES:
         {
-            unmarshal_VkPhysicalDeviceSubgroupProperties(vkStream, reinterpret_cast<VkPhysicalDeviceSubgroupProperties*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceSubgroupProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceSubgroupProperties*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES:
         {
-            unmarshal_VkPhysicalDevice16BitStorageFeatures(vkStream, reinterpret_cast<VkPhysicalDevice16BitStorageFeatures*>(structExtension_out));
+            unmarshal_VkPhysicalDevice16BitStorageFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDevice16BitStorageFeatures*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS:
         {
-            unmarshal_VkMemoryDedicatedRequirements(vkStream, reinterpret_cast<VkMemoryDedicatedRequirements*>(structExtension_out));
+            unmarshal_VkMemoryDedicatedRequirements(vkStream, rootType, reinterpret_cast<VkMemoryDedicatedRequirements*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO:
         {
-            unmarshal_VkMemoryDedicatedAllocateInfo(vkStream, reinterpret_cast<VkMemoryDedicatedAllocateInfo*>(structExtension_out));
+            unmarshal_VkMemoryDedicatedAllocateInfo(vkStream, rootType, reinterpret_cast<VkMemoryDedicatedAllocateInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO:
         {
-            unmarshal_VkMemoryAllocateFlagsInfo(vkStream, reinterpret_cast<VkMemoryAllocateFlagsInfo*>(structExtension_out));
+            unmarshal_VkMemoryAllocateFlagsInfo(vkStream, rootType, reinterpret_cast<VkMemoryAllocateFlagsInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO:
         {
-            unmarshal_VkDeviceGroupRenderPassBeginInfo(vkStream, reinterpret_cast<VkDeviceGroupRenderPassBeginInfo*>(structExtension_out));
+            unmarshal_VkDeviceGroupRenderPassBeginInfo(vkStream, rootType, reinterpret_cast<VkDeviceGroupRenderPassBeginInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO:
         {
-            unmarshal_VkDeviceGroupCommandBufferBeginInfo(vkStream, reinterpret_cast<VkDeviceGroupCommandBufferBeginInfo*>(structExtension_out));
+            unmarshal_VkDeviceGroupCommandBufferBeginInfo(vkStream, rootType, reinterpret_cast<VkDeviceGroupCommandBufferBeginInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO:
         {
-            unmarshal_VkDeviceGroupSubmitInfo(vkStream, reinterpret_cast<VkDeviceGroupSubmitInfo*>(structExtension_out));
+            unmarshal_VkDeviceGroupSubmitInfo(vkStream, rootType, reinterpret_cast<VkDeviceGroupSubmitInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO:
         {
-            unmarshal_VkDeviceGroupBindSparseInfo(vkStream, reinterpret_cast<VkDeviceGroupBindSparseInfo*>(structExtension_out));
+            unmarshal_VkDeviceGroupBindSparseInfo(vkStream, rootType, reinterpret_cast<VkDeviceGroupBindSparseInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO:
         {
-            unmarshal_VkBindBufferMemoryDeviceGroupInfo(vkStream, reinterpret_cast<VkBindBufferMemoryDeviceGroupInfo*>(structExtension_out));
+            unmarshal_VkBindBufferMemoryDeviceGroupInfo(vkStream, rootType, reinterpret_cast<VkBindBufferMemoryDeviceGroupInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO:
         {
-            unmarshal_VkBindImageMemoryDeviceGroupInfo(vkStream, reinterpret_cast<VkBindImageMemoryDeviceGroupInfo*>(structExtension_out));
+            unmarshal_VkBindImageMemoryDeviceGroupInfo(vkStream, rootType, reinterpret_cast<VkBindImageMemoryDeviceGroupInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO:
         {
-            unmarshal_VkDeviceGroupDeviceCreateInfo(vkStream, reinterpret_cast<VkDeviceGroupDeviceCreateInfo*>(structExtension_out));
+            unmarshal_VkDeviceGroupDeviceCreateInfo(vkStream, rootType, reinterpret_cast<VkDeviceGroupDeviceCreateInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
         {
-            unmarshal_VkPhysicalDeviceFeatures2(vkStream, reinterpret_cast<VkPhysicalDeviceFeatures2*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceFeatures2(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFeatures2*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES:
         {
-            unmarshal_VkPhysicalDevicePointClippingProperties(vkStream, reinterpret_cast<VkPhysicalDevicePointClippingProperties*>(structExtension_out));
+            unmarshal_VkPhysicalDevicePointClippingProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePointClippingProperties*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO:
         {
-            unmarshal_VkRenderPassInputAttachmentAspectCreateInfo(vkStream, reinterpret_cast<VkRenderPassInputAttachmentAspectCreateInfo*>(structExtension_out));
+            unmarshal_VkRenderPassInputAttachmentAspectCreateInfo(vkStream, rootType, reinterpret_cast<VkRenderPassInputAttachmentAspectCreateInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO:
         {
-            unmarshal_VkImageViewUsageCreateInfo(vkStream, reinterpret_cast<VkImageViewUsageCreateInfo*>(structExtension_out));
+            unmarshal_VkImageViewUsageCreateInfo(vkStream, rootType, reinterpret_cast<VkImageViewUsageCreateInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO:
         {
-            unmarshal_VkPipelineTessellationDomainOriginStateCreateInfo(vkStream, reinterpret_cast<VkPipelineTessellationDomainOriginStateCreateInfo*>(structExtension_out));
+            unmarshal_VkPipelineTessellationDomainOriginStateCreateInfo(vkStream, rootType, reinterpret_cast<VkPipelineTessellationDomainOriginStateCreateInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO:
         {
-            unmarshal_VkRenderPassMultiviewCreateInfo(vkStream, reinterpret_cast<VkRenderPassMultiviewCreateInfo*>(structExtension_out));
+            unmarshal_VkRenderPassMultiviewCreateInfo(vkStream, rootType, reinterpret_cast<VkRenderPassMultiviewCreateInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES:
         {
-            unmarshal_VkPhysicalDeviceMultiviewFeatures(vkStream, reinterpret_cast<VkPhysicalDeviceMultiviewFeatures*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceMultiviewFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMultiviewFeatures*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES:
         {
-            unmarshal_VkPhysicalDeviceMultiviewProperties(vkStream, reinterpret_cast<VkPhysicalDeviceMultiviewProperties*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceMultiviewProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMultiviewProperties*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES:
         {
-            unmarshal_VkPhysicalDeviceVariablePointersFeatures(vkStream, reinterpret_cast<VkPhysicalDeviceVariablePointersFeatures*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceVariablePointersFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceVariablePointersFeatures*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES:
         {
-            unmarshal_VkPhysicalDeviceProtectedMemoryFeatures(vkStream, reinterpret_cast<VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceProtectedMemoryFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES:
         {
-            unmarshal_VkPhysicalDeviceProtectedMemoryProperties(vkStream, reinterpret_cast<VkPhysicalDeviceProtectedMemoryProperties*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceProtectedMemoryProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceProtectedMemoryProperties*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO:
         {
-            unmarshal_VkProtectedSubmitInfo(vkStream, reinterpret_cast<VkProtectedSubmitInfo*>(structExtension_out));
+            unmarshal_VkProtectedSubmitInfo(vkStream, rootType, reinterpret_cast<VkProtectedSubmitInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO:
         {
-            unmarshal_VkSamplerYcbcrConversionInfo(vkStream, reinterpret_cast<VkSamplerYcbcrConversionInfo*>(structExtension_out));
+            unmarshal_VkSamplerYcbcrConversionInfo(vkStream, rootType, reinterpret_cast<VkSamplerYcbcrConversionInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO:
         {
-            unmarshal_VkBindImagePlaneMemoryInfo(vkStream, reinterpret_cast<VkBindImagePlaneMemoryInfo*>(structExtension_out));
+            unmarshal_VkBindImagePlaneMemoryInfo(vkStream, rootType, reinterpret_cast<VkBindImagePlaneMemoryInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO:
         {
-            unmarshal_VkImagePlaneMemoryRequirementsInfo(vkStream, reinterpret_cast<VkImagePlaneMemoryRequirementsInfo*>(structExtension_out));
+            unmarshal_VkImagePlaneMemoryRequirementsInfo(vkStream, rootType, reinterpret_cast<VkImagePlaneMemoryRequirementsInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES:
         {
-            unmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(vkStream, reinterpret_cast<VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES:
         {
-            unmarshal_VkSamplerYcbcrConversionImageFormatProperties(vkStream, reinterpret_cast<VkSamplerYcbcrConversionImageFormatProperties*>(structExtension_out));
+            unmarshal_VkSamplerYcbcrConversionImageFormatProperties(vkStream, rootType, reinterpret_cast<VkSamplerYcbcrConversionImageFormatProperties*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO:
         {
-            unmarshal_VkPhysicalDeviceExternalImageFormatInfo(vkStream, reinterpret_cast<VkPhysicalDeviceExternalImageFormatInfo*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceExternalImageFormatInfo(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceExternalImageFormatInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES:
         {
-            unmarshal_VkExternalImageFormatProperties(vkStream, reinterpret_cast<VkExternalImageFormatProperties*>(structExtension_out));
+            unmarshal_VkExternalImageFormatProperties(vkStream, rootType, reinterpret_cast<VkExternalImageFormatProperties*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES:
         {
-            unmarshal_VkPhysicalDeviceIDProperties(vkStream, reinterpret_cast<VkPhysicalDeviceIDProperties*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceIDProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceIDProperties*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO:
         {
-            unmarshal_VkExternalMemoryImageCreateInfo(vkStream, reinterpret_cast<VkExternalMemoryImageCreateInfo*>(structExtension_out));
+            unmarshal_VkExternalMemoryImageCreateInfo(vkStream, rootType, reinterpret_cast<VkExternalMemoryImageCreateInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO:
         {
-            unmarshal_VkExternalMemoryBufferCreateInfo(vkStream, reinterpret_cast<VkExternalMemoryBufferCreateInfo*>(structExtension_out));
+            unmarshal_VkExternalMemoryBufferCreateInfo(vkStream, rootType, reinterpret_cast<VkExternalMemoryBufferCreateInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO:
         {
-            unmarshal_VkExportMemoryAllocateInfo(vkStream, reinterpret_cast<VkExportMemoryAllocateInfo*>(structExtension_out));
+            unmarshal_VkExportMemoryAllocateInfo(vkStream, rootType, reinterpret_cast<VkExportMemoryAllocateInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO:
         {
-            unmarshal_VkExportFenceCreateInfo(vkStream, reinterpret_cast<VkExportFenceCreateInfo*>(structExtension_out));
+            unmarshal_VkExportFenceCreateInfo(vkStream, rootType, reinterpret_cast<VkExportFenceCreateInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO:
         {
-            unmarshal_VkExportSemaphoreCreateInfo(vkStream, reinterpret_cast<VkExportSemaphoreCreateInfo*>(structExtension_out));
+            unmarshal_VkExportSemaphoreCreateInfo(vkStream, rootType, reinterpret_cast<VkExportSemaphoreCreateInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES:
         {
-            unmarshal_VkPhysicalDeviceMaintenance3Properties(vkStream, reinterpret_cast<VkPhysicalDeviceMaintenance3Properties*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceMaintenance3Properties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMaintenance3Properties*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES:
         {
-            unmarshal_VkPhysicalDeviceShaderDrawParametersFeatures(vkStream, reinterpret_cast<VkPhysicalDeviceShaderDrawParametersFeatures*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceVulkan11Features*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceVulkan11Features(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceVulkan11Features*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES:
         {
-            unmarshal_VkPhysicalDeviceVulkan11Properties(vkStream, reinterpret_cast<VkPhysicalDeviceVulkan11Properties*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceVulkan11Properties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceVulkan11Properties*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES:
         {
-            unmarshal_VkPhysicalDeviceVulkan12Features(vkStream, reinterpret_cast<VkPhysicalDeviceVulkan12Features*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceVulkan12Features(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceVulkan12Features*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES:
         {
-            unmarshal_VkPhysicalDeviceVulkan12Properties(vkStream, reinterpret_cast<VkPhysicalDeviceVulkan12Properties*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceVulkan12Properties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceVulkan12Properties*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO:
         {
-            unmarshal_VkImageFormatListCreateInfo(vkStream, reinterpret_cast<VkImageFormatListCreateInfo*>(structExtension_out));
+            unmarshal_VkImageFormatListCreateInfo(vkStream, rootType, reinterpret_cast<VkImageFormatListCreateInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES:
         {
-            unmarshal_VkPhysicalDevice8BitStorageFeatures(vkStream, reinterpret_cast<VkPhysicalDevice8BitStorageFeatures*>(structExtension_out));
+            unmarshal_VkPhysicalDevice8BitStorageFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDevice8BitStorageFeatures*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES:
         {
-            unmarshal_VkPhysicalDeviceDriverProperties(vkStream, reinterpret_cast<VkPhysicalDeviceDriverProperties*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceDriverProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDriverProperties*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES:
         {
-            unmarshal_VkPhysicalDeviceShaderAtomicInt64Features(vkStream, reinterpret_cast<VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceShaderAtomicInt64Features(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES:
         {
-            unmarshal_VkPhysicalDeviceShaderFloat16Int8Features(vkStream, reinterpret_cast<VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceShaderFloat16Int8Features(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES:
         {
-            unmarshal_VkPhysicalDeviceFloatControlsProperties(vkStream, reinterpret_cast<VkPhysicalDeviceFloatControlsProperties*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceFloatControlsProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFloatControlsProperties*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO:
         {
-            unmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfo(vkStream, reinterpret_cast<VkDescriptorSetLayoutBindingFlagsCreateInfo*>(structExtension_out));
+            unmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfo(vkStream, rootType, reinterpret_cast<VkDescriptorSetLayoutBindingFlagsCreateInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES:
         {
-            unmarshal_VkPhysicalDeviceDescriptorIndexingFeatures(vkStream, reinterpret_cast<VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceDescriptorIndexingFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES:
         {
-            unmarshal_VkPhysicalDeviceDescriptorIndexingProperties(vkStream, reinterpret_cast<VkPhysicalDeviceDescriptorIndexingProperties*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceDescriptorIndexingProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDescriptorIndexingProperties*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO:
         {
-            unmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfo(vkStream, reinterpret_cast<VkDescriptorSetVariableDescriptorCountAllocateInfo*>(structExtension_out));
+            unmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfo(vkStream, rootType, reinterpret_cast<VkDescriptorSetVariableDescriptorCountAllocateInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT:
         {
-            unmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupport(vkStream, reinterpret_cast<VkDescriptorSetVariableDescriptorCountLayoutSupport*>(structExtension_out));
+            unmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupport(vkStream, rootType, reinterpret_cast<VkDescriptorSetVariableDescriptorCountLayoutSupport*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE:
         {
-            unmarshal_VkSubpassDescriptionDepthStencilResolve(vkStream, reinterpret_cast<VkSubpassDescriptionDepthStencilResolve*>(structExtension_out));
+            unmarshal_VkSubpassDescriptionDepthStencilResolve(vkStream, rootType, reinterpret_cast<VkSubpassDescriptionDepthStencilResolve*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES:
         {
-            unmarshal_VkPhysicalDeviceDepthStencilResolveProperties(vkStream, reinterpret_cast<VkPhysicalDeviceDepthStencilResolveProperties*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceDepthStencilResolveProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDepthStencilResolveProperties*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES:
         {
-            unmarshal_VkPhysicalDeviceScalarBlockLayoutFeatures(vkStream, reinterpret_cast<VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceScalarBlockLayoutFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO:
         {
-            unmarshal_VkImageStencilUsageCreateInfo(vkStream, reinterpret_cast<VkImageStencilUsageCreateInfo*>(structExtension_out));
+            unmarshal_VkImageStencilUsageCreateInfo(vkStream, rootType, reinterpret_cast<VkImageStencilUsageCreateInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO:
         {
-            unmarshal_VkSamplerReductionModeCreateInfo(vkStream, reinterpret_cast<VkSamplerReductionModeCreateInfo*>(structExtension_out));
+            unmarshal_VkSamplerReductionModeCreateInfo(vkStream, rootType, reinterpret_cast<VkSamplerReductionModeCreateInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES:
         {
-            unmarshal_VkPhysicalDeviceSamplerFilterMinmaxProperties(vkStream, reinterpret_cast<VkPhysicalDeviceSamplerFilterMinmaxProperties*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceSamplerFilterMinmaxProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceSamplerFilterMinmaxProperties*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES:
         {
-            unmarshal_VkPhysicalDeviceVulkanMemoryModelFeatures(vkStream, reinterpret_cast<VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceVulkanMemoryModelFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES:
         {
-            unmarshal_VkPhysicalDeviceImagelessFramebufferFeatures(vkStream, reinterpret_cast<VkPhysicalDeviceImagelessFramebufferFeatures*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceImagelessFramebufferFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceImagelessFramebufferFeatures*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO:
         {
-            unmarshal_VkFramebufferAttachmentsCreateInfo(vkStream, reinterpret_cast<VkFramebufferAttachmentsCreateInfo*>(structExtension_out));
+            unmarshal_VkFramebufferAttachmentsCreateInfo(vkStream, rootType, reinterpret_cast<VkFramebufferAttachmentsCreateInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO:
         {
-            unmarshal_VkRenderPassAttachmentBeginInfo(vkStream, reinterpret_cast<VkRenderPassAttachmentBeginInfo*>(structExtension_out));
+            unmarshal_VkRenderPassAttachmentBeginInfo(vkStream, rootType, reinterpret_cast<VkRenderPassAttachmentBeginInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES:
         {
-            unmarshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(vkStream, reinterpret_cast<VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES:
         {
-            unmarshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(vkStream, reinterpret_cast<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES:
         {
-            unmarshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(vkStream, reinterpret_cast<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT:
         {
-            unmarshal_VkAttachmentReferenceStencilLayout(vkStream, reinterpret_cast<VkAttachmentReferenceStencilLayout*>(structExtension_out));
+            unmarshal_VkAttachmentReferenceStencilLayout(vkStream, rootType, reinterpret_cast<VkAttachmentReferenceStencilLayout*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT:
         {
-            unmarshal_VkAttachmentDescriptionStencilLayout(vkStream, reinterpret_cast<VkAttachmentDescriptionStencilLayout*>(structExtension_out));
+            unmarshal_VkAttachmentDescriptionStencilLayout(vkStream, rootType, reinterpret_cast<VkAttachmentDescriptionStencilLayout*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES:
         {
-            unmarshal_VkPhysicalDeviceHostQueryResetFeatures(vkStream, reinterpret_cast<VkPhysicalDeviceHostQueryResetFeatures*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceHostQueryResetFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceHostQueryResetFeatures*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES:
         {
-            unmarshal_VkPhysicalDeviceTimelineSemaphoreFeatures(vkStream, reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceTimelineSemaphoreFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES:
         {
-            unmarshal_VkPhysicalDeviceTimelineSemaphoreProperties(vkStream, reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreProperties*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceTimelineSemaphoreProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreProperties*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO:
         {
-            unmarshal_VkSemaphoreTypeCreateInfo(vkStream, reinterpret_cast<VkSemaphoreTypeCreateInfo*>(structExtension_out));
+            unmarshal_VkSemaphoreTypeCreateInfo(vkStream, rootType, reinterpret_cast<VkSemaphoreTypeCreateInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO:
         {
-            unmarshal_VkTimelineSemaphoreSubmitInfo(vkStream, reinterpret_cast<VkTimelineSemaphoreSubmitInfo*>(structExtension_out));
+            unmarshal_VkTimelineSemaphoreSubmitInfo(vkStream, rootType, reinterpret_cast<VkTimelineSemaphoreSubmitInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES:
         {
-            unmarshal_VkPhysicalDeviceBufferDeviceAddressFeatures(vkStream, reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeatures*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceBufferDeviceAddressFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeatures*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO:
         {
-            unmarshal_VkBufferOpaqueCaptureAddressCreateInfo(vkStream, reinterpret_cast<VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension_out));
+            unmarshal_VkBufferOpaqueCaptureAddressCreateInfo(vkStream, rootType, reinterpret_cast<VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO:
         {
-            unmarshal_VkMemoryOpaqueCaptureAddressAllocateInfo(vkStream, reinterpret_cast<VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension_out));
+            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, reinterpret_cast<VkImageSwapchainCreateInfoKHR*>(structExtension_out));
+            unmarshal_VkImageSwapchainCreateInfoKHR(vkStream, rootType, reinterpret_cast<VkImageSwapchainCreateInfoKHR*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR:
         {
-            unmarshal_VkBindImageMemorySwapchainInfoKHR(vkStream, reinterpret_cast<VkBindImageMemorySwapchainInfoKHR*>(structExtension_out));
+            unmarshal_VkBindImageMemorySwapchainInfoKHR(vkStream, rootType, reinterpret_cast<VkBindImageMemorySwapchainInfoKHR*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR:
         {
-            unmarshal_VkDeviceGroupPresentInfoKHR(vkStream, reinterpret_cast<VkDeviceGroupPresentInfoKHR*>(structExtension_out));
+            unmarshal_VkDeviceGroupPresentInfoKHR(vkStream, rootType, reinterpret_cast<VkDeviceGroupPresentInfoKHR*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR:
         {
-            unmarshal_VkDeviceGroupSwapchainCreateInfoKHR(vkStream, reinterpret_cast<VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension_out));
+            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, reinterpret_cast<VkDisplayPresentInfoKHR*>(structExtension_out));
+            unmarshal_VkDisplayPresentInfoKHR(vkStream, rootType, reinterpret_cast<VkDisplayPresentInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_external_memory_win32
         case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
         {
-            unmarshal_VkImportMemoryWin32HandleInfoKHR(vkStream, reinterpret_cast<VkImportMemoryWin32HandleInfoKHR*>(structExtension_out));
+            unmarshal_VkImportMemoryWin32HandleInfoKHR(vkStream, rootType, reinterpret_cast<VkImportMemoryWin32HandleInfoKHR*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
         {
-            unmarshal_VkExportMemoryWin32HandleInfoKHR(vkStream, reinterpret_cast<VkExportMemoryWin32HandleInfoKHR*>(structExtension_out));
+            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, reinterpret_cast<VkImportMemoryFdInfoKHR*>(structExtension_out));
+            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, reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension_out));
+            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, reinterpret_cast<VkExportSemaphoreWin32HandleInfoKHR*>(structExtension_out));
+            unmarshal_VkExportSemaphoreWin32HandleInfoKHR(vkStream, rootType, reinterpret_cast<VkExportSemaphoreWin32HandleInfoKHR*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR:
         {
-            unmarshal_VkD3D12FenceSubmitInfoKHR(vkStream, reinterpret_cast<VkD3D12FenceSubmitInfoKHR*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDevicePushDescriptorPropertiesKHR*>(structExtension_out));
+            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, reinterpret_cast<VkPresentRegionsKHR*>(structExtension_out));
+            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, reinterpret_cast<VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension_out));
+            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, reinterpret_cast<VkExportFenceWin32HandleInfoKHR*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDevicePerformanceQueryFeaturesKHR*>(structExtension_out));
+            unmarshal_VkPhysicalDevicePerformanceQueryFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePerformanceQueryFeaturesKHR*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR:
         {
-            unmarshal_VkPhysicalDevicePerformanceQueryPropertiesKHR(vkStream, reinterpret_cast<VkPhysicalDevicePerformanceQueryPropertiesKHR*>(structExtension_out));
+            unmarshal_VkPhysicalDevicePerformanceQueryPropertiesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePerformanceQueryPropertiesKHR*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR:
         {
-            unmarshal_VkQueryPoolPerformanceCreateInfoKHR(vkStream, reinterpret_cast<VkQueryPoolPerformanceCreateInfoKHR*>(structExtension_out));
+            unmarshal_VkQueryPoolPerformanceCreateInfoKHR(vkStream, rootType, reinterpret_cast<VkQueryPoolPerformanceCreateInfoKHR*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR:
         {
-            unmarshal_VkPerformanceQuerySubmitInfoKHR(vkStream, reinterpret_cast<VkPerformanceQuerySubmitInfoKHR*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(structExtension_out));
+            unmarshal_VkPhysicalDevicePortabilitySubsetFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR:
         {
-            unmarshal_VkPhysicalDevicePortabilitySubsetPropertiesKHR(vkStream, reinterpret_cast<VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(structExtension_out));
+            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, reinterpret_cast<VkFragmentShadingRateAttachmentInfoKHR*>(structExtension_out));
+            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, reinterpret_cast<VkPipelineFragmentShadingRateStateCreateInfoKHR*>(structExtension_out));
+            unmarshal_VkPipelineFragmentShadingRateStateCreateInfoKHR(vkStream, rootType, reinterpret_cast<VkPipelineFragmentShadingRateStateCreateInfoKHR*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR:
         {
-            unmarshal_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(vkStream, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR:
         {
-            unmarshal_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(vkStream, reinterpret_cast<VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(structExtension_out));
+            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, reinterpret_cast<VkSurfaceProtectedCapabilitiesKHR*>(structExtension_out));
+            unmarshal_VkSurfaceProtectedCapabilitiesKHR(vkStream, rootType, reinterpret_cast<VkSurfaceProtectedCapabilitiesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR:
         {
-            unmarshal_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(vkStream, reinterpret_cast<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(structExtension_out));
+            unmarshal_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_ANDROID_native_buffer
         case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID:
         {
-            unmarshal_VkNativeBufferANDROID(vkStream, reinterpret_cast<VkNativeBufferANDROID*>(structExtension_out));
+            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, reinterpret_cast<VkDebugReportCallbackCreateInfoEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPipelineRasterizationStateRasterizationOrderAMD*>(structExtension_out));
+            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, reinterpret_cast<VkDedicatedAllocationImageCreateInfoNV*>(structExtension_out));
+            unmarshal_VkDedicatedAllocationImageCreateInfoNV(vkStream, rootType, reinterpret_cast<VkDedicatedAllocationImageCreateInfoNV*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV:
         {
-            unmarshal_VkDedicatedAllocationBufferCreateInfoNV(vkStream, reinterpret_cast<VkDedicatedAllocationBufferCreateInfoNV*>(structExtension_out));
+            unmarshal_VkDedicatedAllocationBufferCreateInfoNV(vkStream, rootType, reinterpret_cast<VkDedicatedAllocationBufferCreateInfoNV*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV:
         {
-            unmarshal_VkDedicatedAllocationMemoryAllocateInfoNV(vkStream, reinterpret_cast<VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceTransformFeedbackFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT:
         {
-            unmarshal_VkPhysicalDeviceTransformFeedbackPropertiesEXT(vkStream, reinterpret_cast<VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceTransformFeedbackPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT:
         {
-            unmarshal_VkPipelineRasterizationStateStreamCreateInfoEXT(vkStream, reinterpret_cast<VkPipelineRasterizationStateStreamCreateInfoEXT*>(structExtension_out));
+            unmarshal_VkPipelineRasterizationStateStreamCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineRasterizationStateStreamCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
         case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD:
         {
-            unmarshal_VkTextureLODGatherFormatPropertiesAMD(vkStream, reinterpret_cast<VkTextureLODGatherFormatPropertiesAMD*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceCornerSampledImageFeaturesNV*>(structExtension_out));
+            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, reinterpret_cast<VkExternalMemoryImageCreateInfoNV*>(structExtension_out));
+            unmarshal_VkExternalMemoryImageCreateInfoNV(vkStream, rootType, reinterpret_cast<VkExternalMemoryImageCreateInfoNV*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV:
         {
-            unmarshal_VkExportMemoryAllocateInfoNV(vkStream, reinterpret_cast<VkExportMemoryAllocateInfoNV*>(structExtension_out));
+            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, reinterpret_cast<VkImportMemoryWin32HandleInfoNV*>(structExtension_out));
+            unmarshal_VkImportMemoryWin32HandleInfoNV(vkStream, rootType, reinterpret_cast<VkImportMemoryWin32HandleInfoNV*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV:
         {
-            unmarshal_VkExportMemoryWin32HandleInfoNV(vkStream, reinterpret_cast<VkExportMemoryWin32HandleInfoNV*>(structExtension_out));
+            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, reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension_out));
+            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, reinterpret_cast<VkValidationFlagsEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(structExtension_out));
+            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, reinterpret_cast<VkImageViewASTCDecodeModeEXT*>(structExtension_out));
+            unmarshal_VkImageViewASTCDecodeModeEXT(vkStream, rootType, reinterpret_cast<VkImageViewASTCDecodeModeEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT:
         {
-            unmarshal_VkPhysicalDeviceASTCDecodeFeaturesEXT(vkStream, reinterpret_cast<VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceConditionalRenderingFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT:
         {
-            unmarshal_VkCommandBufferInheritanceConditionalRenderingInfoEXT(vkStream, reinterpret_cast<VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPipelineViewportWScalingStateCreateInfoNV*>(structExtension_out));
+            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, reinterpret_cast<VkSwapchainCounterCreateInfoEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPresentTimesInfoGOOGLE*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(structExtension_out));
+            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, reinterpret_cast<VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceDiscardRectanglePropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT:
         {
-            unmarshal_VkPipelineDiscardRectangleStateCreateInfoEXT(vkStream, reinterpret_cast<VkPipelineDiscardRectangleStateCreateInfoEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT:
         {
-            unmarshal_VkPipelineRasterizationConservativeStateCreateInfoEXT(vkStream, reinterpret_cast<VkPipelineRasterizationConservativeStateCreateInfoEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(structExtension_out));
+            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, reinterpret_cast<VkDebugUtilsMessengerCreateInfoEXT*>(structExtension_out));
+            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, reinterpret_cast<VkAndroidHardwareBufferUsageANDROID*>(structExtension_out));
+            unmarshal_VkAndroidHardwareBufferUsageANDROID(vkStream, rootType, reinterpret_cast<VkAndroidHardwareBufferUsageANDROID*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID:
         {
-            unmarshal_VkAndroidHardwareBufferFormatPropertiesANDROID(vkStream, reinterpret_cast<VkAndroidHardwareBufferFormatPropertiesANDROID*>(structExtension_out));
+            unmarshal_VkAndroidHardwareBufferFormatPropertiesANDROID(vkStream, rootType, reinterpret_cast<VkAndroidHardwareBufferFormatPropertiesANDROID*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID:
         {
-            unmarshal_VkImportAndroidHardwareBufferInfoANDROID(vkStream, reinterpret_cast<VkImportAndroidHardwareBufferInfoANDROID*>(structExtension_out));
+            unmarshal_VkImportAndroidHardwareBufferInfoANDROID(vkStream, rootType, reinterpret_cast<VkImportAndroidHardwareBufferInfoANDROID*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID:
         {
-            unmarshal_VkExternalFormatANDROID(vkStream, reinterpret_cast<VkExternalFormatANDROID*>(structExtension_out));
+            unmarshal_VkExternalFormatANDROID(vkStream, rootType, reinterpret_cast<VkExternalFormatANDROID*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_inline_uniform_block
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT:
         {
-            unmarshal_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(vkStream, reinterpret_cast<VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT:
         {
-            unmarshal_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(vkStream, reinterpret_cast<VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT:
         {
-            unmarshal_VkWriteDescriptorSetInlineUniformBlockEXT(vkStream, reinterpret_cast<VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension_out));
+            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, reinterpret_cast<VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(structExtension_out));
+            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, reinterpret_cast<VkSampleLocationsInfoEXT*>(structExtension_out));
+            unmarshal_VkSampleLocationsInfoEXT(vkStream, rootType, reinterpret_cast<VkSampleLocationsInfoEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT:
         {
-            unmarshal_VkRenderPassSampleLocationsBeginInfoEXT(vkStream, reinterpret_cast<VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension_out));
+            unmarshal_VkRenderPassSampleLocationsBeginInfoEXT(vkStream, rootType, reinterpret_cast<VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT:
         {
-            unmarshal_VkPipelineSampleLocationsStateCreateInfoEXT(vkStream, reinterpret_cast<VkPipelineSampleLocationsStateCreateInfoEXT*>(structExtension_out));
+            unmarshal_VkPipelineSampleLocationsStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineSampleLocationsStateCreateInfoEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT:
         {
-            unmarshal_VkPhysicalDeviceSampleLocationsPropertiesEXT(vkStream, reinterpret_cast<VkPhysicalDeviceSampleLocationsPropertiesEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT:
         {
-            unmarshal_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(vkStream, reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension_out));
+            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, reinterpret_cast<VkPipelineCoverageModulationStateCreateInfoNV*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV:
         {
-            unmarshal_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(vkStream, reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(structExtension_out));
+            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, reinterpret_cast<VkDrmFormatModifierPropertiesListEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(structExtension_out));
+            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, reinterpret_cast<VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension_out));
+            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, reinterpret_cast<VkImageDrmFormatModifierExplicitCreateInfoEXT*>(structExtension_out));
+            unmarshal_VkImageDrmFormatModifierExplicitCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkImageDrmFormatModifierExplicitCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_validation_cache
         case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT:
         {
-            unmarshal_VkShaderModuleValidationCacheCreateInfoEXT(vkStream, reinterpret_cast<VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPipelineViewportShadingRateImageStateCreateInfoNV*>(structExtension_out));
+            unmarshal_VkPipelineViewportShadingRateImageStateCreateInfoNV(vkStream, rootType, reinterpret_cast<VkPipelineViewportShadingRateImageStateCreateInfoNV*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV:
         {
-            unmarshal_VkPhysicalDeviceShadingRateImageFeaturesNV(vkStream, reinterpret_cast<VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceShadingRateImageFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV:
         {
-            unmarshal_VkPhysicalDeviceShadingRateImagePropertiesNV(vkStream, reinterpret_cast<VkPhysicalDeviceShadingRateImagePropertiesNV*>(structExtension_out));
+            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, reinterpret_cast<VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(structExtension_out));
+            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, reinterpret_cast<VkWriteDescriptorSetAccelerationStructureNV*>(structExtension_out));
+            unmarshal_VkWriteDescriptorSetAccelerationStructureNV(vkStream, rootType, reinterpret_cast<VkWriteDescriptorSetAccelerationStructureNV*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV:
         {
-            unmarshal_VkPhysicalDeviceRayTracingPropertiesNV(vkStream, reinterpret_cast<VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(structExtension_out));
+            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, reinterpret_cast<VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceImageViewImageFormatInfoEXT*>(structExtension_out));
+            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, reinterpret_cast<VkFilterCubicImageViewImageFormatPropertiesEXT*>(structExtension_out));
+            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, reinterpret_cast<VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension_out));
+            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, reinterpret_cast<VkImportMemoryHostPointerInfoEXT*>(structExtension_out));
+            unmarshal_VkImportMemoryHostPointerInfoEXT(vkStream, rootType, reinterpret_cast<VkImportMemoryHostPointerInfoEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT:
         {
-            unmarshal_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(vkStream, reinterpret_cast<VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPipelineCompilerControlCreateInfoAMD*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceShaderCorePropertiesAMD(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
         case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD:
         {
-            unmarshal_VkDeviceMemoryOverallocationCreateInfoAMD(vkStream, reinterpret_cast<VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPipelineVertexInputDivisorStateCreateInfoEXT*>(structExtension_out));
+            unmarshal_VkPipelineVertexInputDivisorStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineVertexInputDivisorStateCreateInfoEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT:
         {
-            unmarshal_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(vkStream, reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPresentFrameTokenGGP*>(structExtension_out));
+            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, reinterpret_cast<VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceMeshShaderFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV:
         {
-            unmarshal_VkPhysicalDeviceMeshShaderPropertiesNV(vkStream, reinterpret_cast<VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(structExtension_out));
+            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, reinterpret_cast<VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(structExtension_out));
+            unmarshal_VkPipelineViewportExclusiveScissorStateCreateInfoNV(vkStream, rootType, reinterpret_cast<VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV:
         {
-            unmarshal_VkPhysicalDeviceExclusiveScissorFeaturesNV(vkStream, reinterpret_cast<VkPhysicalDeviceExclusiveScissorFeaturesNV*>(structExtension_out));
+            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, reinterpret_cast<VkQueueFamilyCheckpointPropertiesNV*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(structExtension_out));
+            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, reinterpret_cast<VkQueryPoolPerformanceQueryCreateInfoINTEL*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension_out));
+            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, reinterpret_cast<VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension_out));
+            unmarshal_VkDisplayNativeHdrSurfaceCapabilitiesAMD(vkStream, rootType, reinterpret_cast<VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD:
         {
-            unmarshal_VkSwapchainDisplayNativeHdrCreateInfoAMD(vkStream, reinterpret_cast<VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension_out));
+            unmarshal_VkSwapchainDisplayNativeHdrCreateInfoAMD(vkStream, rootType, reinterpret_cast<VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension_out));
             break;
         }
 #endif
-#ifdef VK_GOOGLE_color_buffer
-        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE:
+#ifdef VK_EXT_fragment_density_map
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT:
         {
-            unmarshal_VkImportColorBufferGOOGLE(vkStream, reinterpret_cast<VkImportColorBufferGOOGLE*>(structExtension_out));
+            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));
+                    break;
+                }
+                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));
+                    break;
+                }
+            }
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE:
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT:
         {
-            unmarshal_VkImportBufferGOOGLE(vkStream, reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out));
+            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));
+                    break;
+                }
+                default:
+                {
+                    unmarshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension_out));
+                    break;
+                }
+            }
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
+        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT:
         {
-            unmarshal_VkImportPhysicalAddressGOOGLE(vkStream, reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
+            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));
+                    break;
+                }
+                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));
+                    break;
+                }
+            }
             break;
         }
 #endif
 #ifdef VK_EXT_subgroup_size_control
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT:
         {
-            unmarshal_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(vkStream, reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT:
         {
-            unmarshal_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(vkStream, reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceMemoryPriorityFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT:
         {
-            unmarshal_VkMemoryPriorityAllocateInfoEXT(vkStream, reinterpret_cast<VkMemoryPriorityAllocateInfoEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT:
         {
-            unmarshal_VkBufferDeviceAddressCreateInfoEXT(vkStream, reinterpret_cast<VkBufferDeviceAddressCreateInfoEXT*>(structExtension_out));
+            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, reinterpret_cast<VkValidationFeaturesEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceCooperativeMatrixFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV:
         {
-            unmarshal_VkPhysicalDeviceCooperativeMatrixPropertiesNV(vkStream, reinterpret_cast<VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceCoverageReductionModeFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV:
         {
-            unmarshal_VkPipelineCoverageReductionStateCreateInfoNV(vkStream, reinterpret_cast<VkPipelineCoverageReductionStateCreateInfoNV*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_full_screen_exclusive
         case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT:
         {
-            unmarshal_VkSurfaceFullScreenExclusiveInfoEXT(vkStream, reinterpret_cast<VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension_out));
+            unmarshal_VkSurfaceFullScreenExclusiveInfoEXT(vkStream, rootType, reinterpret_cast<VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT:
         {
-            unmarshal_VkSurfaceCapabilitiesFullScreenExclusiveEXT(vkStream, reinterpret_cast<VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(structExtension_out));
+            unmarshal_VkSurfaceCapabilitiesFullScreenExclusiveEXT(vkStream, rootType, reinterpret_cast<VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT:
         {
-            unmarshal_VkSurfaceFullScreenExclusiveWin32InfoEXT(vkStream, reinterpret_cast<VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceLineRasterizationFeaturesEXT*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceLineRasterizationFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceLineRasterizationFeaturesEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT:
         {
-            unmarshal_VkPhysicalDeviceLineRasterizationPropertiesEXT(vkStream, reinterpret_cast<VkPhysicalDeviceLineRasterizationPropertiesEXT*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceLineRasterizationPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceLineRasterizationPropertiesEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT:
         {
-            unmarshal_VkPipelineRasterizationLineStateCreateInfoEXT(vkStream, reinterpret_cast<VkPipelineRasterizationLineStateCreateInfoEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(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, reinterpret_cast<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV:
         {
-            unmarshal_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(vkStream, reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV:
         {
-            unmarshal_VkGraphicsPipelineShaderGroupsCreateInfoNV(vkStream, reinterpret_cast<VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension_out));
+            unmarshal_VkGraphicsPipelineShaderGroupsCreateInfoNV(vkStream, rootType, reinterpret_cast<VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_texel_buffer_alignment
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT:
         {
-            unmarshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(vkStream, reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT:
         {
-            unmarshal_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(vkStream, reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(structExtension_out));
+            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, reinterpret_cast<VkRenderPassTransformBeginInfoQCOM*>(structExtension_out));
+            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, reinterpret_cast<VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT:
         {
-            unmarshal_VkDeviceDeviceMemoryReportCreateInfoEXT(vkStream, reinterpret_cast<VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceRobustness2FeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT:
         {
-            unmarshal_VkPhysicalDeviceRobustness2PropertiesEXT(vkStream, reinterpret_cast<VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension_out));
+            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, reinterpret_cast<VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension_out));
+            unmarshal_VkSamplerCustomBorderColorCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT:
         {
-            unmarshal_VkPhysicalDeviceCustomBorderColorPropertiesEXT(vkStream, reinterpret_cast<VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceCustomBorderColorPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT:
         {
-            unmarshal_VkPhysicalDeviceCustomBorderColorFeaturesEXT(vkStream, reinterpret_cast<VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension_out));
+            unmarshal_VkPhysicalDevicePrivateDataFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT:
         {
-            unmarshal_VkDevicePrivateDataCreateInfoEXT(vkStream, reinterpret_cast<VkDevicePrivateDataCreateInfoEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV:
         {
-            unmarshal_VkDeviceDiagnosticsConfigCreateInfoNV(vkStream, reinterpret_cast<VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(structExtension_out));
+            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, reinterpret_cast<VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(structExtension_out));
+            unmarshal_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(vkStream, rootType, reinterpret_cast<VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(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, reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(structExtension_out));
+            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, reinterpret_cast<VkCopyCommandTransformInfoQCOM*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceImageRobustnessFeaturesEXT*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension_out));
+            unmarshal_VkPhysicalDevice4444FormatsFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDevice4444FormatsFeaturesEXT*>(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));
+            break;
+        }
+        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));
             break;
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
         case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR:
         {
-            unmarshal_VkWriteDescriptorSetAccelerationStructureKHR(vkStream, reinterpret_cast<VkWriteDescriptorSetAccelerationStructureKHR*>(structExtension_out));
+            unmarshal_VkWriteDescriptorSetAccelerationStructureKHR(vkStream, rootType, reinterpret_cast<VkWriteDescriptorSetAccelerationStructureKHR*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR:
         {
-            unmarshal_VkPhysicalDeviceAccelerationStructureFeaturesKHR(vkStream, reinterpret_cast<VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceAccelerationStructureFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR:
         {
-            unmarshal_VkPhysicalDeviceAccelerationStructurePropertiesKHR(vkStream, reinterpret_cast<VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(structExtension_out));
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR:
         {
-            unmarshal_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(vkStream, reinterpret_cast<VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(structExtension_out));
+            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, reinterpret_cast<VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension_out));
+            unmarshal_VkPhysicalDeviceRayQueryFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension_out));
             break;
         }
 #endif
@@ -21468,8 +27840,6 @@
         {
             return "OP_vkMapMemoryIntoAddressSpaceGOOGLE";
         }
-#endif
-#ifdef VK_GOOGLE_color_buffer
         case OP_vkRegisterImageColorBufferGOOGLE:
         {
             return "OP_vkRegisterImageColorBufferGOOGLE";
@@ -21478,8 +27848,6 @@
         {
             return "OP_vkRegisterBufferColorBufferGOOGLE";
         }
-#endif
-#ifdef VK_GOOGLE_gfxstream
         case OP_vkUpdateDescriptorSetWithTemplateSizedGOOGLE:
         {
             return "OP_vkUpdateDescriptorSetWithTemplateSizedGOOGLE";
diff --git a/system/vulkan_enc/goldfish_vk_marshaling_guest.h b/system/vulkan_enc/goldfish_vk_marshaling_guest.h
index 68ea1a6..86c6b4e 100644
--- a/system/vulkan_enc/goldfish_vk_marshaling_guest.h
+++ b/system/vulkan_enc/goldfish_vk_marshaling_guest.h
@@ -46,218 +46,272 @@
 #ifdef VK_VERSION_1_0
 void marshal_VkExtent2D(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExtent2D* forMarshaling);
 
 void unmarshal_VkExtent2D(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExtent2D* forUnmarshaling);
 
 void marshal_VkExtent3D(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExtent3D* forMarshaling);
 
 void unmarshal_VkExtent3D(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExtent3D* forUnmarshaling);
 
 void marshal_VkOffset2D(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkOffset2D* forMarshaling);
 
 void unmarshal_VkOffset2D(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkOffset2D* forUnmarshaling);
 
 void marshal_VkOffset3D(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkOffset3D* forMarshaling);
 
 void unmarshal_VkOffset3D(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkOffset3D* forUnmarshaling);
 
 void marshal_VkRect2D(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRect2D* forMarshaling);
 
 void unmarshal_VkRect2D(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRect2D* forUnmarshaling);
 
 void marshal_VkBaseInStructure(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBaseInStructure* forMarshaling);
 
 void unmarshal_VkBaseInStructure(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBaseInStructure* forUnmarshaling);
 
 void marshal_VkBaseOutStructure(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBaseOutStructure* forMarshaling);
 
 void unmarshal_VkBaseOutStructure(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBaseOutStructure* forUnmarshaling);
 
 void marshal_VkBufferMemoryBarrier(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferMemoryBarrier* forMarshaling);
 
 void unmarshal_VkBufferMemoryBarrier(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBufferMemoryBarrier* forUnmarshaling);
 
 void marshal_VkDispatchIndirectCommand(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDispatchIndirectCommand* forMarshaling);
 
 void unmarshal_VkDispatchIndirectCommand(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDispatchIndirectCommand* forUnmarshaling);
 
 void marshal_VkDrawIndexedIndirectCommand(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDrawIndexedIndirectCommand* forMarshaling);
 
 void unmarshal_VkDrawIndexedIndirectCommand(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDrawIndexedIndirectCommand* forUnmarshaling);
 
 void marshal_VkDrawIndirectCommand(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDrawIndirectCommand* forMarshaling);
 
 void unmarshal_VkDrawIndirectCommand(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDrawIndirectCommand* forUnmarshaling);
 
 void marshal_VkImageSubresourceRange(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageSubresourceRange* forMarshaling);
 
 void unmarshal_VkImageSubresourceRange(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageSubresourceRange* forUnmarshaling);
 
 void marshal_VkImageMemoryBarrier(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageMemoryBarrier* forMarshaling);
 
 void unmarshal_VkImageMemoryBarrier(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageMemoryBarrier* forUnmarshaling);
 
 void marshal_VkMemoryBarrier(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryBarrier* forMarshaling);
 
 void unmarshal_VkMemoryBarrier(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryBarrier* forUnmarshaling);
 
 void marshal_VkAllocationCallbacks(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAllocationCallbacks* forMarshaling);
 
 void unmarshal_VkAllocationCallbacks(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAllocationCallbacks* forUnmarshaling);
 
 void marshal_VkApplicationInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkApplicationInfo* forMarshaling);
 
 void unmarshal_VkApplicationInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkApplicationInfo* forUnmarshaling);
 
 void marshal_VkFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFormatProperties* forMarshaling);
 
 void unmarshal_VkFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkFormatProperties* forUnmarshaling);
 
 void marshal_VkImageFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageFormatProperties* forMarshaling);
 
 void unmarshal_VkImageFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageFormatProperties* forUnmarshaling);
 
 void marshal_VkInstanceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkInstanceCreateInfo* forMarshaling);
 
 void unmarshal_VkInstanceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkInstanceCreateInfo* forUnmarshaling);
 
 void marshal_VkMemoryHeap(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryHeap* forMarshaling);
 
 void unmarshal_VkMemoryHeap(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryHeap* forUnmarshaling);
 
 void marshal_VkMemoryType(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryType* forMarshaling);
 
 void unmarshal_VkMemoryType(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryType* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceFeatures* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceLimits(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceLimits* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceLimits(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceLimits* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceMemoryProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryProperties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceMemoryProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceMemoryProperties* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceSparseProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSparseProperties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceSparseProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceSparseProperties* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceProperties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceProperties* forUnmarshaling);
 
 void marshal_VkQueueFamilyProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkQueueFamilyProperties* forMarshaling);
 
 void unmarshal_VkQueueFamilyProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkQueueFamilyProperties* forUnmarshaling);
 
 #define OP_vkCreateInstance 20000
@@ -273,48 +327,58 @@
 #define OP_vkGetDeviceProcAddr 20010
 void marshal_VkDeviceQueueCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceQueueCreateInfo* forMarshaling);
 
 void unmarshal_VkDeviceQueueCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceQueueCreateInfo* forUnmarshaling);
 
 void marshal_VkDeviceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceCreateInfo* forMarshaling);
 
 void unmarshal_VkDeviceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateDevice 20011
 #define OP_vkDestroyDevice 20012
 void marshal_VkExtensionProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExtensionProperties* forMarshaling);
 
 void unmarshal_VkExtensionProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExtensionProperties* forUnmarshaling);
 
 #define OP_vkEnumerateInstanceExtensionProperties 20013
 #define OP_vkEnumerateDeviceExtensionProperties 20014
 void marshal_VkLayerProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkLayerProperties* forMarshaling);
 
 void unmarshal_VkLayerProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkLayerProperties* forUnmarshaling);
 
 #define OP_vkEnumerateInstanceLayerProperties 20015
 #define OP_vkEnumerateDeviceLayerProperties 20016
 void marshal_VkSubmitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubmitInfo* forMarshaling);
 
 void unmarshal_VkSubmitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSubmitInfo* forUnmarshaling);
 
 #define OP_vkGetDeviceQueue 20017
@@ -323,18 +387,22 @@
 #define OP_vkDeviceWaitIdle 20020
 void marshal_VkMappedMemoryRange(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMappedMemoryRange* forMarshaling);
 
 void unmarshal_VkMappedMemoryRange(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMappedMemoryRange* forUnmarshaling);
 
 void marshal_VkMemoryAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryAllocateInfo* forMarshaling);
 
 void unmarshal_VkMemoryAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryAllocateInfo* forUnmarshaling);
 
 #define OP_vkAllocateMemory 20021
@@ -346,10 +414,12 @@
 #define OP_vkGetDeviceMemoryCommitment 20027
 void marshal_VkMemoryRequirements(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryRequirements* forMarshaling);
 
 void unmarshal_VkMemoryRequirements(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryRequirements* forUnmarshaling);
 
 #define OP_vkBindBufferMemory 20028
@@ -358,74 +428,92 @@
 #define OP_vkGetImageMemoryRequirements 20031
 void marshal_VkSparseMemoryBind(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseMemoryBind* forMarshaling);
 
 void unmarshal_VkSparseMemoryBind(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSparseMemoryBind* forUnmarshaling);
 
 void marshal_VkSparseBufferMemoryBindInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseBufferMemoryBindInfo* forMarshaling);
 
 void unmarshal_VkSparseBufferMemoryBindInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSparseBufferMemoryBindInfo* forUnmarshaling);
 
 void marshal_VkSparseImageOpaqueMemoryBindInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseImageOpaqueMemoryBindInfo* forMarshaling);
 
 void unmarshal_VkSparseImageOpaqueMemoryBindInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSparseImageOpaqueMemoryBindInfo* forUnmarshaling);
 
 void marshal_VkImageSubresource(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageSubresource* forMarshaling);
 
 void unmarshal_VkImageSubresource(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageSubresource* forUnmarshaling);
 
 void marshal_VkSparseImageMemoryBind(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseImageMemoryBind* forMarshaling);
 
 void unmarshal_VkSparseImageMemoryBind(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSparseImageMemoryBind* forUnmarshaling);
 
 void marshal_VkSparseImageMemoryBindInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseImageMemoryBindInfo* forMarshaling);
 
 void unmarshal_VkSparseImageMemoryBindInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSparseImageMemoryBindInfo* forUnmarshaling);
 
 void marshal_VkBindSparseInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindSparseInfo* forMarshaling);
 
 void unmarshal_VkBindSparseInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBindSparseInfo* forUnmarshaling);
 
 void marshal_VkSparseImageFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseImageFormatProperties* forMarshaling);
 
 void unmarshal_VkSparseImageFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSparseImageFormatProperties* forUnmarshaling);
 
 void marshal_VkSparseImageMemoryRequirements(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseImageMemoryRequirements* forMarshaling);
 
 void unmarshal_VkSparseImageMemoryRequirements(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSparseImageMemoryRequirements* forUnmarshaling);
 
 #define OP_vkGetImageSparseMemoryRequirements 20032
@@ -433,10 +521,12 @@
 #define OP_vkQueueBindSparse 20034
 void marshal_VkFenceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFenceCreateInfo* forMarshaling);
 
 void unmarshal_VkFenceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkFenceCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateFence 20035
@@ -446,20 +536,24 @@
 #define OP_vkWaitForFences 20039
 void marshal_VkSemaphoreCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSemaphoreCreateInfo* forMarshaling);
 
 void unmarshal_VkSemaphoreCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSemaphoreCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateSemaphore 20040
 #define OP_vkDestroySemaphore 20041
 void marshal_VkEventCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkEventCreateInfo* forMarshaling);
 
 void unmarshal_VkEventCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkEventCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateEvent 20042
@@ -469,10 +563,12 @@
 #define OP_vkResetEvent 20046
 void marshal_VkQueryPoolCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkQueryPoolCreateInfo* forMarshaling);
 
 void unmarshal_VkQueryPoolCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkQueryPoolCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateQueryPool 20047
@@ -480,38 +576,46 @@
 #define OP_vkGetQueryPoolResults 20049
 void marshal_VkBufferCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferCreateInfo* forMarshaling);
 
 void unmarshal_VkBufferCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBufferCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateBuffer 20050
 #define OP_vkDestroyBuffer 20051
 void marshal_VkBufferViewCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferViewCreateInfo* forMarshaling);
 
 void unmarshal_VkBufferViewCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBufferViewCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateBufferView 20052
 #define OP_vkDestroyBufferView 20053
 void marshal_VkImageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageCreateInfo* forMarshaling);
 
 void unmarshal_VkImageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageCreateInfo* forUnmarshaling);
 
 void marshal_VkSubresourceLayout(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubresourceLayout* forMarshaling);
 
 void unmarshal_VkSubresourceLayout(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSubresourceLayout* forUnmarshaling);
 
 #define OP_vkCreateImage 20054
@@ -519,38 +623,46 @@
 #define OP_vkGetImageSubresourceLayout 20056
 void marshal_VkComponentMapping(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkComponentMapping* forMarshaling);
 
 void unmarshal_VkComponentMapping(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkComponentMapping* forUnmarshaling);
 
 void marshal_VkImageViewCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageViewCreateInfo* forMarshaling);
 
 void unmarshal_VkImageViewCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageViewCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateImageView 20057
 #define OP_vkDestroyImageView 20058
 void marshal_VkShaderModuleCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkShaderModuleCreateInfo* forMarshaling);
 
 void unmarshal_VkShaderModuleCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkShaderModuleCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateShaderModule 20059
 #define OP_vkDestroyShaderModule 20060
 void marshal_VkPipelineCacheCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCacheCreateInfo* forMarshaling);
 
 void unmarshal_VkPipelineCacheCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineCacheCreateInfo* forUnmarshaling);
 
 #define OP_vkCreatePipelineCache 20061
@@ -559,154 +671,192 @@
 #define OP_vkMergePipelineCaches 20064
 void marshal_VkSpecializationMapEntry(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSpecializationMapEntry* forMarshaling);
 
 void unmarshal_VkSpecializationMapEntry(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSpecializationMapEntry* forUnmarshaling);
 
 void marshal_VkSpecializationInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSpecializationInfo* forMarshaling);
 
 void unmarshal_VkSpecializationInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSpecializationInfo* forUnmarshaling);
 
 void marshal_VkPipelineShaderStageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineShaderStageCreateInfo* forMarshaling);
 
 void unmarshal_VkPipelineShaderStageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineShaderStageCreateInfo* forUnmarshaling);
 
 void marshal_VkComputePipelineCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkComputePipelineCreateInfo* forMarshaling);
 
 void unmarshal_VkComputePipelineCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkComputePipelineCreateInfo* forUnmarshaling);
 
 void marshal_VkVertexInputBindingDescription(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkVertexInputBindingDescription* forMarshaling);
 
 void unmarshal_VkVertexInputBindingDescription(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkVertexInputBindingDescription* forUnmarshaling);
 
 void marshal_VkVertexInputAttributeDescription(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkVertexInputAttributeDescription* forMarshaling);
 
 void unmarshal_VkVertexInputAttributeDescription(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkVertexInputAttributeDescription* forUnmarshaling);
 
 void marshal_VkPipelineVertexInputStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineVertexInputStateCreateInfo* forMarshaling);
 
 void unmarshal_VkPipelineVertexInputStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineVertexInputStateCreateInfo* forUnmarshaling);
 
 void marshal_VkPipelineInputAssemblyStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineInputAssemblyStateCreateInfo* forMarshaling);
 
 void unmarshal_VkPipelineInputAssemblyStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineInputAssemblyStateCreateInfo* forUnmarshaling);
 
 void marshal_VkPipelineTessellationStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineTessellationStateCreateInfo* forMarshaling);
 
 void unmarshal_VkPipelineTessellationStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineTessellationStateCreateInfo* forUnmarshaling);
 
 void marshal_VkViewport(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkViewport* forMarshaling);
 
 void unmarshal_VkViewport(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkViewport* forUnmarshaling);
 
 void marshal_VkPipelineViewportStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineViewportStateCreateInfo* forMarshaling);
 
 void unmarshal_VkPipelineViewportStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineViewportStateCreateInfo* forUnmarshaling);
 
 void marshal_VkPipelineRasterizationStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRasterizationStateCreateInfo* forMarshaling);
 
 void unmarshal_VkPipelineRasterizationStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineRasterizationStateCreateInfo* forUnmarshaling);
 
 void marshal_VkPipelineMultisampleStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineMultisampleStateCreateInfo* forMarshaling);
 
 void unmarshal_VkPipelineMultisampleStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineMultisampleStateCreateInfo* forUnmarshaling);
 
 void marshal_VkStencilOpState(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkStencilOpState* forMarshaling);
 
 void unmarshal_VkStencilOpState(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkStencilOpState* forUnmarshaling);
 
 void marshal_VkPipelineDepthStencilStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineDepthStencilStateCreateInfo* forMarshaling);
 
 void unmarshal_VkPipelineDepthStencilStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineDepthStencilStateCreateInfo* forUnmarshaling);
 
 void marshal_VkPipelineColorBlendAttachmentState(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineColorBlendAttachmentState* forMarshaling);
 
 void unmarshal_VkPipelineColorBlendAttachmentState(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineColorBlendAttachmentState* forUnmarshaling);
 
 void marshal_VkPipelineColorBlendStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineColorBlendStateCreateInfo* forMarshaling);
 
 void unmarshal_VkPipelineColorBlendStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineColorBlendStateCreateInfo* forUnmarshaling);
 
 void marshal_VkPipelineDynamicStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineDynamicStateCreateInfo* forMarshaling);
 
 void unmarshal_VkPipelineDynamicStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineDynamicStateCreateInfo* forUnmarshaling);
 
 void marshal_VkGraphicsPipelineCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGraphicsPipelineCreateInfo* forMarshaling);
 
 void unmarshal_VkGraphicsPipelineCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkGraphicsPipelineCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateGraphicsPipelines 20065
@@ -714,102 +864,126 @@
 #define OP_vkDestroyPipeline 20067
 void marshal_VkPushConstantRange(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPushConstantRange* forMarshaling);
 
 void unmarshal_VkPushConstantRange(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPushConstantRange* forUnmarshaling);
 
 void marshal_VkPipelineLayoutCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineLayoutCreateInfo* forMarshaling);
 
 void unmarshal_VkPipelineLayoutCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineLayoutCreateInfo* forUnmarshaling);
 
 #define OP_vkCreatePipelineLayout 20068
 #define OP_vkDestroyPipelineLayout 20069
 void marshal_VkSamplerCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSamplerCreateInfo* forMarshaling);
 
 void unmarshal_VkSamplerCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSamplerCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateSampler 20070
 #define OP_vkDestroySampler 20071
 void marshal_VkCopyDescriptorSet(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyDescriptorSet* forMarshaling);
 
 void unmarshal_VkCopyDescriptorSet(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCopyDescriptorSet* forUnmarshaling);
 
 void marshal_VkDescriptorBufferInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorBufferInfo* forMarshaling);
 
 void unmarshal_VkDescriptorBufferInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDescriptorBufferInfo* forUnmarshaling);
 
 void marshal_VkDescriptorImageInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorImageInfo* forMarshaling);
 
 void unmarshal_VkDescriptorImageInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDescriptorImageInfo* forUnmarshaling);
 
 void marshal_VkDescriptorPoolSize(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorPoolSize* forMarshaling);
 
 void unmarshal_VkDescriptorPoolSize(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDescriptorPoolSize* forUnmarshaling);
 
 void marshal_VkDescriptorPoolCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorPoolCreateInfo* forMarshaling);
 
 void unmarshal_VkDescriptorPoolCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDescriptorPoolCreateInfo* forUnmarshaling);
 
 void marshal_VkDescriptorSetAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetAllocateInfo* forMarshaling);
 
 void unmarshal_VkDescriptorSetAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDescriptorSetAllocateInfo* forUnmarshaling);
 
 void marshal_VkDescriptorSetLayoutBinding(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutBinding* forMarshaling);
 
 void unmarshal_VkDescriptorSetLayoutBinding(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDescriptorSetLayoutBinding* forUnmarshaling);
 
 void marshal_VkDescriptorSetLayoutCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutCreateInfo* forMarshaling);
 
 void unmarshal_VkDescriptorSetLayoutCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDescriptorSetLayoutCreateInfo* forUnmarshaling);
 
 void marshal_VkWriteDescriptorSet(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWriteDescriptorSet* forMarshaling);
 
 void unmarshal_VkWriteDescriptorSet(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkWriteDescriptorSet* forUnmarshaling);
 
 #define OP_vkCreateDescriptorSetLayout 20072
@@ -822,50 +996,62 @@
 #define OP_vkUpdateDescriptorSets 20079
 void marshal_VkAttachmentDescription(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentDescription* forMarshaling);
 
 void unmarshal_VkAttachmentDescription(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAttachmentDescription* forUnmarshaling);
 
 void marshal_VkAttachmentReference(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentReference* forMarshaling);
 
 void unmarshal_VkAttachmentReference(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAttachmentReference* forUnmarshaling);
 
 void marshal_VkFramebufferCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFramebufferCreateInfo* forMarshaling);
 
 void unmarshal_VkFramebufferCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkFramebufferCreateInfo* forUnmarshaling);
 
 void marshal_VkSubpassDescription(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassDescription* forMarshaling);
 
 void unmarshal_VkSubpassDescription(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSubpassDescription* forUnmarshaling);
 
 void marshal_VkSubpassDependency(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassDependency* forMarshaling);
 
 void unmarshal_VkSubpassDependency(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSubpassDependency* forUnmarshaling);
 
 void marshal_VkRenderPassCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassCreateInfo* forMarshaling);
 
 void unmarshal_VkRenderPassCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRenderPassCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateFramebuffer 20080
@@ -875,10 +1061,12 @@
 #define OP_vkGetRenderAreaGranularity 20084
 void marshal_VkCommandPoolCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCommandPoolCreateInfo* forMarshaling);
 
 void unmarshal_VkCommandPoolCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCommandPoolCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateCommandPool 20085
@@ -886,26 +1074,32 @@
 #define OP_vkResetCommandPool 20087
 void marshal_VkCommandBufferAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCommandBufferAllocateInfo* forMarshaling);
 
 void unmarshal_VkCommandBufferAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCommandBufferAllocateInfo* forUnmarshaling);
 
 void marshal_VkCommandBufferInheritanceInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCommandBufferInheritanceInfo* forMarshaling);
 
 void unmarshal_VkCommandBufferInheritanceInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCommandBufferInheritanceInfo* forUnmarshaling);
 
 void marshal_VkCommandBufferBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCommandBufferBeginInfo* forMarshaling);
 
 void unmarshal_VkCommandBufferBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCommandBufferBeginInfo* forUnmarshaling);
 
 #define OP_vkAllocateCommandBuffers 20088
@@ -915,98 +1109,122 @@
 #define OP_vkResetCommandBuffer 20092
 void marshal_VkBufferCopy(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferCopy* forMarshaling);
 
 void unmarshal_VkBufferCopy(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBufferCopy* forUnmarshaling);
 
 void marshal_VkImageSubresourceLayers(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageSubresourceLayers* forMarshaling);
 
 void unmarshal_VkImageSubresourceLayers(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageSubresourceLayers* forUnmarshaling);
 
 void marshal_VkBufferImageCopy(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferImageCopy* forMarshaling);
 
 void unmarshal_VkBufferImageCopy(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBufferImageCopy* forUnmarshaling);
 
 void marshal_VkClearColorValue(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkClearColorValue* forMarshaling);
 
 void unmarshal_VkClearColorValue(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkClearColorValue* forUnmarshaling);
 
 void marshal_VkClearDepthStencilValue(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkClearDepthStencilValue* forMarshaling);
 
 void unmarshal_VkClearDepthStencilValue(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkClearDepthStencilValue* forUnmarshaling);
 
 void marshal_VkClearValue(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkClearValue* forMarshaling);
 
 void unmarshal_VkClearValue(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkClearValue* forUnmarshaling);
 
 void marshal_VkClearAttachment(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkClearAttachment* forMarshaling);
 
 void unmarshal_VkClearAttachment(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkClearAttachment* forUnmarshaling);
 
 void marshal_VkClearRect(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkClearRect* forMarshaling);
 
 void unmarshal_VkClearRect(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkClearRect* forUnmarshaling);
 
 void marshal_VkImageBlit(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageBlit* forMarshaling);
 
 void unmarshal_VkImageBlit(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageBlit* forUnmarshaling);
 
 void marshal_VkImageCopy(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageCopy* forMarshaling);
 
 void unmarshal_VkImageCopy(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageCopy* forUnmarshaling);
 
 void marshal_VkImageResolve(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageResolve* forMarshaling);
 
 void unmarshal_VkImageResolve(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageResolve* forUnmarshaling);
 
 void marshal_VkRenderPassBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassBeginInfo* forMarshaling);
 
 void unmarshal_VkRenderPassBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRenderPassBeginInfo* forUnmarshaling);
 
 #define OP_vkCmdBindPipeline 20093
@@ -1058,92 +1276,114 @@
 #define OP_vkEnumerateInstanceVersion 20137
 void marshal_VkPhysicalDeviceSubgroupProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSubgroupProperties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceSubgroupProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceSubgroupProperties* forUnmarshaling);
 
 void marshal_VkBindBufferMemoryInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindBufferMemoryInfo* forMarshaling);
 
 void unmarshal_VkBindBufferMemoryInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBindBufferMemoryInfo* forUnmarshaling);
 
 void marshal_VkBindImageMemoryInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindImageMemoryInfo* forMarshaling);
 
 void unmarshal_VkBindImageMemoryInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBindImageMemoryInfo* forUnmarshaling);
 
 #define OP_vkBindBufferMemory2 20138
 #define OP_vkBindImageMemory2 20139
 void marshal_VkPhysicalDevice16BitStorageFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevice16BitStorageFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDevice16BitStorageFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDevice16BitStorageFeatures* forUnmarshaling);
 
 void marshal_VkMemoryDedicatedRequirements(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryDedicatedRequirements* forMarshaling);
 
 void unmarshal_VkMemoryDedicatedRequirements(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryDedicatedRequirements* forUnmarshaling);
 
 void marshal_VkMemoryDedicatedAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryDedicatedAllocateInfo* forMarshaling);
 
 void unmarshal_VkMemoryDedicatedAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryDedicatedAllocateInfo* forUnmarshaling);
 
 void marshal_VkMemoryAllocateFlagsInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryAllocateFlagsInfo* forMarshaling);
 
 void unmarshal_VkMemoryAllocateFlagsInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryAllocateFlagsInfo* forUnmarshaling);
 
 void marshal_VkDeviceGroupRenderPassBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupRenderPassBeginInfo* forMarshaling);
 
 void unmarshal_VkDeviceGroupRenderPassBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceGroupRenderPassBeginInfo* forUnmarshaling);
 
 void marshal_VkDeviceGroupCommandBufferBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupCommandBufferBeginInfo* forMarshaling);
 
 void unmarshal_VkDeviceGroupCommandBufferBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceGroupCommandBufferBeginInfo* forUnmarshaling);
 
 void marshal_VkDeviceGroupSubmitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupSubmitInfo* forMarshaling);
 
 void unmarshal_VkDeviceGroupSubmitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceGroupSubmitInfo* forUnmarshaling);
 
 void marshal_VkDeviceGroupBindSparseInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupBindSparseInfo* forMarshaling);
 
 void unmarshal_VkDeviceGroupBindSparseInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceGroupBindSparseInfo* forUnmarshaling);
 
 #define OP_vkGetDeviceGroupPeerMemoryFeatures 20140
@@ -1151,75 +1391,93 @@
 #define OP_vkCmdDispatchBase 20142
 void marshal_VkBindBufferMemoryDeviceGroupInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindBufferMemoryDeviceGroupInfo* forMarshaling);
 
 void unmarshal_VkBindBufferMemoryDeviceGroupInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBindBufferMemoryDeviceGroupInfo* forUnmarshaling);
 
 void marshal_VkBindImageMemoryDeviceGroupInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindImageMemoryDeviceGroupInfo* forMarshaling);
 
 void unmarshal_VkBindImageMemoryDeviceGroupInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBindImageMemoryDeviceGroupInfo* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceGroupProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceGroupProperties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceGroupProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceGroupProperties* forUnmarshaling);
 
 void marshal_VkDeviceGroupDeviceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupDeviceCreateInfo* forMarshaling);
 
 void unmarshal_VkDeviceGroupDeviceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceGroupDeviceCreateInfo* forUnmarshaling);
 
 #define OP_vkEnumeratePhysicalDeviceGroups 20143
 void marshal_VkBufferMemoryRequirementsInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferMemoryRequirementsInfo2* forMarshaling);
 
 void unmarshal_VkBufferMemoryRequirementsInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBufferMemoryRequirementsInfo2* forUnmarshaling);
 
 void marshal_VkImageMemoryRequirementsInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageMemoryRequirementsInfo2* forMarshaling);
 
 void unmarshal_VkImageMemoryRequirementsInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageMemoryRequirementsInfo2* forUnmarshaling);
 
 void marshal_VkImageSparseMemoryRequirementsInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageSparseMemoryRequirementsInfo2* forMarshaling);
 
 void unmarshal_VkImageSparseMemoryRequirementsInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageSparseMemoryRequirementsInfo2* forUnmarshaling);
 
 void marshal_VkMemoryRequirements2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryRequirements2* forMarshaling);
 
 void unmarshal_VkMemoryRequirements2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryRequirements2* forUnmarshaling);
 
 void marshal_VkSparseImageMemoryRequirements2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseImageMemoryRequirements2* forMarshaling);
 
 void unmarshal_VkSparseImageMemoryRequirements2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSparseImageMemoryRequirements2* forUnmarshaling);
 
 #define OP_vkGetImageMemoryRequirements2 20144
@@ -1227,74 +1485,92 @@
 #define OP_vkGetImageSparseMemoryRequirements2 20146
 void marshal_VkPhysicalDeviceFeatures2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFeatures2* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceFeatures2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceFeatures2* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceProperties2* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceProperties2* forUnmarshaling);
 
 void marshal_VkFormatProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFormatProperties2* forMarshaling);
 
 void unmarshal_VkFormatProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkFormatProperties2* forUnmarshaling);
 
 void marshal_VkImageFormatProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageFormatProperties2* forMarshaling);
 
 void unmarshal_VkImageFormatProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageFormatProperties2* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceImageFormatInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageFormatInfo2* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceImageFormatInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceImageFormatInfo2* forUnmarshaling);
 
 void marshal_VkQueueFamilyProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkQueueFamilyProperties2* forMarshaling);
 
 void unmarshal_VkQueueFamilyProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkQueueFamilyProperties2* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceMemoryProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryProperties2* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceMemoryProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceMemoryProperties2* forUnmarshaling);
 
 void marshal_VkSparseImageFormatProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseImageFormatProperties2* forMarshaling);
 
 void unmarshal_VkSparseImageFormatProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSparseImageFormatProperties2* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceSparseImageFormatInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSparseImageFormatInfo2* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceSparseImageFormatInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceSparseImageFormatInfo2* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceFeatures2 20147
@@ -1307,74 +1583,92 @@
 #define OP_vkTrimCommandPool 20154
 void marshal_VkPhysicalDevicePointClippingProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePointClippingProperties* forMarshaling);
 
 void unmarshal_VkPhysicalDevicePointClippingProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDevicePointClippingProperties* forUnmarshaling);
 
 void marshal_VkInputAttachmentAspectReference(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkInputAttachmentAspectReference* forMarshaling);
 
 void unmarshal_VkInputAttachmentAspectReference(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkInputAttachmentAspectReference* forUnmarshaling);
 
 void marshal_VkRenderPassInputAttachmentAspectCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassInputAttachmentAspectCreateInfo* forMarshaling);
 
 void unmarshal_VkRenderPassInputAttachmentAspectCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRenderPassInputAttachmentAspectCreateInfo* forUnmarshaling);
 
 void marshal_VkImageViewUsageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageViewUsageCreateInfo* forMarshaling);
 
 void unmarshal_VkImageViewUsageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageViewUsageCreateInfo* forUnmarshaling);
 
 void marshal_VkPipelineTessellationDomainOriginStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineTessellationDomainOriginStateCreateInfo* forMarshaling);
 
 void unmarshal_VkPipelineTessellationDomainOriginStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineTessellationDomainOriginStateCreateInfo* forUnmarshaling);
 
 void marshal_VkRenderPassMultiviewCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassMultiviewCreateInfo* forMarshaling);
 
 void unmarshal_VkRenderPassMultiviewCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRenderPassMultiviewCreateInfo* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceMultiviewFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMultiviewFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceMultiviewFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceMultiviewFeatures* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceMultiviewProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMultiviewProperties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceMultiviewProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceMultiviewProperties* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceVariablePointersFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVariablePointersFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceVariablePointersFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceVariablePointersFeatures* forUnmarshaling);
 
 DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceVariablePointersFeatures, marshal_VkPhysicalDeviceVariablePointerFeatures);
@@ -1383,101 +1677,125 @@
 
 void marshal_VkPhysicalDeviceProtectedMemoryFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceProtectedMemoryFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceProtectedMemoryFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceProtectedMemoryFeatures* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceProtectedMemoryProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceProtectedMemoryProperties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceProtectedMemoryProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceProtectedMemoryProperties* forUnmarshaling);
 
 void marshal_VkDeviceQueueInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceQueueInfo2* forMarshaling);
 
 void unmarshal_VkDeviceQueueInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceQueueInfo2* forUnmarshaling);
 
 void marshal_VkProtectedSubmitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkProtectedSubmitInfo* forMarshaling);
 
 void unmarshal_VkProtectedSubmitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkProtectedSubmitInfo* forUnmarshaling);
 
 #define OP_vkGetDeviceQueue2 20155
 void marshal_VkSamplerYcbcrConversionCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSamplerYcbcrConversionCreateInfo* forMarshaling);
 
 void unmarshal_VkSamplerYcbcrConversionCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSamplerYcbcrConversionCreateInfo* forUnmarshaling);
 
 void marshal_VkSamplerYcbcrConversionInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSamplerYcbcrConversionInfo* forMarshaling);
 
 void unmarshal_VkSamplerYcbcrConversionInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSamplerYcbcrConversionInfo* forUnmarshaling);
 
 void marshal_VkBindImagePlaneMemoryInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindImagePlaneMemoryInfo* forMarshaling);
 
 void unmarshal_VkBindImagePlaneMemoryInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBindImagePlaneMemoryInfo* forUnmarshaling);
 
 void marshal_VkImagePlaneMemoryRequirementsInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImagePlaneMemoryRequirementsInfo* forMarshaling);
 
 void unmarshal_VkImagePlaneMemoryRequirementsInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImagePlaneMemoryRequirementsInfo* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSamplerYcbcrConversionFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceSamplerYcbcrConversionFeatures* forUnmarshaling);
 
 void marshal_VkSamplerYcbcrConversionImageFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSamplerYcbcrConversionImageFormatProperties* forMarshaling);
 
 void unmarshal_VkSamplerYcbcrConversionImageFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSamplerYcbcrConversionImageFormatProperties* forUnmarshaling);
 
 #define OP_vkCreateSamplerYcbcrConversion 20156
 #define OP_vkDestroySamplerYcbcrConversion 20157
 void marshal_VkDescriptorUpdateTemplateEntry(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorUpdateTemplateEntry* forMarshaling);
 
 void unmarshal_VkDescriptorUpdateTemplateEntry(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDescriptorUpdateTemplateEntry* forUnmarshaling);
 
 void marshal_VkDescriptorUpdateTemplateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorUpdateTemplateCreateInfo* forMarshaling);
 
 void unmarshal_VkDescriptorUpdateTemplateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDescriptorUpdateTemplateCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateDescriptorUpdateTemplate 20158
@@ -1485,150 +1803,186 @@
 #define OP_vkUpdateDescriptorSetWithTemplate 20160
 void marshal_VkExternalMemoryProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalMemoryProperties* forMarshaling);
 
 void unmarshal_VkExternalMemoryProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExternalMemoryProperties* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceExternalImageFormatInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalImageFormatInfo* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceExternalImageFormatInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceExternalImageFormatInfo* forUnmarshaling);
 
 void marshal_VkExternalImageFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalImageFormatProperties* forMarshaling);
 
 void unmarshal_VkExternalImageFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExternalImageFormatProperties* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceExternalBufferInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalBufferInfo* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceExternalBufferInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceExternalBufferInfo* forUnmarshaling);
 
 void marshal_VkExternalBufferProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalBufferProperties* forMarshaling);
 
 void unmarshal_VkExternalBufferProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExternalBufferProperties* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceIDProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceIDProperties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceIDProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceIDProperties* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceExternalBufferProperties 20161
 void marshal_VkExternalMemoryImageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalMemoryImageCreateInfo* forMarshaling);
 
 void unmarshal_VkExternalMemoryImageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExternalMemoryImageCreateInfo* forUnmarshaling);
 
 void marshal_VkExternalMemoryBufferCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalMemoryBufferCreateInfo* forMarshaling);
 
 void unmarshal_VkExternalMemoryBufferCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExternalMemoryBufferCreateInfo* forUnmarshaling);
 
 void marshal_VkExportMemoryAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportMemoryAllocateInfo* forMarshaling);
 
 void unmarshal_VkExportMemoryAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExportMemoryAllocateInfo* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceExternalFenceInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalFenceInfo* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceExternalFenceInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceExternalFenceInfo* forUnmarshaling);
 
 void marshal_VkExternalFenceProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalFenceProperties* forMarshaling);
 
 void unmarshal_VkExternalFenceProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExternalFenceProperties* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceExternalFenceProperties 20162
 void marshal_VkExportFenceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportFenceCreateInfo* forMarshaling);
 
 void unmarshal_VkExportFenceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExportFenceCreateInfo* forUnmarshaling);
 
 void marshal_VkExportSemaphoreCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportSemaphoreCreateInfo* forMarshaling);
 
 void unmarshal_VkExportSemaphoreCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExportSemaphoreCreateInfo* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceExternalSemaphoreInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalSemaphoreInfo* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceExternalSemaphoreInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceExternalSemaphoreInfo* forUnmarshaling);
 
 void marshal_VkExternalSemaphoreProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalSemaphoreProperties* forMarshaling);
 
 void unmarshal_VkExternalSemaphoreProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExternalSemaphoreProperties* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceExternalSemaphoreProperties 20163
 void marshal_VkPhysicalDeviceMaintenance3Properties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMaintenance3Properties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceMaintenance3Properties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceMaintenance3Properties* forUnmarshaling);
 
 void marshal_VkDescriptorSetLayoutSupport(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutSupport* forMarshaling);
 
 void unmarshal_VkDescriptorSetLayoutSupport(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDescriptorSetLayoutSupport* forUnmarshaling);
 
 #define OP_vkGetDescriptorSetLayoutSupport 20164
 void marshal_VkPhysicalDeviceShaderDrawParametersFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderDrawParametersFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderDrawParametersFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderDrawParametersFeatures* forUnmarshaling);
 
 DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceShaderDrawParametersFeatures, marshal_VkPhysicalDeviceShaderDrawParameterFeatures);
@@ -1639,108 +1993,134 @@
 #ifdef VK_VERSION_1_2
 void marshal_VkPhysicalDeviceVulkan11Features(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan11Features* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceVulkan11Features(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceVulkan11Features* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceVulkan11Properties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan11Properties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceVulkan11Properties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceVulkan11Properties* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceVulkan12Features(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan12Features* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceVulkan12Features(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceVulkan12Features* forUnmarshaling);
 
 void marshal_VkConformanceVersion(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkConformanceVersion* forMarshaling);
 
 void unmarshal_VkConformanceVersion(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkConformanceVersion* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceVulkan12Properties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan12Properties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceVulkan12Properties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceVulkan12Properties* forUnmarshaling);
 
 void marshal_VkImageFormatListCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageFormatListCreateInfo* forMarshaling);
 
 void unmarshal_VkImageFormatListCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageFormatListCreateInfo* forUnmarshaling);
 
 #define OP_vkCmdDrawIndirectCount 282774587
 #define OP_vkCmdDrawIndexedIndirectCount 245204359
 void marshal_VkAttachmentDescription2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentDescription2* forMarshaling);
 
 void unmarshal_VkAttachmentDescription2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAttachmentDescription2* forUnmarshaling);
 
 void marshal_VkAttachmentReference2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentReference2* forMarshaling);
 
 void unmarshal_VkAttachmentReference2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAttachmentReference2* forUnmarshaling);
 
 void marshal_VkSubpassDescription2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassDescription2* forMarshaling);
 
 void unmarshal_VkSubpassDescription2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSubpassDescription2* forUnmarshaling);
 
 void marshal_VkSubpassDependency2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassDependency2* forMarshaling);
 
 void unmarshal_VkSubpassDependency2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSubpassDependency2* forUnmarshaling);
 
 void marshal_VkRenderPassCreateInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassCreateInfo2* forMarshaling);
 
 void unmarshal_VkRenderPassCreateInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRenderPassCreateInfo2* forUnmarshaling);
 
 void marshal_VkSubpassBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassBeginInfo* forMarshaling);
 
 void unmarshal_VkSubpassBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSubpassBeginInfo* forUnmarshaling);
 
 void marshal_VkSubpassEndInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassEndInfo* forMarshaling);
 
 void unmarshal_VkSubpassEndInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSubpassEndInfo* forUnmarshaling);
 
 #define OP_vkCreateRenderPass2 279590827
@@ -1749,267 +2129,333 @@
 #define OP_vkCmdEndRenderPass2 221297834
 void marshal_VkPhysicalDevice8BitStorageFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevice8BitStorageFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDevice8BitStorageFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDevice8BitStorageFeatures* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceDriverProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDriverProperties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceDriverProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceDriverProperties* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceShaderAtomicInt64Features(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderAtomicInt64Features* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderAtomicInt64Features(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderAtomicInt64Features* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceShaderFloat16Int8Features(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderFloat16Int8Features* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderFloat16Int8Features(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderFloat16Int8Features* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceFloatControlsProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFloatControlsProperties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceFloatControlsProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceFloatControlsProperties* forUnmarshaling);
 
 void marshal_VkDescriptorSetLayoutBindingFlagsCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutBindingFlagsCreateInfo* forMarshaling);
 
 void unmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDescriptorSetLayoutBindingFlagsCreateInfo* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceDescriptorIndexingFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDescriptorIndexingFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceDescriptorIndexingFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceDescriptorIndexingFeatures* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceDescriptorIndexingProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDescriptorIndexingProperties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceDescriptorIndexingProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceDescriptorIndexingProperties* forUnmarshaling);
 
 void marshal_VkDescriptorSetVariableDescriptorCountAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetVariableDescriptorCountAllocateInfo* forMarshaling);
 
 void unmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDescriptorSetVariableDescriptorCountAllocateInfo* forUnmarshaling);
 
 void marshal_VkDescriptorSetVariableDescriptorCountLayoutSupport(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetVariableDescriptorCountLayoutSupport* forMarshaling);
 
 void unmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupport(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDescriptorSetVariableDescriptorCountLayoutSupport* forUnmarshaling);
 
 void marshal_VkSubpassDescriptionDepthStencilResolve(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassDescriptionDepthStencilResolve* forMarshaling);
 
 void unmarshal_VkSubpassDescriptionDepthStencilResolve(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSubpassDescriptionDepthStencilResolve* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceDepthStencilResolveProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDepthStencilResolveProperties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceDepthStencilResolveProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceDepthStencilResolveProperties* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceScalarBlockLayoutFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceScalarBlockLayoutFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceScalarBlockLayoutFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceScalarBlockLayoutFeatures* forUnmarshaling);
 
 void marshal_VkImageStencilUsageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageStencilUsageCreateInfo* forMarshaling);
 
 void unmarshal_VkImageStencilUsageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageStencilUsageCreateInfo* forUnmarshaling);
 
 void marshal_VkSamplerReductionModeCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSamplerReductionModeCreateInfo* forMarshaling);
 
 void unmarshal_VkSamplerReductionModeCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSamplerReductionModeCreateInfo* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceSamplerFilterMinmaxProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSamplerFilterMinmaxProperties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceSamplerFilterMinmaxProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceSamplerFilterMinmaxProperties* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceVulkanMemoryModelFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkanMemoryModelFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceVulkanMemoryModelFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceVulkanMemoryModelFeatures* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceImagelessFramebufferFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceImagelessFramebufferFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceImagelessFramebufferFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceImagelessFramebufferFeatures* forUnmarshaling);
 
 void marshal_VkFramebufferAttachmentImageInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFramebufferAttachmentImageInfo* forMarshaling);
 
 void unmarshal_VkFramebufferAttachmentImageInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkFramebufferAttachmentImageInfo* forUnmarshaling);
 
 void marshal_VkFramebufferAttachmentsCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFramebufferAttachmentsCreateInfo* forMarshaling);
 
 void unmarshal_VkFramebufferAttachmentsCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkFramebufferAttachmentsCreateInfo* forUnmarshaling);
 
 void marshal_VkRenderPassAttachmentBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassAttachmentBeginInfo* forMarshaling);
 
 void unmarshal_VkRenderPassAttachmentBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRenderPassAttachmentBeginInfo* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceUniformBufferStandardLayoutFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceUniformBufferStandardLayoutFeatures* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* forUnmarshaling);
 
 void marshal_VkAttachmentReferenceStencilLayout(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentReferenceStencilLayout* forMarshaling);
 
 void unmarshal_VkAttachmentReferenceStencilLayout(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAttachmentReferenceStencilLayout* forUnmarshaling);
 
 void marshal_VkAttachmentDescriptionStencilLayout(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentDescriptionStencilLayout* forMarshaling);
 
 void unmarshal_VkAttachmentDescriptionStencilLayout(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAttachmentDescriptionStencilLayout* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceHostQueryResetFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceHostQueryResetFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceHostQueryResetFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceHostQueryResetFeatures* forUnmarshaling);
 
 #define OP_vkResetQueryPool 252097672
 void marshal_VkPhysicalDeviceTimelineSemaphoreFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTimelineSemaphoreFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceTimelineSemaphoreFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceTimelineSemaphoreFeatures* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceTimelineSemaphoreProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTimelineSemaphoreProperties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceTimelineSemaphoreProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceTimelineSemaphoreProperties* forUnmarshaling);
 
 void marshal_VkSemaphoreTypeCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSemaphoreTypeCreateInfo* forMarshaling);
 
 void unmarshal_VkSemaphoreTypeCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSemaphoreTypeCreateInfo* forUnmarshaling);
 
 void marshal_VkTimelineSemaphoreSubmitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkTimelineSemaphoreSubmitInfo* forMarshaling);
 
 void unmarshal_VkTimelineSemaphoreSubmitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkTimelineSemaphoreSubmitInfo* forUnmarshaling);
 
 void marshal_VkSemaphoreWaitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSemaphoreWaitInfo* forMarshaling);
 
 void unmarshal_VkSemaphoreWaitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSemaphoreWaitInfo* forUnmarshaling);
 
 void marshal_VkSemaphoreSignalInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSemaphoreSignalInfo* forMarshaling);
 
 void unmarshal_VkSemaphoreSignalInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSemaphoreSignalInfo* forUnmarshaling);
 
 #define OP_vkGetSemaphoreCounterValue 267066974
@@ -2017,42 +2463,52 @@
 #define OP_vkSignalSemaphore 271024127
 void marshal_VkPhysicalDeviceBufferDeviceAddressFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceBufferDeviceAddressFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceBufferDeviceAddressFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceBufferDeviceAddressFeatures* forUnmarshaling);
 
 void marshal_VkBufferDeviceAddressInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferDeviceAddressInfo* forMarshaling);
 
 void unmarshal_VkBufferDeviceAddressInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBufferDeviceAddressInfo* forUnmarshaling);
 
 void marshal_VkBufferOpaqueCaptureAddressCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferOpaqueCaptureAddressCreateInfo* forMarshaling);
 
 void unmarshal_VkBufferOpaqueCaptureAddressCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBufferOpaqueCaptureAddressCreateInfo* forUnmarshaling);
 
 void marshal_VkMemoryOpaqueCaptureAddressAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryOpaqueCaptureAddressAllocateInfo* forMarshaling);
 
 void unmarshal_VkMemoryOpaqueCaptureAddressAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryOpaqueCaptureAddressAllocateInfo* forUnmarshaling);
 
 void marshal_VkDeviceMemoryOpaqueCaptureAddressInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceMemoryOpaqueCaptureAddressInfo* forMarshaling);
 
 void unmarshal_VkDeviceMemoryOpaqueCaptureAddressInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceMemoryOpaqueCaptureAddressInfo* forUnmarshaling);
 
 #define OP_vkGetBufferDeviceAddress 222632266
@@ -2062,18 +2518,22 @@
 #ifdef VK_KHR_surface
 void marshal_VkSurfaceCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceCapabilitiesKHR* forMarshaling);
 
 void unmarshal_VkSurfaceCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSurfaceCapabilitiesKHR* forUnmarshaling);
 
 void marshal_VkSurfaceFormatKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceFormatKHR* forMarshaling);
 
 void unmarshal_VkSurfaceFormatKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSurfaceFormatKHR* forUnmarshaling);
 
 #define OP_vkDestroySurfaceKHR 20165
@@ -2085,18 +2545,22 @@
 #ifdef VK_KHR_swapchain
 void marshal_VkSwapchainCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSwapchainCreateInfoKHR* forMarshaling);
 
 void unmarshal_VkSwapchainCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSwapchainCreateInfoKHR* forUnmarshaling);
 
 void marshal_VkPresentInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPresentInfoKHR* forMarshaling);
 
 void unmarshal_VkPresentInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPresentInfoKHR* forUnmarshaling);
 
 #define OP_vkCreateSwapchainKHR 20170
@@ -2106,50 +2570,62 @@
 #define OP_vkQueuePresentKHR 20174
 void marshal_VkImageSwapchainCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageSwapchainCreateInfoKHR* forMarshaling);
 
 void unmarshal_VkImageSwapchainCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageSwapchainCreateInfoKHR* forUnmarshaling);
 
 void marshal_VkBindImageMemorySwapchainInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindImageMemorySwapchainInfoKHR* forMarshaling);
 
 void unmarshal_VkBindImageMemorySwapchainInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBindImageMemorySwapchainInfoKHR* forUnmarshaling);
 
 void marshal_VkAcquireNextImageInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAcquireNextImageInfoKHR* forMarshaling);
 
 void unmarshal_VkAcquireNextImageInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAcquireNextImageInfoKHR* forUnmarshaling);
 
 void marshal_VkDeviceGroupPresentCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupPresentCapabilitiesKHR* forMarshaling);
 
 void unmarshal_VkDeviceGroupPresentCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceGroupPresentCapabilitiesKHR* forUnmarshaling);
 
 void marshal_VkDeviceGroupPresentInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupPresentInfoKHR* forMarshaling);
 
 void unmarshal_VkDeviceGroupPresentInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceGroupPresentInfoKHR* forUnmarshaling);
 
 void marshal_VkDeviceGroupSwapchainCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupSwapchainCreateInfoKHR* forMarshaling);
 
 void unmarshal_VkDeviceGroupSwapchainCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceGroupSwapchainCreateInfoKHR* forUnmarshaling);
 
 #define OP_vkGetDeviceGroupPresentCapabilitiesKHR 20175
@@ -2160,58 +2636,72 @@
 #ifdef VK_KHR_display
 void marshal_VkDisplayModeParametersKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayModeParametersKHR* forMarshaling);
 
 void unmarshal_VkDisplayModeParametersKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayModeParametersKHR* forUnmarshaling);
 
 void marshal_VkDisplayModeCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayModeCreateInfoKHR* forMarshaling);
 
 void unmarshal_VkDisplayModeCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayModeCreateInfoKHR* forUnmarshaling);
 
 void marshal_VkDisplayModePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayModePropertiesKHR* forMarshaling);
 
 void unmarshal_VkDisplayModePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayModePropertiesKHR* forUnmarshaling);
 
 void marshal_VkDisplayPlaneCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPlaneCapabilitiesKHR* forMarshaling);
 
 void unmarshal_VkDisplayPlaneCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayPlaneCapabilitiesKHR* forUnmarshaling);
 
 void marshal_VkDisplayPlanePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPlanePropertiesKHR* forMarshaling);
 
 void unmarshal_VkDisplayPlanePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayPlanePropertiesKHR* forUnmarshaling);
 
 void marshal_VkDisplayPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPropertiesKHR* forMarshaling);
 
 void unmarshal_VkDisplayPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayPropertiesKHR* forUnmarshaling);
 
 void marshal_VkDisplaySurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplaySurfaceCreateInfoKHR* forMarshaling);
 
 void unmarshal_VkDisplaySurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplaySurfaceCreateInfoKHR* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceDisplayPropertiesKHR 20179
@@ -2225,10 +2715,12 @@
 #ifdef VK_KHR_display_swapchain
 void marshal_VkDisplayPresentInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPresentInfoKHR* forMarshaling);
 
 void unmarshal_VkDisplayPresentInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayPresentInfoKHR* forUnmarshaling);
 
 #define OP_vkCreateSharedSwapchainsKHR 20186
@@ -2236,10 +2728,12 @@
 #ifdef VK_KHR_xlib_surface
 void marshal_VkXlibSurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkXlibSurfaceCreateInfoKHR* forMarshaling);
 
 void unmarshal_VkXlibSurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkXlibSurfaceCreateInfoKHR* forUnmarshaling);
 
 #define OP_vkCreateXlibSurfaceKHR 20187
@@ -2248,10 +2742,12 @@
 #ifdef VK_KHR_xcb_surface
 void marshal_VkXcbSurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkXcbSurfaceCreateInfoKHR* forMarshaling);
 
 void unmarshal_VkXcbSurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkXcbSurfaceCreateInfoKHR* forUnmarshaling);
 
 #define OP_vkCreateXcbSurfaceKHR 20189
@@ -2260,10 +2756,12 @@
 #ifdef VK_KHR_wayland_surface
 void marshal_VkWaylandSurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWaylandSurfaceCreateInfoKHR* forMarshaling);
 
 void unmarshal_VkWaylandSurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkWaylandSurfaceCreateInfoKHR* forUnmarshaling);
 
 #define OP_vkCreateWaylandSurfaceKHR 20191
@@ -2272,10 +2770,12 @@
 #ifdef VK_KHR_android_surface
 void marshal_VkAndroidSurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAndroidSurfaceCreateInfoKHR* forMarshaling);
 
 void unmarshal_VkAndroidSurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAndroidSurfaceCreateInfoKHR* forUnmarshaling);
 
 #define OP_vkCreateAndroidSurfaceKHR 20195
@@ -2283,10 +2783,12 @@
 #ifdef VK_KHR_win32_surface
 void marshal_VkWin32SurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWin32SurfaceCreateInfoKHR* forMarshaling);
 
 void unmarshal_VkWin32SurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkWin32SurfaceCreateInfoKHR* forUnmarshaling);
 
 #define OP_vkCreateWin32SurfaceKHR 20196
@@ -2446,34 +2948,42 @@
 #ifdef VK_KHR_external_memory_win32
 void marshal_VkImportMemoryWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportMemoryWin32HandleInfoKHR* forMarshaling);
 
 void unmarshal_VkImportMemoryWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImportMemoryWin32HandleInfoKHR* forUnmarshaling);
 
 void marshal_VkExportMemoryWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportMemoryWin32HandleInfoKHR* forMarshaling);
 
 void unmarshal_VkExportMemoryWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExportMemoryWin32HandleInfoKHR* forUnmarshaling);
 
 void marshal_VkMemoryWin32HandlePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryWin32HandlePropertiesKHR* forMarshaling);
 
 void unmarshal_VkMemoryWin32HandlePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryWin32HandlePropertiesKHR* forUnmarshaling);
 
 void marshal_VkMemoryGetWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryGetWin32HandleInfoKHR* forMarshaling);
 
 void unmarshal_VkMemoryGetWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryGetWin32HandleInfoKHR* forUnmarshaling);
 
 #define OP_vkGetMemoryWin32HandleKHR 20211
@@ -2482,26 +2992,32 @@
 #ifdef VK_KHR_external_memory_fd
 void marshal_VkImportMemoryFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportMemoryFdInfoKHR* forMarshaling);
 
 void unmarshal_VkImportMemoryFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImportMemoryFdInfoKHR* forUnmarshaling);
 
 void marshal_VkMemoryFdPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryFdPropertiesKHR* forMarshaling);
 
 void unmarshal_VkMemoryFdPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryFdPropertiesKHR* forUnmarshaling);
 
 void marshal_VkMemoryGetFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryGetFdInfoKHR* forMarshaling);
 
 void unmarshal_VkMemoryGetFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryGetFdInfoKHR* forUnmarshaling);
 
 #define OP_vkGetMemoryFdKHR 20213
@@ -2510,10 +3026,12 @@
 #ifdef VK_KHR_win32_keyed_mutex
 void marshal_VkWin32KeyedMutexAcquireReleaseInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWin32KeyedMutexAcquireReleaseInfoKHR* forMarshaling);
 
 void unmarshal_VkWin32KeyedMutexAcquireReleaseInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkWin32KeyedMutexAcquireReleaseInfoKHR* forUnmarshaling);
 
 #endif
@@ -2537,34 +3055,42 @@
 #ifdef VK_KHR_external_semaphore_win32
 void marshal_VkImportSemaphoreWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportSemaphoreWin32HandleInfoKHR* forMarshaling);
 
 void unmarshal_VkImportSemaphoreWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImportSemaphoreWin32HandleInfoKHR* forUnmarshaling);
 
 void marshal_VkExportSemaphoreWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportSemaphoreWin32HandleInfoKHR* forMarshaling);
 
 void unmarshal_VkExportSemaphoreWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExportSemaphoreWin32HandleInfoKHR* forUnmarshaling);
 
 void marshal_VkD3D12FenceSubmitInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkD3D12FenceSubmitInfoKHR* forMarshaling);
 
 void unmarshal_VkD3D12FenceSubmitInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkD3D12FenceSubmitInfoKHR* forUnmarshaling);
 
 void marshal_VkSemaphoreGetWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSemaphoreGetWin32HandleInfoKHR* forMarshaling);
 
 void unmarshal_VkSemaphoreGetWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSemaphoreGetWin32HandleInfoKHR* forUnmarshaling);
 
 #define OP_vkImportSemaphoreWin32HandleKHR 20216
@@ -2573,18 +3099,22 @@
 #ifdef VK_KHR_external_semaphore_fd
 void marshal_VkImportSemaphoreFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportSemaphoreFdInfoKHR* forMarshaling);
 
 void unmarshal_VkImportSemaphoreFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImportSemaphoreFdInfoKHR* forUnmarshaling);
 
 void marshal_VkSemaphoreGetFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSemaphoreGetFdInfoKHR* forMarshaling);
 
 void unmarshal_VkSemaphoreGetFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSemaphoreGetFdInfoKHR* forUnmarshaling);
 
 #define OP_vkImportSemaphoreFdKHR 20218
@@ -2593,10 +3123,12 @@
 #ifdef VK_KHR_push_descriptor
 void marshal_VkPhysicalDevicePushDescriptorPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePushDescriptorPropertiesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDevicePushDescriptorPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDevicePushDescriptorPropertiesKHR* forUnmarshaling);
 
 #define OP_vkCmdPushDescriptorSetKHR 20220
@@ -2621,26 +3153,32 @@
 #ifdef VK_KHR_incremental_present
 void marshal_VkRectLayerKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRectLayerKHR* forMarshaling);
 
 void unmarshal_VkRectLayerKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRectLayerKHR* forUnmarshaling);
 
 void marshal_VkPresentRegionKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPresentRegionKHR* forMarshaling);
 
 void unmarshal_VkPresentRegionKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPresentRegionKHR* forUnmarshaling);
 
 void marshal_VkPresentRegionsKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPresentRegionsKHR* forMarshaling);
 
 void unmarshal_VkPresentRegionsKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPresentRegionsKHR* forUnmarshaling);
 
 #endif
@@ -2712,10 +3250,12 @@
 #ifdef VK_KHR_shared_presentable_image
 void marshal_VkSharedPresentSurfaceCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSharedPresentSurfaceCapabilitiesKHR* forMarshaling);
 
 void unmarshal_VkSharedPresentSurfaceCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSharedPresentSurfaceCapabilitiesKHR* forUnmarshaling);
 
 #define OP_vkGetSwapchainStatusKHR 20229
@@ -2740,26 +3280,32 @@
 #ifdef VK_KHR_external_fence_win32
 void marshal_VkImportFenceWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportFenceWin32HandleInfoKHR* forMarshaling);
 
 void unmarshal_VkImportFenceWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImportFenceWin32HandleInfoKHR* forUnmarshaling);
 
 void marshal_VkExportFenceWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportFenceWin32HandleInfoKHR* forMarshaling);
 
 void unmarshal_VkExportFenceWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExportFenceWin32HandleInfoKHR* forUnmarshaling);
 
 void marshal_VkFenceGetWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFenceGetWin32HandleInfoKHR* forMarshaling);
 
 void unmarshal_VkFenceGetWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkFenceGetWin32HandleInfoKHR* forUnmarshaling);
 
 #define OP_vkImportFenceWin32HandleKHR 20231
@@ -2768,18 +3314,22 @@
 #ifdef VK_KHR_external_fence_fd
 void marshal_VkImportFenceFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportFenceFdInfoKHR* forMarshaling);
 
 void unmarshal_VkImportFenceFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImportFenceFdInfoKHR* forUnmarshaling);
 
 void marshal_VkFenceGetFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFenceGetFdInfoKHR* forMarshaling);
 
 void unmarshal_VkFenceGetFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkFenceGetFdInfoKHR* forUnmarshaling);
 
 #define OP_vkImportFenceFdKHR 20233
@@ -2788,66 +3338,82 @@
 #ifdef VK_KHR_performance_query
 void marshal_VkPhysicalDevicePerformanceQueryFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePerformanceQueryFeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDevicePerformanceQueryFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDevicePerformanceQueryFeaturesKHR* forUnmarshaling);
 
 void marshal_VkPhysicalDevicePerformanceQueryPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePerformanceQueryPropertiesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDevicePerformanceQueryPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDevicePerformanceQueryPropertiesKHR* forUnmarshaling);
 
 void marshal_VkPerformanceCounterKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceCounterKHR* forMarshaling);
 
 void unmarshal_VkPerformanceCounterKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPerformanceCounterKHR* forUnmarshaling);
 
 void marshal_VkPerformanceCounterDescriptionKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceCounterDescriptionKHR* forMarshaling);
 
 void unmarshal_VkPerformanceCounterDescriptionKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPerformanceCounterDescriptionKHR* forUnmarshaling);
 
 void marshal_VkQueryPoolPerformanceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkQueryPoolPerformanceCreateInfoKHR* forMarshaling);
 
 void unmarshal_VkQueryPoolPerformanceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkQueryPoolPerformanceCreateInfoKHR* forUnmarshaling);
 
 void marshal_VkPerformanceCounterResultKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceCounterResultKHR* forMarshaling);
 
 void unmarshal_VkPerformanceCounterResultKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPerformanceCounterResultKHR* forUnmarshaling);
 
 void marshal_VkAcquireProfilingLockInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAcquireProfilingLockInfoKHR* forMarshaling);
 
 void unmarshal_VkAcquireProfilingLockInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAcquireProfilingLockInfoKHR* forUnmarshaling);
 
 void marshal_VkPerformanceQuerySubmitInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceQuerySubmitInfoKHR* forMarshaling);
 
 void unmarshal_VkPerformanceQuerySubmitInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPerformanceQuerySubmitInfoKHR* forUnmarshaling);
 
 #define OP_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR 299033148
@@ -2880,26 +3446,32 @@
 #ifdef VK_KHR_get_surface_capabilities2
 void marshal_VkPhysicalDeviceSurfaceInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSurfaceInfo2KHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceSurfaceInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceSurfaceInfo2KHR* forUnmarshaling);
 
 void marshal_VkSurfaceCapabilities2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceCapabilities2KHR* forMarshaling);
 
 void unmarshal_VkSurfaceCapabilities2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSurfaceCapabilities2KHR* forUnmarshaling);
 
 void marshal_VkSurfaceFormat2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceFormat2KHR* forMarshaling);
 
 void unmarshal_VkSurfaceFormat2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSurfaceFormat2KHR* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceSurfaceCapabilities2KHR 20235
@@ -2918,42 +3490,52 @@
 #ifdef VK_KHR_get_display_properties2
 void marshal_VkDisplayProperties2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayProperties2KHR* forMarshaling);
 
 void unmarshal_VkDisplayProperties2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayProperties2KHR* forUnmarshaling);
 
 void marshal_VkDisplayPlaneProperties2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPlaneProperties2KHR* forMarshaling);
 
 void unmarshal_VkDisplayPlaneProperties2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayPlaneProperties2KHR* forUnmarshaling);
 
 void marshal_VkDisplayModeProperties2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayModeProperties2KHR* forMarshaling);
 
 void unmarshal_VkDisplayModeProperties2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayModeProperties2KHR* forUnmarshaling);
 
 void marshal_VkDisplayPlaneInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPlaneInfo2KHR* forMarshaling);
 
 void unmarshal_VkDisplayPlaneInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayPlaneInfo2KHR* forUnmarshaling);
 
 void marshal_VkDisplayPlaneCapabilities2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPlaneCapabilities2KHR* forMarshaling);
 
 void unmarshal_VkDisplayPlaneCapabilities2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayPlaneCapabilities2KHR* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceDisplayProperties2KHR 20237
@@ -3049,18 +3631,22 @@
 #ifdef VK_KHR_portability_subset
 void marshal_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePortabilitySubsetFeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDevicePortabilitySubsetFeaturesKHR* forUnmarshaling);
 
 void marshal_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePortabilitySubsetPropertiesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDevicePortabilitySubsetPropertiesKHR* forUnmarshaling);
 
 #endif
@@ -3100,10 +3686,12 @@
 #ifdef VK_KHR_shader_clock
 void marshal_VkPhysicalDeviceShaderClockFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderClockFeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderClockFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderClockFeaturesKHR* forUnmarshaling);
 
 #endif
@@ -3173,52 +3761,64 @@
 #ifdef VK_KHR_shader_terminate_invocation
 void marshal_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* forUnmarshaling);
 
 #endif
 #ifdef VK_KHR_fragment_shading_rate
 void marshal_VkFragmentShadingRateAttachmentInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFragmentShadingRateAttachmentInfoKHR* forMarshaling);
 
 void unmarshal_VkFragmentShadingRateAttachmentInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkFragmentShadingRateAttachmentInfoKHR* forUnmarshaling);
 
 void marshal_VkPipelineFragmentShadingRateStateCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineFragmentShadingRateStateCreateInfoKHR* forMarshaling);
 
 void unmarshal_VkPipelineFragmentShadingRateStateCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineFragmentShadingRateStateCreateInfoKHR* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateFeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceFragmentShadingRateFeaturesKHR* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRatePropertiesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceFragmentShadingRatePropertiesKHR* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceFragmentShadingRateKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceFragmentShadingRateKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceFragmentShadingRateKHR* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceFragmentShadingRatesKHR 272978593
@@ -3229,10 +3829,12 @@
 #ifdef VK_KHR_surface_protected_capabilities
 void marshal_VkSurfaceProtectedCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceProtectedCapabilitiesKHR* forMarshaling);
 
 void unmarshal_VkSurfaceProtectedCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSurfaceProtectedCapabilitiesKHR* forUnmarshaling);
 
 #endif
@@ -3291,58 +3893,72 @@
 #ifdef VK_KHR_pipeline_executable_properties
 void marshal_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* forUnmarshaling);
 
 void marshal_VkPipelineInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineInfoKHR* forMarshaling);
 
 void unmarshal_VkPipelineInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineInfoKHR* forUnmarshaling);
 
 void marshal_VkPipelineExecutablePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineExecutablePropertiesKHR* forMarshaling);
 
 void unmarshal_VkPipelineExecutablePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineExecutablePropertiesKHR* forUnmarshaling);
 
 void marshal_VkPipelineExecutableInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineExecutableInfoKHR* forMarshaling);
 
 void unmarshal_VkPipelineExecutableInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineExecutableInfoKHR* forUnmarshaling);
 
 void marshal_VkPipelineExecutableStatisticValueKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineExecutableStatisticValueKHR* forMarshaling);
 
 void unmarshal_VkPipelineExecutableStatisticValueKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineExecutableStatisticValueKHR* forUnmarshaling);
 
 void marshal_VkPipelineExecutableStatisticKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineExecutableStatisticKHR* forMarshaling);
 
 void unmarshal_VkPipelineExecutableStatisticKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineExecutableStatisticKHR* forUnmarshaling);
 
 void marshal_VkPipelineExecutableInternalRepresentationKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineExecutableInternalRepresentationKHR* forMarshaling);
 
 void unmarshal_VkPipelineExecutableInternalRepresentationKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineExecutableInternalRepresentationKHR* forUnmarshaling);
 
 #define OP_vkGetPipelineExecutablePropertiesKHR 269458798
@@ -3352,10 +3968,12 @@
 #ifdef VK_KHR_pipeline_library
 void marshal_VkPipelineLibraryCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineLibraryCreateInfoKHR* forMarshaling);
 
 void unmarshal_VkPipelineLibraryCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineLibraryCreateInfoKHR* forUnmarshaling);
 
 #endif
@@ -3364,90 +3982,112 @@
 #ifdef VK_KHR_copy_commands2
 void marshal_VkBufferCopy2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferCopy2KHR* forMarshaling);
 
 void unmarshal_VkBufferCopy2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBufferCopy2KHR* forUnmarshaling);
 
 void marshal_VkCopyBufferInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyBufferInfo2KHR* forMarshaling);
 
 void unmarshal_VkCopyBufferInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCopyBufferInfo2KHR* forUnmarshaling);
 
 void marshal_VkImageCopy2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageCopy2KHR* forMarshaling);
 
 void unmarshal_VkImageCopy2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageCopy2KHR* forUnmarshaling);
 
 void marshal_VkCopyImageInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyImageInfo2KHR* forMarshaling);
 
 void unmarshal_VkCopyImageInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCopyImageInfo2KHR* forUnmarshaling);
 
 void marshal_VkBufferImageCopy2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferImageCopy2KHR* forMarshaling);
 
 void unmarshal_VkBufferImageCopy2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBufferImageCopy2KHR* forUnmarshaling);
 
 void marshal_VkCopyBufferToImageInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyBufferToImageInfo2KHR* forMarshaling);
 
 void unmarshal_VkCopyBufferToImageInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCopyBufferToImageInfo2KHR* forUnmarshaling);
 
 void marshal_VkCopyImageToBufferInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyImageToBufferInfo2KHR* forMarshaling);
 
 void unmarshal_VkCopyImageToBufferInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCopyImageToBufferInfo2KHR* forUnmarshaling);
 
 void marshal_VkImageBlit2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageBlit2KHR* forMarshaling);
 
 void unmarshal_VkImageBlit2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageBlit2KHR* forUnmarshaling);
 
 void marshal_VkBlitImageInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBlitImageInfo2KHR* forMarshaling);
 
 void unmarshal_VkBlitImageInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBlitImageInfo2KHR* forUnmarshaling);
 
 void marshal_VkImageResolve2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageResolve2KHR* forMarshaling);
 
 void unmarshal_VkImageResolve2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageResolve2KHR* forUnmarshaling);
 
 void marshal_VkResolveImageInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkResolveImageInfo2KHR* forMarshaling);
 
 void unmarshal_VkResolveImageInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkResolveImageInfo2KHR* forUnmarshaling);
 
 #define OP_vkCmdCopyBuffer2KHR 247893766
@@ -3460,10 +4100,12 @@
 #ifdef VK_ANDROID_native_buffer
 void marshal_VkNativeBufferANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkNativeBufferANDROID* forMarshaling);
 
 void unmarshal_VkNativeBufferANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkNativeBufferANDROID* forUnmarshaling);
 
 #define OP_vkGetSwapchainGrallocUsageANDROID 20251
@@ -3473,10 +4115,12 @@
 #ifdef VK_EXT_debug_report
 void marshal_VkDebugReportCallbackCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugReportCallbackCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkDebugReportCallbackCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDebugReportCallbackCreateInfoEXT* forUnmarshaling);
 
 #define OP_vkCreateDebugReportCallbackEXT 20254
@@ -3492,10 +4136,12 @@
 #ifdef VK_AMD_rasterization_order
 void marshal_VkPipelineRasterizationStateRasterizationOrderAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRasterizationStateRasterizationOrderAMD* forMarshaling);
 
 void unmarshal_VkPipelineRasterizationStateRasterizationOrderAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineRasterizationStateRasterizationOrderAMD* forUnmarshaling);
 
 #endif
@@ -3506,26 +4152,32 @@
 #ifdef VK_EXT_debug_marker
 void marshal_VkDebugMarkerObjectNameInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugMarkerObjectNameInfoEXT* forMarshaling);
 
 void unmarshal_VkDebugMarkerObjectNameInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDebugMarkerObjectNameInfoEXT* forUnmarshaling);
 
 void marshal_VkDebugMarkerObjectTagInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugMarkerObjectTagInfoEXT* forMarshaling);
 
 void unmarshal_VkDebugMarkerObjectTagInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDebugMarkerObjectTagInfoEXT* forUnmarshaling);
 
 void marshal_VkDebugMarkerMarkerInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugMarkerMarkerInfoEXT* forMarshaling);
 
 void unmarshal_VkDebugMarkerMarkerInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDebugMarkerMarkerInfoEXT* forUnmarshaling);
 
 #define OP_vkDebugMarkerSetObjectTagEXT 20257
@@ -3539,52 +4191,64 @@
 #ifdef VK_NV_dedicated_allocation
 void marshal_VkDedicatedAllocationImageCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDedicatedAllocationImageCreateInfoNV* forMarshaling);
 
 void unmarshal_VkDedicatedAllocationImageCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDedicatedAllocationImageCreateInfoNV* forUnmarshaling);
 
 void marshal_VkDedicatedAllocationBufferCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDedicatedAllocationBufferCreateInfoNV* forMarshaling);
 
 void unmarshal_VkDedicatedAllocationBufferCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDedicatedAllocationBufferCreateInfoNV* forUnmarshaling);
 
 void marshal_VkDedicatedAllocationMemoryAllocateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDedicatedAllocationMemoryAllocateInfoNV* forMarshaling);
 
 void unmarshal_VkDedicatedAllocationMemoryAllocateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDedicatedAllocationMemoryAllocateInfoNV* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_transform_feedback
 void marshal_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTransformFeedbackFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceTransformFeedbackFeaturesEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTransformFeedbackPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceTransformFeedbackPropertiesEXT* forUnmarshaling);
 
 void marshal_VkPipelineRasterizationStateStreamCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRasterizationStateStreamCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkPipelineRasterizationStateStreamCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineRasterizationStateStreamCreateInfoEXT* forUnmarshaling);
 
 #define OP_vkCmdBindTransformFeedbackBuffersEXT 267779978
@@ -3597,18 +4261,22 @@
 #ifdef VK_NVX_image_view_handle
 void marshal_VkImageViewHandleInfoNVX(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageViewHandleInfoNVX* forMarshaling);
 
 void unmarshal_VkImageViewHandleInfoNVX(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageViewHandleInfoNVX* forUnmarshaling);
 
 void marshal_VkImageViewAddressPropertiesNVX(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageViewAddressPropertiesNVX* forMarshaling);
 
 void unmarshal_VkImageViewAddressPropertiesNVX(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageViewAddressPropertiesNVX* forUnmarshaling);
 
 #define OP_vkGetImageViewHandleNVX 204379647
@@ -3627,28 +4295,34 @@
 #ifdef VK_AMD_texture_gather_bias_lod
 void marshal_VkTextureLODGatherFormatPropertiesAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkTextureLODGatherFormatPropertiesAMD* forMarshaling);
 
 void unmarshal_VkTextureLODGatherFormatPropertiesAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkTextureLODGatherFormatPropertiesAMD* forUnmarshaling);
 
 #endif
 #ifdef VK_AMD_shader_info
 void marshal_VkShaderResourceUsageAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkShaderResourceUsageAMD* forMarshaling);
 
 void unmarshal_VkShaderResourceUsageAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkShaderResourceUsageAMD* forUnmarshaling);
 
 void marshal_VkShaderStatisticsInfoAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkShaderStatisticsInfoAMD* forMarshaling);
 
 void unmarshal_VkShaderStatisticsInfoAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkShaderStatisticsInfoAMD* forUnmarshaling);
 
 #define OP_vkGetShaderInfoAMD 20264
@@ -3658,10 +4332,12 @@
 #ifdef VK_GGP_stream_descriptor_surface
 void marshal_VkStreamDescriptorSurfaceCreateInfoGGP(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkStreamDescriptorSurfaceCreateInfoGGP* forMarshaling);
 
 void unmarshal_VkStreamDescriptorSurfaceCreateInfoGGP(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkStreamDescriptorSurfaceCreateInfoGGP* forUnmarshaling);
 
 #define OP_vkCreateStreamDescriptorSurfaceGGP 241902685
@@ -3669,10 +4345,12 @@
 #ifdef VK_NV_corner_sampled_image
 void marshal_VkPhysicalDeviceCornerSampledImageFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCornerSampledImageFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceCornerSampledImageFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceCornerSampledImageFeaturesNV* forUnmarshaling);
 
 #endif
@@ -3681,10 +4359,12 @@
 #ifdef VK_NV_external_memory_capabilities
 void marshal_VkExternalImageFormatPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalImageFormatPropertiesNV* forMarshaling);
 
 void unmarshal_VkExternalImageFormatPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExternalImageFormatPropertiesNV* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceExternalImageFormatPropertiesNV 20265
@@ -3692,36 +4372,44 @@
 #ifdef VK_NV_external_memory
 void marshal_VkExternalMemoryImageCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalMemoryImageCreateInfoNV* forMarshaling);
 
 void unmarshal_VkExternalMemoryImageCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExternalMemoryImageCreateInfoNV* forUnmarshaling);
 
 void marshal_VkExportMemoryAllocateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportMemoryAllocateInfoNV* forMarshaling);
 
 void unmarshal_VkExportMemoryAllocateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExportMemoryAllocateInfoNV* forUnmarshaling);
 
 #endif
 #ifdef VK_NV_external_memory_win32
 void marshal_VkImportMemoryWin32HandleInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportMemoryWin32HandleInfoNV* forMarshaling);
 
 void unmarshal_VkImportMemoryWin32HandleInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImportMemoryWin32HandleInfoNV* forUnmarshaling);
 
 void marshal_VkExportMemoryWin32HandleInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportMemoryWin32HandleInfoNV* forMarshaling);
 
 void unmarshal_VkExportMemoryWin32HandleInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExportMemoryWin32HandleInfoNV* forUnmarshaling);
 
 #define OP_vkGetMemoryWin32HandleNV 20266
@@ -3729,30 +4417,36 @@
 #ifdef VK_NV_win32_keyed_mutex
 void marshal_VkWin32KeyedMutexAcquireReleaseInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWin32KeyedMutexAcquireReleaseInfoNV* forMarshaling);
 
 void unmarshal_VkWin32KeyedMutexAcquireReleaseInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkWin32KeyedMutexAcquireReleaseInfoNV* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_validation_flags
 void marshal_VkValidationFlagsEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkValidationFlagsEXT* forMarshaling);
 
 void unmarshal_VkValidationFlagsEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkValidationFlagsEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_NN_vi_surface
 void marshal_VkViSurfaceCreateInfoNN(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkViSurfaceCreateInfoNN* forMarshaling);
 
 void unmarshal_VkViSurfaceCreateInfoNN(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkViSurfaceCreateInfoNN* forUnmarshaling);
 
 #define OP_vkCreateViSurfaceNN 20267
@@ -3764,54 +4458,66 @@
 #ifdef VK_EXT_texture_compression_astc_hdr
 void marshal_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_astc_decode_mode
 void marshal_VkImageViewASTCDecodeModeEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageViewASTCDecodeModeEXT* forMarshaling);
 
 void unmarshal_VkImageViewASTCDecodeModeEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageViewASTCDecodeModeEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceASTCDecodeFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceASTCDecodeFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceASTCDecodeFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceASTCDecodeFeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_conditional_rendering
 void marshal_VkConditionalRenderingBeginInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkConditionalRenderingBeginInfoEXT* forMarshaling);
 
 void unmarshal_VkConditionalRenderingBeginInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkConditionalRenderingBeginInfoEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceConditionalRenderingFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceConditionalRenderingFeaturesEXT* forUnmarshaling);
 
 void marshal_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCommandBufferInheritanceConditionalRenderingInfoEXT* forMarshaling);
 
 void unmarshal_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCommandBufferInheritanceConditionalRenderingInfoEXT* forUnmarshaling);
 
 #define OP_vkCmdBeginConditionalRenderingEXT 20268
@@ -3820,18 +4526,22 @@
 #ifdef VK_NV_clip_space_w_scaling
 void marshal_VkViewportWScalingNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkViewportWScalingNV* forMarshaling);
 
 void unmarshal_VkViewportWScalingNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkViewportWScalingNV* forUnmarshaling);
 
 void marshal_VkPipelineViewportWScalingStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineViewportWScalingStateCreateInfoNV* forMarshaling);
 
 void unmarshal_VkPipelineViewportWScalingStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineViewportWScalingStateCreateInfoNV* forUnmarshaling);
 
 #define OP_vkCmdSetViewportWScalingNV 20279
@@ -3846,10 +4556,12 @@
 #ifdef VK_EXT_display_surface_counter
 void marshal_VkSurfaceCapabilities2EXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceCapabilities2EXT* forMarshaling);
 
 void unmarshal_VkSurfaceCapabilities2EXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSurfaceCapabilities2EXT* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceSurfaceCapabilities2EXT 20283
@@ -3857,34 +4569,42 @@
 #ifdef VK_EXT_display_control
 void marshal_VkDisplayPowerInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPowerInfoEXT* forMarshaling);
 
 void unmarshal_VkDisplayPowerInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayPowerInfoEXT* forUnmarshaling);
 
 void marshal_VkDeviceEventInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceEventInfoEXT* forMarshaling);
 
 void unmarshal_VkDeviceEventInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceEventInfoEXT* forUnmarshaling);
 
 void marshal_VkDisplayEventInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayEventInfoEXT* forMarshaling);
 
 void unmarshal_VkDisplayEventInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayEventInfoEXT* forUnmarshaling);
 
 void marshal_VkSwapchainCounterCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSwapchainCounterCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkSwapchainCounterCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSwapchainCounterCreateInfoEXT* forUnmarshaling);
 
 #define OP_vkDisplayPowerControlEXT 20284
@@ -3895,34 +4615,42 @@
 #ifdef VK_GOOGLE_display_timing
 void marshal_VkRefreshCycleDurationGOOGLE(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRefreshCycleDurationGOOGLE* forMarshaling);
 
 void unmarshal_VkRefreshCycleDurationGOOGLE(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRefreshCycleDurationGOOGLE* forUnmarshaling);
 
 void marshal_VkPastPresentationTimingGOOGLE(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPastPresentationTimingGOOGLE* forMarshaling);
 
 void unmarshal_VkPastPresentationTimingGOOGLE(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPastPresentationTimingGOOGLE* forUnmarshaling);
 
 void marshal_VkPresentTimeGOOGLE(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPresentTimeGOOGLE* forMarshaling);
 
 void unmarshal_VkPresentTimeGOOGLE(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPresentTimeGOOGLE* forUnmarshaling);
 
 void marshal_VkPresentTimesInfoGOOGLE(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPresentTimesInfoGOOGLE* forMarshaling);
 
 void unmarshal_VkPresentTimesInfoGOOGLE(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPresentTimesInfoGOOGLE* forUnmarshaling);
 
 #define OP_vkGetRefreshCycleDurationGOOGLE 20288
@@ -3937,46 +4665,56 @@
 #ifdef VK_NVX_multiview_per_view_attributes
 void marshal_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* forUnmarshaling);
 
 #endif
 #ifdef VK_NV_viewport_swizzle
 void marshal_VkViewportSwizzleNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkViewportSwizzleNV* forMarshaling);
 
 void unmarshal_VkViewportSwizzleNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkViewportSwizzleNV* forUnmarshaling);
 
 void marshal_VkPipelineViewportSwizzleStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineViewportSwizzleStateCreateInfoNV* forMarshaling);
 
 void unmarshal_VkPipelineViewportSwizzleStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineViewportSwizzleStateCreateInfoNV* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_discard_rectangles
 void marshal_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDiscardRectanglePropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceDiscardRectanglePropertiesEXT* forUnmarshaling);
 
 void marshal_VkPipelineDiscardRectangleStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineDiscardRectangleStateCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkPipelineDiscardRectangleStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineDiscardRectangleStateCreateInfoEXT* forUnmarshaling);
 
 #define OP_vkCmdSetDiscardRectangleEXT 20290
@@ -3984,36 +4722,44 @@
 #ifdef VK_EXT_conservative_rasterization
 void marshal_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceConservativeRasterizationPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceConservativeRasterizationPropertiesEXT* forUnmarshaling);
 
 void marshal_VkPipelineRasterizationConservativeStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRasterizationConservativeStateCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkPipelineRasterizationConservativeStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineRasterizationConservativeStateCreateInfoEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_depth_clip_enable
 void marshal_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDepthClipEnableFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceDepthClipEnableFeaturesEXT* forUnmarshaling);
 
 void marshal_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRasterizationDepthClipStateCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineRasterizationDepthClipStateCreateInfoEXT* forUnmarshaling);
 
 #endif
@@ -4022,18 +4768,22 @@
 #ifdef VK_EXT_hdr_metadata
 void marshal_VkXYColorEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkXYColorEXT* forMarshaling);
 
 void unmarshal_VkXYColorEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkXYColorEXT* forUnmarshaling);
 
 void marshal_VkHdrMetadataEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkHdrMetadataEXT* forMarshaling);
 
 void unmarshal_VkHdrMetadataEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkHdrMetadataEXT* forUnmarshaling);
 
 #define OP_vkSetHdrMetadataEXT 20291
@@ -4041,10 +4791,12 @@
 #ifdef VK_MVK_ios_surface
 void marshal_VkIOSSurfaceCreateInfoMVK(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkIOSSurfaceCreateInfoMVK* forMarshaling);
 
 void unmarshal_VkIOSSurfaceCreateInfoMVK(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkIOSSurfaceCreateInfoMVK* forUnmarshaling);
 
 #define OP_vkCreateIOSSurfaceMVK 20292
@@ -4052,10 +4804,12 @@
 #ifdef VK_MVK_macos_surface
 void marshal_VkMacOSSurfaceCreateInfoMVK(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMacOSSurfaceCreateInfoMVK* forMarshaling);
 
 void unmarshal_VkMacOSSurfaceCreateInfoMVK(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMacOSSurfaceCreateInfoMVK* forUnmarshaling);
 
 #define OP_vkCreateMacOSSurfaceMVK 20293
@@ -4075,42 +4829,52 @@
 #ifdef VK_EXT_debug_utils
 void marshal_VkDebugUtilsLabelEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugUtilsLabelEXT* forMarshaling);
 
 void unmarshal_VkDebugUtilsLabelEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDebugUtilsLabelEXT* forUnmarshaling);
 
 void marshal_VkDebugUtilsObjectNameInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugUtilsObjectNameInfoEXT* forMarshaling);
 
 void unmarshal_VkDebugUtilsObjectNameInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDebugUtilsObjectNameInfoEXT* forUnmarshaling);
 
 void marshal_VkDebugUtilsMessengerCallbackDataEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugUtilsMessengerCallbackDataEXT* forMarshaling);
 
 void unmarshal_VkDebugUtilsMessengerCallbackDataEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDebugUtilsMessengerCallbackDataEXT* forUnmarshaling);
 
 void marshal_VkDebugUtilsMessengerCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugUtilsMessengerCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkDebugUtilsMessengerCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDebugUtilsMessengerCreateInfoEXT* forUnmarshaling);
 
 void marshal_VkDebugUtilsObjectTagInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugUtilsObjectTagInfoEXT* forMarshaling);
 
 void unmarshal_VkDebugUtilsObjectTagInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDebugUtilsObjectTagInfoEXT* forUnmarshaling);
 
 #define OP_vkSetDebugUtilsObjectNameEXT 20294
@@ -4128,50 +4892,62 @@
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
 void marshal_VkAndroidHardwareBufferUsageANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAndroidHardwareBufferUsageANDROID* forMarshaling);
 
 void unmarshal_VkAndroidHardwareBufferUsageANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAndroidHardwareBufferUsageANDROID* forUnmarshaling);
 
 void marshal_VkAndroidHardwareBufferPropertiesANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAndroidHardwareBufferPropertiesANDROID* forMarshaling);
 
 void unmarshal_VkAndroidHardwareBufferPropertiesANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAndroidHardwareBufferPropertiesANDROID* forUnmarshaling);
 
 void marshal_VkAndroidHardwareBufferFormatPropertiesANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAndroidHardwareBufferFormatPropertiesANDROID* forMarshaling);
 
 void unmarshal_VkAndroidHardwareBufferFormatPropertiesANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAndroidHardwareBufferFormatPropertiesANDROID* forUnmarshaling);
 
 void marshal_VkImportAndroidHardwareBufferInfoANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportAndroidHardwareBufferInfoANDROID* forMarshaling);
 
 void unmarshal_VkImportAndroidHardwareBufferInfoANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImportAndroidHardwareBufferInfoANDROID* forUnmarshaling);
 
 void marshal_VkMemoryGetAndroidHardwareBufferInfoANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryGetAndroidHardwareBufferInfoANDROID* forMarshaling);
 
 void unmarshal_VkMemoryGetAndroidHardwareBufferInfoANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryGetAndroidHardwareBufferInfoANDROID* forUnmarshaling);
 
 void marshal_VkExternalFormatANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalFormatANDROID* forMarshaling);
 
 void unmarshal_VkExternalFormatANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkExternalFormatANDROID* forUnmarshaling);
 
 #define OP_vkGetAndroidHardwareBufferPropertiesANDROID 20305
@@ -4196,34 +4972,42 @@
 #ifdef VK_EXT_inline_uniform_block
 void marshal_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceInlineUniformBlockFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceInlineUniformBlockFeaturesEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceInlineUniformBlockPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceInlineUniformBlockPropertiesEXT* forUnmarshaling);
 
 void marshal_VkWriteDescriptorSetInlineUniformBlockEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWriteDescriptorSetInlineUniformBlockEXT* forMarshaling);
 
 void unmarshal_VkWriteDescriptorSetInlineUniformBlockEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkWriteDescriptorSetInlineUniformBlockEXT* forUnmarshaling);
 
 void marshal_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorPoolInlineUniformBlockCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDescriptorPoolInlineUniformBlockCreateInfoEXT* forUnmarshaling);
 
 #endif
@@ -4232,66 +5016,82 @@
 #ifdef VK_EXT_sample_locations
 void marshal_VkSampleLocationEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSampleLocationEXT* forMarshaling);
 
 void unmarshal_VkSampleLocationEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSampleLocationEXT* forUnmarshaling);
 
 void marshal_VkSampleLocationsInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSampleLocationsInfoEXT* forMarshaling);
 
 void unmarshal_VkSampleLocationsInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSampleLocationsInfoEXT* forUnmarshaling);
 
 void marshal_VkAttachmentSampleLocationsEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentSampleLocationsEXT* forMarshaling);
 
 void unmarshal_VkAttachmentSampleLocationsEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAttachmentSampleLocationsEXT* forUnmarshaling);
 
 void marshal_VkSubpassSampleLocationsEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassSampleLocationsEXT* forMarshaling);
 
 void unmarshal_VkSubpassSampleLocationsEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSubpassSampleLocationsEXT* forUnmarshaling);
 
 void marshal_VkRenderPassSampleLocationsBeginInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassSampleLocationsBeginInfoEXT* forMarshaling);
 
 void unmarshal_VkRenderPassSampleLocationsBeginInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRenderPassSampleLocationsBeginInfoEXT* forUnmarshaling);
 
 void marshal_VkPipelineSampleLocationsStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineSampleLocationsStateCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkPipelineSampleLocationsStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineSampleLocationsStateCreateInfoEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceSampleLocationsPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSampleLocationsPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceSampleLocationsPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceSampleLocationsPropertiesEXT* forUnmarshaling);
 
 void marshal_VkMultisamplePropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMultisamplePropertiesEXT* forMarshaling);
 
 void unmarshal_VkMultisamplePropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMultisamplePropertiesEXT* forUnmarshaling);
 
 #define OP_vkCmdSetSampleLocationsEXT 20307
@@ -4300,46 +5100,56 @@
 #ifdef VK_EXT_blend_operation_advanced
 void marshal_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* forUnmarshaling);
 
 void marshal_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineColorBlendAdvancedStateCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineColorBlendAdvancedStateCreateInfoEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_NV_fragment_coverage_to_color
 void marshal_VkPipelineCoverageToColorStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCoverageToColorStateCreateInfoNV* forMarshaling);
 
 void unmarshal_VkPipelineCoverageToColorStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineCoverageToColorStateCreateInfoNV* forUnmarshaling);
 
 #endif
 #ifdef VK_NV_framebuffer_mixed_samples
 void marshal_VkPipelineCoverageModulationStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCoverageModulationStateCreateInfoNV* forMarshaling);
 
 void unmarshal_VkPipelineCoverageModulationStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineCoverageModulationStateCreateInfoNV* forUnmarshaling);
 
 #endif
@@ -4348,18 +5158,22 @@
 #ifdef VK_NV_shader_sm_builtins
 void marshal_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* forUnmarshaling);
 
 #endif
@@ -4368,50 +5182,62 @@
 #ifdef VK_EXT_image_drm_format_modifier
 void marshal_VkDrmFormatModifierPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDrmFormatModifierPropertiesEXT* forMarshaling);
 
 void unmarshal_VkDrmFormatModifierPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDrmFormatModifierPropertiesEXT* forUnmarshaling);
 
 void marshal_VkDrmFormatModifierPropertiesListEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDrmFormatModifierPropertiesListEXT* forMarshaling);
 
 void unmarshal_VkDrmFormatModifierPropertiesListEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDrmFormatModifierPropertiesListEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageDrmFormatModifierInfoEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceImageDrmFormatModifierInfoEXT* forUnmarshaling);
 
 void marshal_VkImageDrmFormatModifierListCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageDrmFormatModifierListCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkImageDrmFormatModifierListCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageDrmFormatModifierListCreateInfoEXT* forUnmarshaling);
 
 void marshal_VkImageDrmFormatModifierExplicitCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageDrmFormatModifierExplicitCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkImageDrmFormatModifierExplicitCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageDrmFormatModifierExplicitCreateInfoEXT* forUnmarshaling);
 
 void marshal_VkImageDrmFormatModifierPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageDrmFormatModifierPropertiesEXT* forMarshaling);
 
 void unmarshal_VkImageDrmFormatModifierPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImageDrmFormatModifierPropertiesEXT* forUnmarshaling);
 
 #define OP_vkGetImageDrmFormatModifierPropertiesEXT 251301237
@@ -4419,18 +5245,22 @@
 #ifdef VK_EXT_validation_cache
 void marshal_VkValidationCacheCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkValidationCacheCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkValidationCacheCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkValidationCacheCreateInfoEXT* forUnmarshaling);
 
 void marshal_VkShaderModuleValidationCacheCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkShaderModuleValidationCacheCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkShaderModuleValidationCacheCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkShaderModuleValidationCacheCreateInfoEXT* forUnmarshaling);
 
 #define OP_vkCreateValidationCacheEXT 20309
@@ -4465,58 +5295,72 @@
 #ifdef VK_NV_shading_rate_image
 void marshal_VkShadingRatePaletteNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkShadingRatePaletteNV* forMarshaling);
 
 void unmarshal_VkShadingRatePaletteNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkShadingRatePaletteNV* forUnmarshaling);
 
 void marshal_VkPipelineViewportShadingRateImageStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineViewportShadingRateImageStateCreateInfoNV* forMarshaling);
 
 void unmarshal_VkPipelineViewportShadingRateImageStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineViewportShadingRateImageStateCreateInfoNV* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceShadingRateImageFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShadingRateImageFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShadingRateImageFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShadingRateImageFeaturesNV* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceShadingRateImagePropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShadingRateImagePropertiesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShadingRateImagePropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShadingRateImagePropertiesNV* forUnmarshaling);
 
 void marshal_VkCoarseSampleLocationNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCoarseSampleLocationNV* forMarshaling);
 
 void unmarshal_VkCoarseSampleLocationNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCoarseSampleLocationNV* forUnmarshaling);
 
 void marshal_VkCoarseSampleOrderCustomNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCoarseSampleOrderCustomNV* forMarshaling);
 
 void unmarshal_VkCoarseSampleOrderCustomNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCoarseSampleOrderCustomNV* forUnmarshaling);
 
 void marshal_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* forMarshaling);
 
 void unmarshal_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* forUnmarshaling);
 
 #define OP_vkCmdBindShadingRateImageNV 238618340
@@ -4526,106 +5370,132 @@
 #ifdef VK_NV_ray_tracing
 void marshal_VkRayTracingShaderGroupCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRayTracingShaderGroupCreateInfoNV* forMarshaling);
 
 void unmarshal_VkRayTracingShaderGroupCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRayTracingShaderGroupCreateInfoNV* forUnmarshaling);
 
 void marshal_VkRayTracingPipelineCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRayTracingPipelineCreateInfoNV* forMarshaling);
 
 void unmarshal_VkRayTracingPipelineCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRayTracingPipelineCreateInfoNV* forUnmarshaling);
 
 void marshal_VkGeometryTrianglesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGeometryTrianglesNV* forMarshaling);
 
 void unmarshal_VkGeometryTrianglesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkGeometryTrianglesNV* forUnmarshaling);
 
 void marshal_VkGeometryAABBNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGeometryAABBNV* forMarshaling);
 
 void unmarshal_VkGeometryAABBNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkGeometryAABBNV* forUnmarshaling);
 
 void marshal_VkGeometryDataNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGeometryDataNV* forMarshaling);
 
 void unmarshal_VkGeometryDataNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkGeometryDataNV* forUnmarshaling);
 
 void marshal_VkGeometryNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGeometryNV* forMarshaling);
 
 void unmarshal_VkGeometryNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkGeometryNV* forUnmarshaling);
 
 void marshal_VkAccelerationStructureInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureInfoNV* forMarshaling);
 
 void unmarshal_VkAccelerationStructureInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureInfoNV* forUnmarshaling);
 
 void marshal_VkAccelerationStructureCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureCreateInfoNV* forMarshaling);
 
 void unmarshal_VkAccelerationStructureCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureCreateInfoNV* forUnmarshaling);
 
 void marshal_VkBindAccelerationStructureMemoryInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindAccelerationStructureMemoryInfoNV* forMarshaling);
 
 void unmarshal_VkBindAccelerationStructureMemoryInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBindAccelerationStructureMemoryInfoNV* forUnmarshaling);
 
 void marshal_VkWriteDescriptorSetAccelerationStructureNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWriteDescriptorSetAccelerationStructureNV* forMarshaling);
 
 void unmarshal_VkWriteDescriptorSetAccelerationStructureNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkWriteDescriptorSetAccelerationStructureNV* forUnmarshaling);
 
 void marshal_VkAccelerationStructureMemoryRequirementsInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureMemoryRequirementsInfoNV* forMarshaling);
 
 void unmarshal_VkAccelerationStructureMemoryRequirementsInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureMemoryRequirementsInfoNV* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceRayTracingPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPropertiesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceRayTracingPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceRayTracingPropertiesNV* forUnmarshaling);
 
 void marshal_VkTransformMatrixKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkTransformMatrixKHR* forMarshaling);
 
 void unmarshal_VkTransformMatrixKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkTransformMatrixKHR* forUnmarshaling);
 
 DEFINE_ALIAS_FUNCTION(marshal_VkTransformMatrixKHR, marshal_VkTransformMatrixNV);
@@ -4634,10 +5504,12 @@
 
 void marshal_VkAabbPositionsKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAabbPositionsKHR* forMarshaling);
 
 void unmarshal_VkAabbPositionsKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAabbPositionsKHR* forUnmarshaling);
 
 DEFINE_ALIAS_FUNCTION(marshal_VkAabbPositionsKHR, marshal_VkAabbPositionsNV);
@@ -4646,10 +5518,12 @@
 
 void marshal_VkAccelerationStructureInstanceKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureInstanceKHR* forMarshaling);
 
 void unmarshal_VkAccelerationStructureInstanceKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureInstanceKHR* forUnmarshaling);
 
 DEFINE_ALIAS_FUNCTION(marshal_VkAccelerationStructureInstanceKHR, marshal_VkAccelerationStructureInstanceNV);
@@ -4673,36 +5547,44 @@
 #ifdef VK_NV_representative_fragment_test
 void marshal_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* forUnmarshaling);
 
 void marshal_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRepresentativeFragmentTestStateCreateInfoNV* forMarshaling);
 
 void unmarshal_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineRepresentativeFragmentTestStateCreateInfoNV* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_filter_cubic
 void marshal_VkPhysicalDeviceImageViewImageFormatInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageViewImageFormatInfoEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceImageViewImageFormatInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceImageViewImageFormatInfoEXT* forUnmarshaling);
 
 void marshal_VkFilterCubicImageViewImageFormatPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFilterCubicImageViewImageFormatPropertiesEXT* forMarshaling);
 
 void unmarshal_VkFilterCubicImageViewImageFormatPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkFilterCubicImageViewImageFormatPropertiesEXT* forUnmarshaling);
 
 #endif
@@ -4711,36 +5593,44 @@
 #ifdef VK_EXT_global_priority
 void marshal_VkDeviceQueueGlobalPriorityCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceQueueGlobalPriorityCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkDeviceQueueGlobalPriorityCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceQueueGlobalPriorityCreateInfoEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_external_memory_host
 void marshal_VkImportMemoryHostPointerInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportMemoryHostPointerInfoEXT* forMarshaling);
 
 void unmarshal_VkImportMemoryHostPointerInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImportMemoryHostPointerInfoEXT* forUnmarshaling);
 
 void marshal_VkMemoryHostPointerPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryHostPointerPropertiesEXT* forMarshaling);
 
 void unmarshal_VkMemoryHostPointerPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryHostPointerPropertiesEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalMemoryHostPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceExternalMemoryHostPropertiesEXT* forUnmarshaling);
 
 #define OP_vkGetMemoryHostPointerPropertiesEXT 20313
@@ -4751,20 +5641,24 @@
 #ifdef VK_AMD_pipeline_compiler_control
 void marshal_VkPipelineCompilerControlCreateInfoAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCompilerControlCreateInfoAMD* forMarshaling);
 
 void unmarshal_VkPipelineCompilerControlCreateInfoAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineCompilerControlCreateInfoAMD* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_calibrated_timestamps
 void marshal_VkCalibratedTimestampInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCalibratedTimestampInfoEXT* forMarshaling);
 
 void unmarshal_VkCalibratedTimestampInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCalibratedTimestampInfoEXT* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT 295643221
@@ -4773,82 +5667,100 @@
 #ifdef VK_AMD_shader_core_properties
 void marshal_VkPhysicalDeviceShaderCorePropertiesAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderCorePropertiesAMD* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderCorePropertiesAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderCorePropertiesAMD* forUnmarshaling);
 
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
 void marshal_VkDeviceMemoryOverallocationCreateInfoAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceMemoryOverallocationCreateInfoAMD* forMarshaling);
 
 void unmarshal_VkDeviceMemoryOverallocationCreateInfoAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceMemoryOverallocationCreateInfoAMD* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_vertex_attribute_divisor
 void marshal_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* forUnmarshaling);
 
 void marshal_VkVertexInputBindingDivisorDescriptionEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkVertexInputBindingDivisorDescriptionEXT* forMarshaling);
 
 void unmarshal_VkVertexInputBindingDivisorDescriptionEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkVertexInputBindingDivisorDescriptionEXT* forUnmarshaling);
 
 void marshal_VkPipelineVertexInputDivisorStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineVertexInputDivisorStateCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkPipelineVertexInputDivisorStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineVertexInputDivisorStateCreateInfoEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_GGP_frame_token
 void marshal_VkPresentFrameTokenGGP(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPresentFrameTokenGGP* forMarshaling);
 
 void unmarshal_VkPresentFrameTokenGGP(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPresentFrameTokenGGP* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
 void marshal_VkPipelineCreationFeedbackEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCreationFeedbackEXT* forMarshaling);
 
 void unmarshal_VkPipelineCreationFeedbackEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineCreationFeedbackEXT* forUnmarshaling);
 
 void marshal_VkPipelineCreationFeedbackCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCreationFeedbackCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkPipelineCreationFeedbackCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineCreationFeedbackCreateInfoEXT* forUnmarshaling);
 
 #endif
@@ -4857,36 +5769,44 @@
 #ifdef VK_NV_compute_shader_derivatives
 void marshal_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* forUnmarshaling);
 
 #endif
 #ifdef VK_NV_mesh_shader
 void marshal_VkPhysicalDeviceMeshShaderFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMeshShaderFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceMeshShaderFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceMeshShaderFeaturesNV* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceMeshShaderPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMeshShaderPropertiesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceMeshShaderPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceMeshShaderPropertiesNV* forUnmarshaling);
 
 void marshal_VkDrawMeshTasksIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDrawMeshTasksIndirectCommandNV* forMarshaling);
 
 void unmarshal_VkDrawMeshTasksIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDrawMeshTasksIndirectCommandNV* forUnmarshaling);
 
 #define OP_vkCmdDrawMeshTasksNV 207334931
@@ -4896,38 +5816,46 @@
 #ifdef VK_NV_fragment_shader_barycentric
 void marshal_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* forUnmarshaling);
 
 #endif
 #ifdef VK_NV_shader_image_footprint
 void marshal_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderImageFootprintFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderImageFootprintFeaturesNV* forUnmarshaling);
 
 #endif
 #ifdef VK_NV_scissor_exclusive
 void marshal_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineViewportExclusiveScissorStateCreateInfoNV* forMarshaling);
 
 void unmarshal_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineViewportExclusiveScissorStateCreateInfoNV* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceExclusiveScissorFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExclusiveScissorFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceExclusiveScissorFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceExclusiveScissorFeaturesNV* forUnmarshaling);
 
 #define OP_vkCmdSetExclusiveScissorNV 225408194
@@ -4935,18 +5863,22 @@
 #ifdef VK_NV_device_diagnostic_checkpoints
 void marshal_VkQueueFamilyCheckpointPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkQueueFamilyCheckpointPropertiesNV* forMarshaling);
 
 void unmarshal_VkQueueFamilyCheckpointPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkQueueFamilyCheckpointPropertiesNV* forUnmarshaling);
 
 void marshal_VkCheckpointDataNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCheckpointDataNV* forMarshaling);
 
 void unmarshal_VkCheckpointDataNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCheckpointDataNV* forUnmarshaling);
 
 #define OP_vkCmdSetCheckpointNV 20315
@@ -4955,44 +5887,54 @@
 #ifdef VK_INTEL_shader_integer_functions2
 void marshal_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* forUnmarshaling);
 
 #endif
 #ifdef VK_INTEL_performance_query
 void marshal_VkPerformanceValueDataINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceValueDataINTEL* forMarshaling);
 
 void unmarshal_VkPerformanceValueDataINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPerformanceValueDataINTEL* forUnmarshaling);
 
 void marshal_VkPerformanceValueINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceValueINTEL* forMarshaling);
 
 void unmarshal_VkPerformanceValueINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPerformanceValueINTEL* forUnmarshaling);
 
 void marshal_VkInitializePerformanceApiInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkInitializePerformanceApiInfoINTEL* forMarshaling);
 
 void unmarshal_VkInitializePerformanceApiInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkInitializePerformanceApiInfoINTEL* forUnmarshaling);
 
 void marshal_VkQueryPoolPerformanceQueryCreateInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkQueryPoolPerformanceQueryCreateInfoINTEL* forMarshaling);
 
 void unmarshal_VkQueryPoolPerformanceQueryCreateInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkQueryPoolPerformanceQueryCreateInfoINTEL* forUnmarshaling);
 
 DEFINE_ALIAS_FUNCTION(marshal_VkQueryPoolPerformanceQueryCreateInfoINTEL, marshal_VkQueryPoolCreateInfoINTEL);
@@ -5001,34 +5943,42 @@
 
 void marshal_VkPerformanceMarkerInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceMarkerInfoINTEL* forMarshaling);
 
 void unmarshal_VkPerformanceMarkerInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPerformanceMarkerInfoINTEL* forUnmarshaling);
 
 void marshal_VkPerformanceStreamMarkerInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceStreamMarkerInfoINTEL* forMarshaling);
 
 void unmarshal_VkPerformanceStreamMarkerInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPerformanceStreamMarkerInfoINTEL* forUnmarshaling);
 
 void marshal_VkPerformanceOverrideInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceOverrideInfoINTEL* forMarshaling);
 
 void unmarshal_VkPerformanceOverrideInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPerformanceOverrideInfoINTEL* forUnmarshaling);
 
 void marshal_VkPerformanceConfigurationAcquireInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceConfigurationAcquireInfoINTEL* forMarshaling);
 
 void unmarshal_VkPerformanceConfigurationAcquireInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPerformanceConfigurationAcquireInfoINTEL* forUnmarshaling);
 
 #define OP_vkInitializePerformanceApiINTEL 203336121
@@ -5044,28 +5994,34 @@
 #ifdef VK_EXT_pci_bus_info
 void marshal_VkPhysicalDevicePCIBusInfoPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePCIBusInfoPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDevicePCIBusInfoPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDevicePCIBusInfoPropertiesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_AMD_display_native_hdr
 void marshal_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayNativeHdrSurfaceCapabilitiesAMD* forMarshaling);
 
 void unmarshal_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDisplayNativeHdrSurfaceCapabilitiesAMD* forUnmarshaling);
 
 void marshal_VkSwapchainDisplayNativeHdrCreateInfoAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSwapchainDisplayNativeHdrCreateInfoAMD* forMarshaling);
 
 void unmarshal_VkSwapchainDisplayNativeHdrCreateInfoAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSwapchainDisplayNativeHdrCreateInfoAMD* forUnmarshaling);
 
 #define OP_vkSetLocalDimmingAMD 267533472
@@ -5073,10 +6029,12 @@
 #ifdef VK_FUCHSIA_imagepipe_surface
 void marshal_VkImagePipeSurfaceCreateInfoFUCHSIA(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImagePipeSurfaceCreateInfoFUCHSIA* forMarshaling);
 
 void unmarshal_VkImagePipeSurfaceCreateInfoFUCHSIA(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkImagePipeSurfaceCreateInfoFUCHSIA* forUnmarshaling);
 
 #define OP_vkCreateImagePipeSurfaceFUCHSIA 261626137
@@ -5084,41 +6042,47 @@
 #ifdef VK_EXT_metal_surface
 void marshal_VkMetalSurfaceCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMetalSurfaceCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkMetalSurfaceCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMetalSurfaceCreateInfoEXT* forUnmarshaling);
 
 #define OP_vkCreateMetalSurfaceEXT 254915953
 #endif
-#ifdef VK_GOOGLE_color_buffer
-void marshal_VkImportColorBufferGOOGLE(
+#ifdef VK_EXT_fragment_density_map
+void marshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
     VulkanStreamGuest* vkStream,
-    const VkImportColorBufferGOOGLE* forMarshaling);
+    VkStructureType rootType,
+    const VkPhysicalDeviceFragmentDensityMapFeaturesEXT* forMarshaling);
 
-void unmarshal_VkImportColorBufferGOOGLE(
+void unmarshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
     VulkanStreamGuest* vkStream,
-    VkImportColorBufferGOOGLE* forUnmarshaling);
+    VkStructureType rootType,
+    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* forUnmarshaling);
 
-void marshal_VkImportBufferGOOGLE(
+void marshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
     VulkanStreamGuest* vkStream,
-    const VkImportBufferGOOGLE* forMarshaling);
+    VkStructureType rootType,
+    const VkPhysicalDeviceFragmentDensityMapPropertiesEXT* forMarshaling);
 
-void unmarshal_VkImportBufferGOOGLE(
+void unmarshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
     VulkanStreamGuest* vkStream,
-    VkImportBufferGOOGLE* forUnmarshaling);
+    VkStructureType rootType,
+    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* forUnmarshaling);
 
-void marshal_VkImportPhysicalAddressGOOGLE(
+void marshal_VkRenderPassFragmentDensityMapCreateInfoEXT(
     VulkanStreamGuest* vkStream,
-    const VkImportPhysicalAddressGOOGLE* forMarshaling);
+    VkStructureType rootType,
+    const VkRenderPassFragmentDensityMapCreateInfoEXT* forMarshaling);
 
-void unmarshal_VkImportPhysicalAddressGOOGLE(
+void unmarshal_VkRenderPassFragmentDensityMapCreateInfoEXT(
     VulkanStreamGuest* vkStream,
-    VkImportPhysicalAddressGOOGLE* forUnmarshaling);
+    VkStructureType rootType,
+    VkRenderPassFragmentDensityMapCreateInfoEXT* forUnmarshaling);
 
-#define OP_vkRegisterImageColorBufferGOOGLE 20318
-#define OP_vkRegisterBufferColorBufferGOOGLE 20319
 #endif
 #ifdef VK_EXT_scalar_block_layout
 DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceScalarBlockLayoutFeatures, marshal_VkPhysicalDeviceScalarBlockLayoutFeaturesEXT);
@@ -5133,104 +6097,126 @@
 #ifdef VK_EXT_subgroup_size_control
 void marshal_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* forUnmarshaling);
 
 void marshal_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_AMD_shader_core_properties2
 void marshal_VkPhysicalDeviceShaderCoreProperties2AMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderCoreProperties2AMD* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderCoreProperties2AMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderCoreProperties2AMD* forUnmarshaling);
 
 #endif
 #ifdef VK_AMD_device_coherent_memory
 void marshal_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCoherentMemoryFeaturesAMD* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceCoherentMemoryFeaturesAMD* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_shader_image_atomic_int64
 void marshal_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_memory_budget
 void marshal_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryBudgetPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceMemoryBudgetPropertiesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_memory_priority
 void marshal_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryPriorityFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceMemoryPriorityFeaturesEXT* forUnmarshaling);
 
 void marshal_VkMemoryPriorityAllocateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryPriorityAllocateInfoEXT* forMarshaling);
 
 void unmarshal_VkMemoryPriorityAllocateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkMemoryPriorityAllocateInfoEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_NV_dedicated_allocation_image_aliasing
 void marshal_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_buffer_device_address
 void marshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* forUnmarshaling);
 
 DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT, marshal_VkPhysicalDeviceBufferAddressFeaturesEXT);
@@ -5243,10 +6229,12 @@
 
 void marshal_VkBufferDeviceAddressCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferDeviceAddressCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkBufferDeviceAddressCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBufferDeviceAddressCreateInfoEXT* forUnmarshaling);
 
 #define OP_vkGetBufferDeviceAddressEXT 224361693
@@ -5254,10 +6242,12 @@
 #ifdef VK_EXT_tooling_info
 void marshal_VkPhysicalDeviceToolPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceToolPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceToolPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceToolPropertiesEXT* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceToolPropertiesEXT 282247593
@@ -5271,36 +6261,44 @@
 #ifdef VK_EXT_validation_features
 void marshal_VkValidationFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkValidationFeaturesEXT* forMarshaling);
 
 void unmarshal_VkValidationFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkValidationFeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_NV_cooperative_matrix
 void marshal_VkCooperativeMatrixPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCooperativeMatrixPropertiesNV* forMarshaling);
 
 void unmarshal_VkCooperativeMatrixPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCooperativeMatrixPropertiesNV* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCooperativeMatrixFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceCooperativeMatrixFeaturesNV* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCooperativeMatrixPropertiesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceCooperativeMatrixPropertiesNV* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV 287711429
@@ -5308,26 +6306,32 @@
 #ifdef VK_NV_coverage_reduction_mode
 void marshal_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCoverageReductionModeFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceCoverageReductionModeFeaturesNV* forUnmarshaling);
 
 void marshal_VkPipelineCoverageReductionStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCoverageReductionStateCreateInfoNV* forMarshaling);
 
 void unmarshal_VkPipelineCoverageReductionStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineCoverageReductionStateCreateInfoNV* forUnmarshaling);
 
 void marshal_VkFramebufferMixedSamplesCombinationNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFramebufferMixedSamplesCombinationNV* forMarshaling);
 
 void unmarshal_VkFramebufferMixedSamplesCombinationNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkFramebufferMixedSamplesCombinationNV* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV 292032159
@@ -5335,38 +6339,46 @@
 #ifdef VK_EXT_fragment_shader_interlock
 void marshal_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_ycbcr_image_arrays
 void marshal_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_full_screen_exclusive
 void marshal_VkSurfaceFullScreenExclusiveInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceFullScreenExclusiveInfoEXT* forMarshaling);
 
 void unmarshal_VkSurfaceFullScreenExclusiveInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSurfaceFullScreenExclusiveInfoEXT* forUnmarshaling);
 
 void marshal_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceCapabilitiesFullScreenExclusiveEXT* forMarshaling);
 
 void unmarshal_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSurfaceCapabilitiesFullScreenExclusiveEXT* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceSurfacePresentModes2EXT 268126279
@@ -5374,10 +6386,12 @@
 #define OP_vkReleaseFullScreenExclusiveModeEXT 257629142
 void marshal_VkSurfaceFullScreenExclusiveWin32InfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceFullScreenExclusiveWin32InfoEXT* forMarshaling);
 
 void unmarshal_VkSurfaceFullScreenExclusiveWin32InfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSurfaceFullScreenExclusiveWin32InfoEXT* forUnmarshaling);
 
 #define OP_vkGetDeviceGroupSurfacePresentModes2EXT 206369543
@@ -5385,10 +6399,12 @@
 #ifdef VK_EXT_headless_surface
 void marshal_VkHeadlessSurfaceCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkHeadlessSurfaceCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkHeadlessSurfaceCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkHeadlessSurfaceCreateInfoEXT* forUnmarshaling);
 
 #define OP_vkCreateHeadlessSurfaceEXT 298411290
@@ -5396,26 +6412,32 @@
 #ifdef VK_EXT_line_rasterization
 void marshal_VkPhysicalDeviceLineRasterizationFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceLineRasterizationFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceLineRasterizationFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceLineRasterizationFeaturesEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceLineRasterizationPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceLineRasterizationPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceLineRasterizationPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceLineRasterizationPropertiesEXT* forUnmarshaling);
 
 void marshal_VkPipelineRasterizationLineStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRasterizationLineStateCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkPipelineRasterizationLineStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineRasterizationLineStateCreateInfoEXT* forUnmarshaling);
 
 #define OP_vkCmdSetLineStippleEXT 263855692
@@ -5423,10 +6445,12 @@
 #ifdef VK_EXT_shader_atomic_float
 void marshal_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* forUnmarshaling);
 
 #endif
@@ -5440,20 +6464,24 @@
 #ifdef VK_EXT_index_type_uint8
 void marshal_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceIndexTypeUint8FeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceIndexTypeUint8FeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_extended_dynamic_state
 void marshal_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* forUnmarshaling);
 
 #define OP_vkCmdSetCullModeEXT 266285895
@@ -5472,116 +6500,144 @@
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 void marshal_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_NV_device_generated_commands
 void marshal_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* forUnmarshaling);
 
 void marshal_VkGraphicsShaderGroupCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGraphicsShaderGroupCreateInfoNV* forMarshaling);
 
 void unmarshal_VkGraphicsShaderGroupCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkGraphicsShaderGroupCreateInfoNV* forUnmarshaling);
 
 void marshal_VkGraphicsPipelineShaderGroupsCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGraphicsPipelineShaderGroupsCreateInfoNV* forMarshaling);
 
 void unmarshal_VkGraphicsPipelineShaderGroupsCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkGraphicsPipelineShaderGroupsCreateInfoNV* forUnmarshaling);
 
 void marshal_VkBindShaderGroupIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindShaderGroupIndirectCommandNV* forMarshaling);
 
 void unmarshal_VkBindShaderGroupIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBindShaderGroupIndirectCommandNV* forUnmarshaling);
 
 void marshal_VkBindIndexBufferIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindIndexBufferIndirectCommandNV* forMarshaling);
 
 void unmarshal_VkBindIndexBufferIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBindIndexBufferIndirectCommandNV* forUnmarshaling);
 
 void marshal_VkBindVertexBufferIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindVertexBufferIndirectCommandNV* forMarshaling);
 
 void unmarshal_VkBindVertexBufferIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkBindVertexBufferIndirectCommandNV* forUnmarshaling);
 
 void marshal_VkSetStateFlagsIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSetStateFlagsIndirectCommandNV* forMarshaling);
 
 void unmarshal_VkSetStateFlagsIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSetStateFlagsIndirectCommandNV* forUnmarshaling);
 
 void marshal_VkIndirectCommandsStreamNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkIndirectCommandsStreamNV* forMarshaling);
 
 void unmarshal_VkIndirectCommandsStreamNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkIndirectCommandsStreamNV* forUnmarshaling);
 
 void marshal_VkIndirectCommandsLayoutTokenNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkIndirectCommandsLayoutTokenNV* forMarshaling);
 
 void unmarshal_VkIndirectCommandsLayoutTokenNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkIndirectCommandsLayoutTokenNV* forUnmarshaling);
 
 void marshal_VkIndirectCommandsLayoutCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkIndirectCommandsLayoutCreateInfoNV* forMarshaling);
 
 void unmarshal_VkIndirectCommandsLayoutCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkIndirectCommandsLayoutCreateInfoNV* forUnmarshaling);
 
 void marshal_VkGeneratedCommandsInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGeneratedCommandsInfoNV* forMarshaling);
 
 void unmarshal_VkGeneratedCommandsInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkGeneratedCommandsInfoNV* forUnmarshaling);
 
 void marshal_VkGeneratedCommandsMemoryRequirementsInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGeneratedCommandsMemoryRequirementsInfoNV* forMarshaling);
 
 void unmarshal_VkGeneratedCommandsMemoryRequirementsInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkGeneratedCommandsMemoryRequirementsInfoNV* forUnmarshaling);
 
 #define OP_vkGetGeneratedCommandsMemoryRequirementsNV 249047049
@@ -5594,106 +6650,130 @@
 #ifdef VK_EXT_texel_buffer_alignment
 void marshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_QCOM_render_pass_transform
 void marshal_VkRenderPassTransformBeginInfoQCOM(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassTransformBeginInfoQCOM* forMarshaling);
 
 void unmarshal_VkRenderPassTransformBeginInfoQCOM(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRenderPassTransformBeginInfoQCOM* forUnmarshaling);
 
 void marshal_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCommandBufferInheritanceRenderPassTransformInfoQCOM* forMarshaling);
 
 void unmarshal_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCommandBufferInheritanceRenderPassTransformInfoQCOM* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_device_memory_report
 void marshal_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* forUnmarshaling);
 
 void marshal_VkDeviceMemoryReportCallbackDataEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceMemoryReportCallbackDataEXT* forMarshaling);
 
 void unmarshal_VkDeviceMemoryReportCallbackDataEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceMemoryReportCallbackDataEXT* forUnmarshaling);
 
 void marshal_VkDeviceDeviceMemoryReportCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceDeviceMemoryReportCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkDeviceDeviceMemoryReportCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceDeviceMemoryReportCreateInfoEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_robustness2
 void marshal_VkPhysicalDeviceRobustness2FeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRobustness2FeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceRobustness2FeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceRobustness2FeaturesEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceRobustness2PropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRobustness2PropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceRobustness2PropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceRobustness2PropertiesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_custom_border_color
 void marshal_VkSamplerCustomBorderColorCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSamplerCustomBorderColorCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkSamplerCustomBorderColorCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkSamplerCustomBorderColorCreateInfoEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCustomBorderColorPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceCustomBorderColorPropertiesEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCustomBorderColorFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceCustomBorderColorFeaturesEXT* forUnmarshaling);
 
 #endif
@@ -5702,26 +6782,32 @@
 #ifdef VK_EXT_private_data
 void marshal_VkPhysicalDevicePrivateDataFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePrivateDataFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDevicePrivateDataFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDevicePrivateDataFeaturesEXT* forUnmarshaling);
 
 void marshal_VkDevicePrivateDataCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDevicePrivateDataCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkDevicePrivateDataCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDevicePrivateDataCreateInfoEXT* forUnmarshaling);
 
 void marshal_VkPrivateDataSlotCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPrivateDataSlotCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkPrivateDataSlotCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPrivateDataSlotCreateInfoEXT* forUnmarshaling);
 
 #define OP_vkCreatePrivateDataSlotEXT 236374049
@@ -5732,28 +6818,34 @@
 #ifdef VK_EXT_pipeline_creation_cache_control
 void marshal_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_NV_device_diagnostics_config
 void marshal_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDiagnosticsConfigFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceDiagnosticsConfigFeaturesNV* forUnmarshaling);
 
 void marshal_VkDeviceDiagnosticsConfigCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceDiagnosticsConfigCreateInfoNV* forMarshaling);
 
 void unmarshal_VkDeviceDiagnosticsConfigCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceDiagnosticsConfigCreateInfoNV* forUnmarshaling);
 
 #endif
@@ -5762,26 +6854,32 @@
 #ifdef VK_NV_fragment_shading_rate_enums
 void marshal_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* forUnmarshaling);
 
 void marshal_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineFragmentShadingRateEnumStateCreateInfoNV* forMarshaling);
 
 void unmarshal_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPipelineFragmentShadingRateEnumStateCreateInfoNV* forUnmarshaling);
 
 #define OP_vkCmdSetFragmentShadingRateEnumNV 264649847
@@ -5789,64 +6887,108 @@
 #ifdef VK_EXT_fragment_density_map2
 void marshal_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
 void marshal_VkCopyCommandTransformInfoQCOM(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyCommandTransformInfoQCOM* forMarshaling);
 
 void unmarshal_VkCopyCommandTransformInfoQCOM(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCopyCommandTransformInfoQCOM* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_image_robustness
 void marshal_VkPhysicalDeviceImageRobustnessFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageRobustnessFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceImageRobustnessFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceImageRobustnessFeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_4444_formats
 void marshal_VkPhysicalDevice4444FormatsFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevice4444FormatsFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDevice4444FormatsFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDevice4444FormatsFeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_directfb_surface
 void marshal_VkDirectFBSurfaceCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDirectFBSurfaceCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkDirectFBSurfaceCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDirectFBSurfaceCreateInfoEXT* forUnmarshaling);
 
 #define OP_vkCreateDirectFBSurfaceEXT 220792403
 #define OP_vkGetPhysicalDeviceDirectFBPresentationSupportEXT 285441990
 #endif
 #ifdef VK_GOOGLE_gfxstream
+void marshal_VkImportColorBufferGOOGLE(
+    VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
+    const VkImportColorBufferGOOGLE* forMarshaling);
+
+void unmarshal_VkImportColorBufferGOOGLE(
+    VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
+    VkImportColorBufferGOOGLE* forUnmarshaling);
+
+void marshal_VkImportBufferGOOGLE(
+    VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
+    const VkImportBufferGOOGLE* forMarshaling);
+
+void unmarshal_VkImportBufferGOOGLE(
+    VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
+    VkImportBufferGOOGLE* forUnmarshaling);
+
+void marshal_VkImportPhysicalAddressGOOGLE(
+    VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
+    const VkImportPhysicalAddressGOOGLE* forMarshaling);
+
+void unmarshal_VkImportPhysicalAddressGOOGLE(
+    VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
+    VkImportPhysicalAddressGOOGLE* forUnmarshaling);
+
+#define OP_vkRegisterImageColorBufferGOOGLE 20318
+#define OP_vkRegisterBufferColorBufferGOOGLE 20319
 #define OP_vkMapMemoryIntoAddressSpaceGOOGLE 20317
 #define OP_vkUpdateDescriptorSetWithTemplateSizedGOOGLE 20320
 #define OP_vkBeginCommandBufferAsyncGOOGLE 20321
@@ -5869,154 +7011,192 @@
 #ifdef VK_KHR_acceleration_structure
 void marshal_VkDeviceOrHostAddressKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceOrHostAddressKHR* forMarshaling);
 
 void unmarshal_VkDeviceOrHostAddressKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceOrHostAddressKHR* forUnmarshaling);
 
 void marshal_VkDeviceOrHostAddressConstKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceOrHostAddressConstKHR* forMarshaling);
 
 void unmarshal_VkDeviceOrHostAddressConstKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkDeviceOrHostAddressConstKHR* forUnmarshaling);
 
 void marshal_VkAccelerationStructureBuildRangeInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureBuildRangeInfoKHR* forMarshaling);
 
 void unmarshal_VkAccelerationStructureBuildRangeInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureBuildRangeInfoKHR* forUnmarshaling);
 
 void marshal_VkAccelerationStructureGeometryTrianglesDataKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryTrianglesDataKHR* forMarshaling);
 
 void unmarshal_VkAccelerationStructureGeometryTrianglesDataKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureGeometryTrianglesDataKHR* forUnmarshaling);
 
 void marshal_VkAccelerationStructureGeometryAabbsDataKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryAabbsDataKHR* forMarshaling);
 
 void unmarshal_VkAccelerationStructureGeometryAabbsDataKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureGeometryAabbsDataKHR* forUnmarshaling);
 
 void marshal_VkAccelerationStructureGeometryInstancesDataKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryInstancesDataKHR* forMarshaling);
 
 void unmarshal_VkAccelerationStructureGeometryInstancesDataKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureGeometryInstancesDataKHR* forUnmarshaling);
 
 void marshal_VkAccelerationStructureGeometryDataKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryDataKHR* forMarshaling);
 
 void unmarshal_VkAccelerationStructureGeometryDataKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureGeometryDataKHR* forUnmarshaling);
 
 void marshal_VkAccelerationStructureGeometryKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryKHR* forMarshaling);
 
 void unmarshal_VkAccelerationStructureGeometryKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureGeometryKHR* forUnmarshaling);
 
 void marshal_VkAccelerationStructureBuildGeometryInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureBuildGeometryInfoKHR* forMarshaling);
 
 void unmarshal_VkAccelerationStructureBuildGeometryInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureBuildGeometryInfoKHR* forUnmarshaling);
 
 void marshal_VkAccelerationStructureCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureCreateInfoKHR* forMarshaling);
 
 void unmarshal_VkAccelerationStructureCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureCreateInfoKHR* forUnmarshaling);
 
 void marshal_VkWriteDescriptorSetAccelerationStructureKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWriteDescriptorSetAccelerationStructureKHR* forMarshaling);
 
 void unmarshal_VkWriteDescriptorSetAccelerationStructureKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkWriteDescriptorSetAccelerationStructureKHR* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceAccelerationStructureFeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceAccelerationStructureFeaturesKHR* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceAccelerationStructurePropertiesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceAccelerationStructurePropertiesKHR* forUnmarshaling);
 
 void marshal_VkAccelerationStructureDeviceAddressInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureDeviceAddressInfoKHR* forMarshaling);
 
 void unmarshal_VkAccelerationStructureDeviceAddressInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureDeviceAddressInfoKHR* forUnmarshaling);
 
 void marshal_VkAccelerationStructureVersionInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureVersionInfoKHR* forMarshaling);
 
 void unmarshal_VkAccelerationStructureVersionInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureVersionInfoKHR* forUnmarshaling);
 
 void marshal_VkCopyAccelerationStructureToMemoryInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyAccelerationStructureToMemoryInfoKHR* forMarshaling);
 
 void unmarshal_VkCopyAccelerationStructureToMemoryInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCopyAccelerationStructureToMemoryInfoKHR* forUnmarshaling);
 
 void marshal_VkCopyMemoryToAccelerationStructureInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyMemoryToAccelerationStructureInfoKHR* forMarshaling);
 
 void unmarshal_VkCopyMemoryToAccelerationStructureInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCopyMemoryToAccelerationStructureInfoKHR* forUnmarshaling);
 
 void marshal_VkCopyAccelerationStructureInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyAccelerationStructureInfoKHR* forMarshaling);
 
 void unmarshal_VkCopyAccelerationStructureInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkCopyAccelerationStructureInfoKHR* forUnmarshaling);
 
 void marshal_VkAccelerationStructureBuildSizesInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureBuildSizesInfoKHR* forMarshaling);
 
 void unmarshal_VkAccelerationStructureBuildSizesInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkAccelerationStructureBuildSizesInfoKHR* forUnmarshaling);
 
 #define OP_vkCreateAccelerationStructureKHR 259403971
@@ -6039,58 +7219,72 @@
 #ifdef VK_KHR_ray_tracing_pipeline
 void marshal_VkRayTracingShaderGroupCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRayTracingShaderGroupCreateInfoKHR* forMarshaling);
 
 void unmarshal_VkRayTracingShaderGroupCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRayTracingShaderGroupCreateInfoKHR* forUnmarshaling);
 
 void marshal_VkRayTracingPipelineInterfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRayTracingPipelineInterfaceCreateInfoKHR* forMarshaling);
 
 void unmarshal_VkRayTracingPipelineInterfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRayTracingPipelineInterfaceCreateInfoKHR* forUnmarshaling);
 
 void marshal_VkRayTracingPipelineCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRayTracingPipelineCreateInfoKHR* forMarshaling);
 
 void unmarshal_VkRayTracingPipelineCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkRayTracingPipelineCreateInfoKHR* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPipelineFeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceRayTracingPipelineFeaturesKHR* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPipelinePropertiesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceRayTracingPipelinePropertiesKHR* forUnmarshaling);
 
 void marshal_VkStridedDeviceAddressRegionKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkStridedDeviceAddressRegionKHR* forMarshaling);
 
 void unmarshal_VkStridedDeviceAddressRegionKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkStridedDeviceAddressRegionKHR* forUnmarshaling);
 
 void marshal_VkTraceRaysIndirectCommandKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkTraceRaysIndirectCommandKHR* forMarshaling);
 
 void unmarshal_VkTraceRaysIndirectCommandKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkTraceRaysIndirectCommandKHR* forUnmarshaling);
 
 #define OP_vkCmdTraceRaysKHR 213680716
@@ -6103,10 +7297,12 @@
 #ifdef VK_KHR_ray_query
 void marshal_VkPhysicalDeviceRayQueryFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayQueryFeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceRayQueryFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     VkPhysicalDeviceRayQueryFeaturesKHR* forUnmarshaling);
 
 #endif
diff --git a/system/vulkan_enc/goldfish_vk_private_defs.h b/system/vulkan_enc/goldfish_vk_private_defs.h
index 38f98f7..bf57d8a 100644
--- a/system/vulkan_enc/goldfish_vk_private_defs.h
+++ b/system/vulkan_enc/goldfish_vk_private_defs.h
@@ -87,13 +87,13 @@
 
 typedef VkResult (VKAPI_PTR *PFN_vkMapMemoryIntoAddressSpaceGOOGLE)(VkDevice device, VkDeviceMemory memory, uint64_t* pAddress);
 
-#define VK_GOOGLE_color_buffer 1
-#define VK_GOOGLE_COLOR_BUFFER_EXTENSION_NUMBER 219
+#define VK_GOOGLE_gfxstream 1
+#define VK_GOOGLE_GFXSTREAM_EXTENSION_NUMBER 386
 
-#define VK_GOOGLE_COLOR_BUFFER_ENUM(type,id)    ((type)(1000000000 + (1000 * (VK_GOOGLE_COLOR_BUFFER_EXTENSION_NUMBER - 1)) + (id)))
-#define VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE   VK_GOOGLE_COLOR_BUFFER_ENUM(VkStructureType, 0)
-#define VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE   VK_GOOGLE_COLOR_BUFFER_ENUM(VkStructureType, 1)
-#define VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE   VK_GOOGLE_COLOR_BUFFER_ENUM(VkStructureType, 2)
+#define VK_GOOGLE_GFXSTREAM_ENUM(type,id)    ((type)(1000000000 + (1000 * (VK_GOOGLE_GFXSTREAM_EXTENSION_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_BUFFER_GOOGLE   VK_GOOGLE_GFXSTREAM_ENUM(VkStructureType, 2)
 
 typedef struct {
     VkStructureType sType; // must be VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE
@@ -533,14 +533,44 @@
 
 #define VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA \
     ((VkStructureType)1001004008)
+
+#if VK_HEADER_VERSION < 174
+#define VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA \
+    ((VkStructureType)1000364000)
+#define VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA \
+    ((VkExternalMemoryHandleTypeFlagBits)0x00000800)
+#endif
+
+// Deprecated
 #define VK_STRUCTURE_TYPE_TEMP_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA \
     ((VkStructureType)1001005000)
-#define VK_STRUCTURE_TYPE_TEMP_MEMORY_ZIRCON_HANDLE_PROPERTIES_FUCHSIA \
-    ((VkStructureType)1001005001)
 #define VK_EXTERNAL_MEMORY_HANDLE_TYPE_TEMP_ZIRCON_VMO_BIT_FUCHSIA \
     ((VkExternalMemoryHandleTypeFlagBits)0x00100000)
+
+#else // VK_FUCHSIA_external_memory
+
+// For backward compatibility
+#if VK_HEADER_VERSION >= 174
+#define VK_STRUCTURE_TYPE_TEMP_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA \
+    ((VkStructureType)1001005000)
+#define VK_EXTERNAL_MEMORY_HANDLE_TYPE_TEMP_ZIRCON_VMO_BIT_FUCHSIA \
+    ((VkExternalMemoryHandleTypeFlagBits)0x00100000)
+#endif  // VK_HEADER_VERSION >= 174
+
+// For forward compatibility
+#ifndef VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA
+#define VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA ((VkStructureType)1000364000)
+#endif  // VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA
+
+// For forward compatibility
+#ifndef VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA
+#define VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA \
+    ((VkExternalMemoryHandleTypeFlagBits)0x00000800)
+#endif  // VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA
+
 #endif  // VK_FUCHSIA_external_memory
 
+
 #ifndef VK_FUCHSIA_external_semaphore
 #define VK_FUCHSIA_external_semaphore 1
 #define VK_FUCHSIA_EXTERNAL_SEMAPHORE_SPEC_VERSION 1
@@ -552,7 +582,11 @@
     VkSemaphore                              semaphore;
     VkSemaphoreImportFlags                   flags;
     VkExternalSemaphoreHandleTypeFlagBits    handleType;
+#if VK_HEADER_VERSION < 174
     uint32_t                                 handle;
+#else // VK_HEADER_VERSION >= 174
+    uint32_t                                 zirconHandle;
+#endif // VK_HEADER_VERSION < 174
 } VkImportSemaphoreZirconHandleInfoFUCHSIA;
 
 typedef struct VkSemaphoreGetZirconHandleInfoFUCHSIA {
@@ -562,10 +596,32 @@
     VkExternalSemaphoreHandleTypeFlagBits    handleType;
 } VkSemaphoreGetZirconHandleInfoFUCHSIA;
 
+#if VK_HEADER_VERSION < 174
+#define VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA \
+    ((VkExternalMemoryHandleTypeFlagBits)0x00000080)
+#endif
+
+// Deprecated
 #define VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TEMP_ZIRCON_EVENT_BIT_FUCHSIA \
     ((VkExternalSemaphoreHandleTypeFlagBits)0x00100000)
+
+#else // VK_FUCHSIA_external_semaphore
+
+// For backward compatibility
+#if VK_HEADER_VERSION >= 174
+#define VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TEMP_ZIRCON_EVENT_BIT_FUCHSIA \
+    ((VkExternalSemaphoreHandleTypeFlagBits)0x00100000)
+#endif  // VK_HEADER_VERSION >= 174
+
+// For forward compatibility
+#ifndef VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TEMP_ZIRCON_EVENT_BIT_FUCHSIA
+#define VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA \
+    ((VkExternalMemoryHandleTypeFlagBits)0x00000080)
+#endif  // VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TEMP_ZIRCON_EVENT_BIT_FUCHSIA
+
 #endif  // VK_FUCHSIA_external_semaphore
 
+
 // VulkanStream features
 #define VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT (1 << 0)
 #define VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT (1 << 1)
diff --git a/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp b/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp
index 5d933b2..e4bf00d 100644
--- a/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp
@@ -35,21 +35,25 @@
 
 void reservedmarshal_extension_struct(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const void* structExtension,
     uint8_t** ptr);
 
 void reservedunmarshal_extension_struct(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     void* structExtension_out,
     uint8_t** ptr);
 
 #ifdef VK_VERSION_1_0
 void reservedmarshal_VkExtent2D(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExtent2D* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->width, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->height, sizeof(uint32_t));
@@ -58,10 +62,12 @@
 
 void reservedmarshal_VkExtent3D(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExtent3D* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->width, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->height, sizeof(uint32_t));
@@ -72,10 +78,12 @@
 
 void reservedmarshal_VkOffset2D(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkOffset2D* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (int32_t*)&forMarshaling->x, sizeof(int32_t));
     *ptr += sizeof(int32_t);
     memcpy(*ptr, (int32_t*)&forMarshaling->y, sizeof(int32_t));
@@ -84,10 +92,12 @@
 
 void reservedmarshal_VkOffset3D(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkOffset3D* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (int32_t*)&forMarshaling->x, sizeof(int32_t));
     *ptr += sizeof(int32_t);
     memcpy(*ptr, (int32_t*)&forMarshaling->y, sizeof(int32_t));
@@ -98,45 +108,65 @@
 
 void reservedmarshal_VkRect2D(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRect2D* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
-    reservedmarshal_VkOffset2D(vkStream, (VkOffset2D*)(&forMarshaling->offset), ptr);
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->extent), ptr);
+    (void)rootType;
+    reservedmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forMarshaling->offset), ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->extent), ptr);
 }
 
 void reservedmarshal_VkBaseInStructure(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBaseInStructure* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
 }
 
 void reservedmarshal_VkBaseOutStructure(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBaseOutStructure* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
 }
 
 void reservedmarshal_VkBufferMemoryBarrier(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferMemoryBarrier* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkAccessFlags*)&forMarshaling->srcAccessMask, sizeof(VkAccessFlags));
     *ptr += sizeof(VkAccessFlags);
     memcpy(*ptr, (VkAccessFlags*)&forMarshaling->dstAccessMask, sizeof(VkAccessFlags));
@@ -157,10 +187,12 @@
 
 void reservedmarshal_VkDispatchIndirectCommand(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDispatchIndirectCommand* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->x, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->y, sizeof(uint32_t));
@@ -171,10 +203,12 @@
 
 void reservedmarshal_VkDrawIndexedIndirectCommand(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDrawIndexedIndirectCommand* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->indexCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->instanceCount, sizeof(uint32_t));
@@ -189,10 +223,12 @@
 
 void reservedmarshal_VkDrawIndirectCommand(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDrawIndirectCommand* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->vertexCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->instanceCount, sizeof(uint32_t));
@@ -205,10 +241,12 @@
 
 void reservedmarshal_VkImageSubresourceRange(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageSubresourceRange* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkImageAspectFlags*)&forMarshaling->aspectMask, sizeof(VkImageAspectFlags));
     *ptr += sizeof(VkImageAspectFlags);
     memcpy(*ptr, (uint32_t*)&forMarshaling->baseMipLevel, sizeof(uint32_t));
@@ -223,13 +261,19 @@
 
 void reservedmarshal_VkImageMemoryBarrier(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageMemoryBarrier* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkAccessFlags*)&forMarshaling->srcAccessMask, sizeof(VkAccessFlags));
     *ptr += sizeof(VkAccessFlags);
     memcpy(*ptr, (VkAccessFlags*)&forMarshaling->dstAccessMask, sizeof(VkAccessFlags));
@@ -246,18 +290,24 @@
     *&cgen_var_0 = get_host_u64_VkImage((*&forMarshaling->image));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
     *ptr += 1 * 8;
-    reservedmarshal_VkImageSubresourceRange(vkStream, (VkImageSubresourceRange*)(&forMarshaling->subresourceRange), ptr);
+    reservedmarshal_VkImageSubresourceRange(vkStream, rootType, (VkImageSubresourceRange*)(&forMarshaling->subresourceRange), ptr);
 }
 
 void reservedmarshal_VkMemoryBarrier(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryBarrier* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkAccessFlags*)&forMarshaling->srcAccessMask, sizeof(VkAccessFlags));
     *ptr += sizeof(VkAccessFlags);
     memcpy(*ptr, (VkAccessFlags*)&forMarshaling->dstAccessMask, sizeof(VkAccessFlags));
@@ -266,10 +316,12 @@
 
 void reservedmarshal_VkAllocationCallbacks(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAllocationCallbacks* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pUserData;
     memcpy((*ptr), &cgen_var_0, 8);
@@ -304,13 +356,19 @@
 
 void reservedmarshal_VkApplicationInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkApplicationInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
     {
         // WARNING PTR CHECK
@@ -381,10 +439,12 @@
 
 void reservedmarshal_VkFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFormatProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkFormatFeatureFlags*)&forMarshaling->linearTilingFeatures, sizeof(VkFormatFeatureFlags));
     *ptr += sizeof(VkFormatFeatureFlags);
     memcpy(*ptr, (VkFormatFeatureFlags*)&forMarshaling->optimalTilingFeatures, sizeof(VkFormatFeatureFlags));
@@ -395,11 +455,13 @@
 
 void reservedmarshal_VkImageFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageFormatProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
-    reservedmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->maxExtent), ptr);
+    (void)rootType;
+    reservedmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->maxExtent), ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxMipLevels, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxArrayLayers, sizeof(uint32_t));
@@ -412,13 +474,19 @@
 
 void reservedmarshal_VkInstanceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkInstanceCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkInstanceCreateFlags*)&forMarshaling->flags, sizeof(VkInstanceCreateFlags));
     *ptr += sizeof(VkInstanceCreateFlags);
     // WARNING PTR CHECK
@@ -428,7 +496,7 @@
     *ptr += 8;
     if (forMarshaling->pApplicationInfo)
     {
-        reservedmarshal_VkApplicationInfo(vkStream, (const VkApplicationInfo*)(forMarshaling->pApplicationInfo), ptr);
+        reservedmarshal_VkApplicationInfo(vkStream, rootType, (const VkApplicationInfo*)(forMarshaling->pApplicationInfo), ptr);
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->enabledLayerCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -482,10 +550,12 @@
 
 void reservedmarshal_VkMemoryHeap(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryHeap* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy(*ptr, (VkMemoryHeapFlags*)&forMarshaling->flags, sizeof(VkMemoryHeapFlags));
@@ -494,10 +564,12 @@
 
 void reservedmarshal_VkMemoryType(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryType* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkMemoryPropertyFlags*)&forMarshaling->propertyFlags, sizeof(VkMemoryPropertyFlags));
     *ptr += sizeof(VkMemoryPropertyFlags);
     memcpy(*ptr, (uint32_t*)&forMarshaling->heapIndex, sizeof(uint32_t));
@@ -506,10 +578,12 @@
 
 void reservedmarshal_VkPhysicalDeviceFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFeatures* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkBool32*)&forMarshaling->robustBufferAccess, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->fullDrawIndexUint32, sizeof(VkBool32));
@@ -624,10 +698,12 @@
 
 void reservedmarshal_VkPhysicalDeviceLimits(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceLimits* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxImageDimension1D, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxImageDimension2D, sizeof(uint32_t));
@@ -846,30 +922,34 @@
 
 void reservedmarshal_VkPhysicalDeviceMemoryProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->memoryTypeCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_TYPES; ++i)
     {
-        reservedmarshal_VkMemoryType(vkStream, (VkMemoryType*)(forMarshaling->memoryTypes + i), ptr);
+        reservedmarshal_VkMemoryType(vkStream, rootType, (VkMemoryType*)(forMarshaling->memoryTypes + i), ptr);
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->memoryHeapCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_HEAPS; ++i)
     {
-        reservedmarshal_VkMemoryHeap(vkStream, (VkMemoryHeap*)(forMarshaling->memoryHeaps + i), ptr);
+        reservedmarshal_VkMemoryHeap(vkStream, rootType, (VkMemoryHeap*)(forMarshaling->memoryHeaps + i), ptr);
     }
 }
 
 void reservedmarshal_VkPhysicalDeviceSparseProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSparseProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkBool32*)&forMarshaling->residencyStandard2DBlockShape, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->residencyStandard2DMultisampleBlockShape, sizeof(VkBool32));
@@ -884,10 +964,12 @@
 
 void reservedmarshal_VkPhysicalDeviceProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->apiVersion, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->driverVersion, sizeof(uint32_t));
@@ -902,34 +984,42 @@
     *ptr += VK_MAX_PHYSICAL_DEVICE_NAME_SIZE * sizeof(char);
     memcpy(*ptr, (uint8_t*)forMarshaling->pipelineCacheUUID, VK_UUID_SIZE * sizeof(uint8_t));
     *ptr += VK_UUID_SIZE * sizeof(uint8_t);
-    reservedmarshal_VkPhysicalDeviceLimits(vkStream, (VkPhysicalDeviceLimits*)(&forMarshaling->limits), ptr);
-    reservedmarshal_VkPhysicalDeviceSparseProperties(vkStream, (VkPhysicalDeviceSparseProperties*)(&forMarshaling->sparseProperties), ptr);
+    reservedmarshal_VkPhysicalDeviceLimits(vkStream, rootType, (VkPhysicalDeviceLimits*)(&forMarshaling->limits), ptr);
+    reservedmarshal_VkPhysicalDeviceSparseProperties(vkStream, rootType, (VkPhysicalDeviceSparseProperties*)(&forMarshaling->sparseProperties), ptr);
 }
 
 void reservedmarshal_VkQueueFamilyProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkQueueFamilyProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkQueueFlags*)&forMarshaling->queueFlags, sizeof(VkQueueFlags));
     *ptr += sizeof(VkQueueFlags);
     memcpy(*ptr, (uint32_t*)&forMarshaling->queueCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->timestampValidBits, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    reservedmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->minImageTransferGranularity), ptr);
+    reservedmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->minImageTransferGranularity), ptr);
 }
 
 void reservedmarshal_VkDeviceQueueCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceQueueCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDeviceQueueCreateFlags*)&forMarshaling->flags, sizeof(VkDeviceQueueCreateFlags));
     *ptr += sizeof(VkDeviceQueueCreateFlags);
     memcpy(*ptr, (uint32_t*)&forMarshaling->queueFamilyIndex, sizeof(uint32_t));
@@ -942,20 +1032,26 @@
 
 void reservedmarshal_VkDeviceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDeviceCreateFlags*)&forMarshaling->flags, sizeof(VkDeviceCreateFlags));
     *ptr += sizeof(VkDeviceCreateFlags);
     memcpy(*ptr, (uint32_t*)&forMarshaling->queueCreateInfoCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->queueCreateInfoCount; ++i)
     {
-        reservedmarshal_VkDeviceQueueCreateInfo(vkStream, (const VkDeviceQueueCreateInfo*)(forMarshaling->pQueueCreateInfos + i), ptr);
+        reservedmarshal_VkDeviceQueueCreateInfo(vkStream, rootType, (const VkDeviceQueueCreateInfo*)(forMarshaling->pQueueCreateInfos + i), ptr);
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->enabledLayerCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -1012,16 +1108,18 @@
     *ptr += 8;
     if (forMarshaling->pEnabledFeatures)
     {
-        reservedmarshal_VkPhysicalDeviceFeatures(vkStream, (const VkPhysicalDeviceFeatures*)(forMarshaling->pEnabledFeatures), ptr);
+        reservedmarshal_VkPhysicalDeviceFeatures(vkStream, rootType, (const VkPhysicalDeviceFeatures*)(forMarshaling->pEnabledFeatures), ptr);
     }
 }
 
 void reservedmarshal_VkExtensionProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExtensionProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (char*)forMarshaling->extensionName, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char));
     *ptr += VK_MAX_EXTENSION_NAME_SIZE * sizeof(char);
     memcpy(*ptr, (uint32_t*)&forMarshaling->specVersion, sizeof(uint32_t));
@@ -1030,10 +1128,12 @@
 
 void reservedmarshal_VkLayerProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkLayerProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (char*)forMarshaling->layerName, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char));
     *ptr += VK_MAX_EXTENSION_NAME_SIZE * sizeof(char);
     memcpy(*ptr, (uint32_t*)&forMarshaling->specVersion, sizeof(uint32_t));
@@ -1046,13 +1146,19 @@
 
 void reservedmarshal_VkSubmitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubmitInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->waitSemaphoreCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     if (forMarshaling->waitSemaphoreCount)
@@ -1104,13 +1210,19 @@
 
 void reservedmarshal_VkMappedMemoryRange(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMappedMemoryRange* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkDeviceMemory((*&forMarshaling->memory));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -1123,13 +1235,19 @@
 
 void reservedmarshal_VkMemoryAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryAllocateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->allocationSize, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy(*ptr, (uint32_t*)&forMarshaling->memoryTypeIndex, sizeof(uint32_t));
@@ -1138,10 +1256,12 @@
 
 void reservedmarshal_VkMemoryRequirements(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryRequirements* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->alignment, sizeof(VkDeviceSize));
@@ -1152,10 +1272,12 @@
 
 void reservedmarshal_VkSparseMemoryBind(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseMemoryBind* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->resourceOffset, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
@@ -1172,10 +1294,12 @@
 
 void reservedmarshal_VkSparseBufferMemoryBindInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseBufferMemoryBindInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkBuffer((*&forMarshaling->buffer));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -1184,16 +1308,18 @@
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->bindCount; ++i)
     {
-        reservedmarshal_VkSparseMemoryBind(vkStream, (const VkSparseMemoryBind*)(forMarshaling->pBinds + i), ptr);
+        reservedmarshal_VkSparseMemoryBind(vkStream, rootType, (const VkSparseMemoryBind*)(forMarshaling->pBinds + i), ptr);
     }
 }
 
 void reservedmarshal_VkSparseImageOpaqueMemoryBindInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseImageOpaqueMemoryBindInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkImage((*&forMarshaling->image));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -1202,16 +1328,18 @@
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->bindCount; ++i)
     {
-        reservedmarshal_VkSparseMemoryBind(vkStream, (const VkSparseMemoryBind*)(forMarshaling->pBinds + i), ptr);
+        reservedmarshal_VkSparseMemoryBind(vkStream, rootType, (const VkSparseMemoryBind*)(forMarshaling->pBinds + i), ptr);
     }
 }
 
 void reservedmarshal_VkImageSubresource(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageSubresource* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkImageAspectFlags*)&forMarshaling->aspectMask, sizeof(VkImageAspectFlags));
     *ptr += sizeof(VkImageAspectFlags);
     memcpy(*ptr, (uint32_t*)&forMarshaling->mipLevel, sizeof(uint32_t));
@@ -1222,13 +1350,15 @@
 
 void reservedmarshal_VkSparseImageMemoryBind(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseImageMemoryBind* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
-    reservedmarshal_VkImageSubresource(vkStream, (VkImageSubresource*)(&forMarshaling->subresource), ptr);
-    reservedmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->offset), ptr);
-    reservedmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->extent), ptr);
+    (void)rootType;
+    reservedmarshal_VkImageSubresource(vkStream, rootType, (VkImageSubresource*)(&forMarshaling->subresource), ptr);
+    reservedmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->offset), ptr);
+    reservedmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->extent), ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkDeviceMemory((*&forMarshaling->memory));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -1241,10 +1371,12 @@
 
 void reservedmarshal_VkSparseImageMemoryBindInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseImageMemoryBindInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkImage((*&forMarshaling->image));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -1253,19 +1385,25 @@
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->bindCount; ++i)
     {
-        reservedmarshal_VkSparseImageMemoryBind(vkStream, (const VkSparseImageMemoryBind*)(forMarshaling->pBinds + i), ptr);
+        reservedmarshal_VkSparseImageMemoryBind(vkStream, rootType, (const VkSparseImageMemoryBind*)(forMarshaling->pBinds + i), ptr);
     }
 }
 
 void reservedmarshal_VkBindSparseInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindSparseInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->waitSemaphoreCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     if (forMarshaling->waitSemaphoreCount)
@@ -1285,19 +1423,19 @@
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->bufferBindCount; ++i)
     {
-        reservedmarshal_VkSparseBufferMemoryBindInfo(vkStream, (const VkSparseBufferMemoryBindInfo*)(forMarshaling->pBufferBinds + i), ptr);
+        reservedmarshal_VkSparseBufferMemoryBindInfo(vkStream, rootType, (const VkSparseBufferMemoryBindInfo*)(forMarshaling->pBufferBinds + i), ptr);
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->imageOpaqueBindCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->imageOpaqueBindCount; ++i)
     {
-        reservedmarshal_VkSparseImageOpaqueMemoryBindInfo(vkStream, (const VkSparseImageOpaqueMemoryBindInfo*)(forMarshaling->pImageOpaqueBinds + i), ptr);
+        reservedmarshal_VkSparseImageOpaqueMemoryBindInfo(vkStream, rootType, (const VkSparseImageOpaqueMemoryBindInfo*)(forMarshaling->pImageOpaqueBinds + i), ptr);
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->imageBindCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->imageBindCount; ++i)
     {
-        reservedmarshal_VkSparseImageMemoryBindInfo(vkStream, (const VkSparseImageMemoryBindInfo*)(forMarshaling->pImageBinds + i), ptr);
+        reservedmarshal_VkSparseImageMemoryBindInfo(vkStream, rootType, (const VkSparseImageMemoryBindInfo*)(forMarshaling->pImageBinds + i), ptr);
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->signalSemaphoreCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -1318,24 +1456,28 @@
 
 void reservedmarshal_VkSparseImageFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseImageFormatProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkImageAspectFlags*)&forMarshaling->aspectMask, sizeof(VkImageAspectFlags));
     *ptr += sizeof(VkImageAspectFlags);
-    reservedmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->imageGranularity), ptr);
+    reservedmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->imageGranularity), ptr);
     memcpy(*ptr, (VkSparseImageFormatFlags*)&forMarshaling->flags, sizeof(VkSparseImageFormatFlags));
     *ptr += sizeof(VkSparseImageFormatFlags);
 }
 
 void reservedmarshal_VkSparseImageMemoryRequirements(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseImageMemoryRequirements* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
-    reservedmarshal_VkSparseImageFormatProperties(vkStream, (VkSparseImageFormatProperties*)(&forMarshaling->formatProperties), ptr);
+    (void)rootType;
+    reservedmarshal_VkSparseImageFormatProperties(vkStream, rootType, (VkSparseImageFormatProperties*)(&forMarshaling->formatProperties), ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->imageMipTailFirstLod, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->imageMipTailSize, sizeof(VkDeviceSize));
@@ -1348,52 +1490,76 @@
 
 void reservedmarshal_VkFenceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFenceCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkFenceCreateFlags*)&forMarshaling->flags, sizeof(VkFenceCreateFlags));
     *ptr += sizeof(VkFenceCreateFlags);
 }
 
 void reservedmarshal_VkSemaphoreCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSemaphoreCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkSemaphoreCreateFlags*)&forMarshaling->flags, sizeof(VkSemaphoreCreateFlags));
     *ptr += sizeof(VkSemaphoreCreateFlags);
 }
 
 void reservedmarshal_VkEventCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkEventCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkEventCreateFlags*)&forMarshaling->flags, sizeof(VkEventCreateFlags));
     *ptr += sizeof(VkEventCreateFlags);
 }
 
 void reservedmarshal_VkQueryPoolCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkQueryPoolCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkQueryPoolCreateFlags*)&forMarshaling->flags, sizeof(VkQueryPoolCreateFlags));
     *ptr += sizeof(VkQueryPoolCreateFlags);
     memcpy(*ptr, (VkQueryType*)&forMarshaling->queryType, sizeof(VkQueryType));
@@ -1406,13 +1572,19 @@
 
 void reservedmarshal_VkBufferCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBufferCreateFlags*)&forMarshaling->flags, sizeof(VkBufferCreateFlags));
     *ptr += sizeof(VkBufferCreateFlags);
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
@@ -1437,13 +1609,19 @@
 
 void reservedmarshal_VkBufferViewCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferViewCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBufferViewCreateFlags*)&forMarshaling->flags, sizeof(VkBufferViewCreateFlags));
     *ptr += sizeof(VkBufferViewCreateFlags);
     uint64_t cgen_var_0;
@@ -1460,20 +1638,26 @@
 
 void reservedmarshal_VkImageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkImageCreateFlags*)&forMarshaling->flags, sizeof(VkImageCreateFlags));
     *ptr += sizeof(VkImageCreateFlags);
     memcpy(*ptr, (VkImageType*)&forMarshaling->imageType, sizeof(VkImageType));
     *ptr += sizeof(VkImageType);
     memcpy(*ptr, (VkFormat*)&forMarshaling->format, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
-    reservedmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->extent), ptr);
+    reservedmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->extent), ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->mipLevels, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->arrayLayers, sizeof(uint32_t));
@@ -1504,10 +1688,12 @@
 
 void reservedmarshal_VkSubresourceLayout(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubresourceLayout* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->offset, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
@@ -1522,10 +1708,12 @@
 
 void reservedmarshal_VkComponentMapping(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkComponentMapping* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkComponentSwizzle*)&forMarshaling->r, sizeof(VkComponentSwizzle));
     *ptr += sizeof(VkComponentSwizzle);
     memcpy(*ptr, (VkComponentSwizzle*)&forMarshaling->g, sizeof(VkComponentSwizzle));
@@ -1538,13 +1726,19 @@
 
 void reservedmarshal_VkImageViewCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageViewCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkImageViewCreateFlags*)&forMarshaling->flags, sizeof(VkImageViewCreateFlags));
     *ptr += sizeof(VkImageViewCreateFlags);
     uint64_t cgen_var_0;
@@ -1555,19 +1749,25 @@
     *ptr += sizeof(VkImageViewType);
     memcpy(*ptr, (VkFormat*)&forMarshaling->format, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
-    reservedmarshal_VkComponentMapping(vkStream, (VkComponentMapping*)(&forMarshaling->components), ptr);
-    reservedmarshal_VkImageSubresourceRange(vkStream, (VkImageSubresourceRange*)(&forMarshaling->subresourceRange), ptr);
+    reservedmarshal_VkComponentMapping(vkStream, rootType, (VkComponentMapping*)(&forMarshaling->components), ptr);
+    reservedmarshal_VkImageSubresourceRange(vkStream, rootType, (VkImageSubresourceRange*)(&forMarshaling->subresourceRange), ptr);
 }
 
 void reservedmarshal_VkShaderModuleCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkShaderModuleCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkShaderModuleCreateFlags*)&forMarshaling->flags, sizeof(VkShaderModuleCreateFlags));
     *ptr += sizeof(VkShaderModuleCreateFlags);
     uint64_t cgen_var_0 = (uint64_t)forMarshaling->codeSize;
@@ -1580,13 +1780,19 @@
 
 void reservedmarshal_VkPipelineCacheCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCacheCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineCacheCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineCacheCreateFlags));
     *ptr += sizeof(VkPipelineCacheCreateFlags);
     uint64_t cgen_var_0 = (uint64_t)forMarshaling->initialDataSize;
@@ -1599,10 +1805,12 @@
 
 void reservedmarshal_VkSpecializationMapEntry(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSpecializationMapEntry* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->constantID, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->offset, sizeof(uint32_t));
@@ -1615,15 +1823,17 @@
 
 void reservedmarshal_VkSpecializationInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSpecializationInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->mapEntryCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->mapEntryCount; ++i)
     {
-        reservedmarshal_VkSpecializationMapEntry(vkStream, (const VkSpecializationMapEntry*)(forMarshaling->pMapEntries + i), ptr);
+        reservedmarshal_VkSpecializationMapEntry(vkStream, rootType, (const VkSpecializationMapEntry*)(forMarshaling->pMapEntries + i), ptr);
     }
     uint64_t cgen_var_0 = (uint64_t)forMarshaling->dataSize;
     memcpy((*ptr), &cgen_var_0, 8);
@@ -1635,13 +1845,19 @@
 
 void reservedmarshal_VkPipelineShaderStageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineShaderStageCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineShaderStageCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineShaderStageCreateFlags));
     *ptr += sizeof(VkPipelineShaderStageCreateFlags);
     memcpy(*ptr, (VkShaderStageFlagBits*)&forMarshaling->stage, sizeof(VkShaderStageFlagBits));
@@ -1665,22 +1881,28 @@
     *ptr += 8;
     if (forMarshaling->pSpecializationInfo)
     {
-        reservedmarshal_VkSpecializationInfo(vkStream, (const VkSpecializationInfo*)(forMarshaling->pSpecializationInfo), ptr);
+        reservedmarshal_VkSpecializationInfo(vkStream, rootType, (const VkSpecializationInfo*)(forMarshaling->pSpecializationInfo), ptr);
     }
 }
 
 void reservedmarshal_VkComputePipelineCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkComputePipelineCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineCreateFlags));
     *ptr += sizeof(VkPipelineCreateFlags);
-    reservedmarshal_VkPipelineShaderStageCreateInfo(vkStream, (VkPipelineShaderStageCreateInfo*)(&forMarshaling->stage), ptr);
+    reservedmarshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (VkPipelineShaderStageCreateInfo*)(&forMarshaling->stage), ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkPipelineLayout((*&forMarshaling->layout));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -1695,10 +1917,12 @@
 
 void reservedmarshal_VkVertexInputBindingDescription(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkVertexInputBindingDescription* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->binding, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->stride, sizeof(uint32_t));
@@ -1709,10 +1933,12 @@
 
 void reservedmarshal_VkVertexInputAttributeDescription(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkVertexInputAttributeDescription* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->location, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->binding, sizeof(uint32_t));
@@ -1725,38 +1951,50 @@
 
 void reservedmarshal_VkPipelineVertexInputStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineVertexInputStateCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineVertexInputStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineVertexInputStateCreateFlags));
     *ptr += sizeof(VkPipelineVertexInputStateCreateFlags);
     memcpy(*ptr, (uint32_t*)&forMarshaling->vertexBindingDescriptionCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->vertexBindingDescriptionCount; ++i)
     {
-        reservedmarshal_VkVertexInputBindingDescription(vkStream, (const VkVertexInputBindingDescription*)(forMarshaling->pVertexBindingDescriptions + i), ptr);
+        reservedmarshal_VkVertexInputBindingDescription(vkStream, rootType, (const VkVertexInputBindingDescription*)(forMarshaling->pVertexBindingDescriptions + i), ptr);
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->vertexAttributeDescriptionCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->vertexAttributeDescriptionCount; ++i)
     {
-        reservedmarshal_VkVertexInputAttributeDescription(vkStream, (const VkVertexInputAttributeDescription*)(forMarshaling->pVertexAttributeDescriptions + i), ptr);
+        reservedmarshal_VkVertexInputAttributeDescription(vkStream, rootType, (const VkVertexInputAttributeDescription*)(forMarshaling->pVertexAttributeDescriptions + i), ptr);
     }
 }
 
 void reservedmarshal_VkPipelineInputAssemblyStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineInputAssemblyStateCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineInputAssemblyStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineInputAssemblyStateCreateFlags));
     *ptr += sizeof(VkPipelineInputAssemblyStateCreateFlags);
     memcpy(*ptr, (VkPrimitiveTopology*)&forMarshaling->topology, sizeof(VkPrimitiveTopology));
@@ -1767,13 +2005,19 @@
 
 void reservedmarshal_VkPipelineTessellationStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineTessellationStateCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineTessellationStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineTessellationStateCreateFlags));
     *ptr += sizeof(VkPipelineTessellationStateCreateFlags);
     memcpy(*ptr, (uint32_t*)&forMarshaling->patchControlPoints, sizeof(uint32_t));
@@ -1782,10 +2026,12 @@
 
 void reservedmarshal_VkViewport(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkViewport* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (float*)&forMarshaling->x, sizeof(float));
     *ptr += sizeof(float);
     memcpy(*ptr, (float*)&forMarshaling->y, sizeof(float));
@@ -1802,13 +2048,19 @@
 
 void reservedmarshal_VkPipelineViewportStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineViewportStateCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineViewportStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineViewportStateCreateFlags));
     *ptr += sizeof(VkPipelineViewportStateCreateFlags);
     memcpy(*ptr, (uint32_t*)&forMarshaling->viewportCount, sizeof(uint32_t));
@@ -1822,7 +2074,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->viewportCount; ++i)
         {
-            reservedmarshal_VkViewport(vkStream, (const VkViewport*)(forMarshaling->pViewports + i), ptr);
+            reservedmarshal_VkViewport(vkStream, rootType, (const VkViewport*)(forMarshaling->pViewports + i), ptr);
         }
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->scissorCount, sizeof(uint32_t));
@@ -1836,20 +2088,26 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->scissorCount; ++i)
         {
-            reservedmarshal_VkRect2D(vkStream, (const VkRect2D*)(forMarshaling->pScissors + i), ptr);
+            reservedmarshal_VkRect2D(vkStream, rootType, (const VkRect2D*)(forMarshaling->pScissors + i), ptr);
         }
     }
 }
 
 void reservedmarshal_VkPipelineRasterizationStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRasterizationStateCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineRasterizationStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineRasterizationStateCreateFlags));
     *ptr += sizeof(VkPipelineRasterizationStateCreateFlags);
     memcpy(*ptr, (VkBool32*)&forMarshaling->depthClampEnable, sizeof(VkBool32));
@@ -1876,13 +2134,19 @@
 
 void reservedmarshal_VkPipelineMultisampleStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineMultisampleStateCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineMultisampleStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineMultisampleStateCreateFlags));
     *ptr += sizeof(VkPipelineMultisampleStateCreateFlags);
     memcpy(*ptr, (VkSampleCountFlagBits*)&forMarshaling->rasterizationSamples, sizeof(VkSampleCountFlagBits));
@@ -1909,10 +2173,12 @@
 
 void reservedmarshal_VkStencilOpState(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkStencilOpState* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStencilOp*)&forMarshaling->failOp, sizeof(VkStencilOp));
     *ptr += sizeof(VkStencilOp);
     memcpy(*ptr, (VkStencilOp*)&forMarshaling->passOp, sizeof(VkStencilOp));
@@ -1931,13 +2197,19 @@
 
 void reservedmarshal_VkPipelineDepthStencilStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineDepthStencilStateCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineDepthStencilStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineDepthStencilStateCreateFlags));
     *ptr += sizeof(VkPipelineDepthStencilStateCreateFlags);
     memcpy(*ptr, (VkBool32*)&forMarshaling->depthTestEnable, sizeof(VkBool32));
@@ -1950,8 +2222,8 @@
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->stencilTestEnable, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    reservedmarshal_VkStencilOpState(vkStream, (VkStencilOpState*)(&forMarshaling->front), ptr);
-    reservedmarshal_VkStencilOpState(vkStream, (VkStencilOpState*)(&forMarshaling->back), ptr);
+    reservedmarshal_VkStencilOpState(vkStream, rootType, (VkStencilOpState*)(&forMarshaling->front), ptr);
+    reservedmarshal_VkStencilOpState(vkStream, rootType, (VkStencilOpState*)(&forMarshaling->back), ptr);
     memcpy(*ptr, (float*)&forMarshaling->minDepthBounds, sizeof(float));
     *ptr += sizeof(float);
     memcpy(*ptr, (float*)&forMarshaling->maxDepthBounds, sizeof(float));
@@ -1960,10 +2232,12 @@
 
 void reservedmarshal_VkPipelineColorBlendAttachmentState(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineColorBlendAttachmentState* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkBool32*)&forMarshaling->blendEnable, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBlendFactor*)&forMarshaling->srcColorBlendFactor, sizeof(VkBlendFactor));
@@ -1984,13 +2258,19 @@
 
 void reservedmarshal_VkPipelineColorBlendStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineColorBlendStateCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineColorBlendStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineColorBlendStateCreateFlags));
     *ptr += sizeof(VkPipelineColorBlendStateCreateFlags);
     memcpy(*ptr, (VkBool32*)&forMarshaling->logicOpEnable, sizeof(VkBool32));
@@ -2001,7 +2281,7 @@
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->attachmentCount; ++i)
     {
-        reservedmarshal_VkPipelineColorBlendAttachmentState(vkStream, (const VkPipelineColorBlendAttachmentState*)(forMarshaling->pAttachments + i), ptr);
+        reservedmarshal_VkPipelineColorBlendAttachmentState(vkStream, rootType, (const VkPipelineColorBlendAttachmentState*)(forMarshaling->pAttachments + i), ptr);
     }
     memcpy(*ptr, (float*)forMarshaling->blendConstants, 4 * sizeof(float));
     *ptr += 4 * sizeof(float);
@@ -2009,13 +2289,19 @@
 
 void reservedmarshal_VkPipelineDynamicStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineDynamicStateCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineDynamicStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineDynamicStateCreateFlags));
     *ptr += sizeof(VkPipelineDynamicStateCreateFlags);
     memcpy(*ptr, (uint32_t*)&forMarshaling->dynamicStateCount, sizeof(uint32_t));
@@ -2026,10 +2312,12 @@
 
 void reservedmarshal_VkGraphicsPipelineCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGraphicsPipelineCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     uint32_t hasRasterization = 1;
     if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
     {
@@ -2050,14 +2338,18 @@
     }
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineCreateFlags));
     *ptr += sizeof(VkPipelineCreateFlags);
     memcpy(*ptr, (uint32_t*)&forMarshaling->stageCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->stageCount; ++i)
     {
-        reservedmarshal_VkPipelineShaderStageCreateInfo(vkStream, (const VkPipelineShaderStageCreateInfo*)(forMarshaling->pStages + i), ptr);
+        reservedmarshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (const VkPipelineShaderStageCreateInfo*)(forMarshaling->pStages + i), ptr);
     }
     // WARNING PTR CHECK
     if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
@@ -2069,7 +2361,7 @@
     }
     if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || forMarshaling->pVertexInputState))
     {
-        reservedmarshal_VkPipelineVertexInputStateCreateInfo(vkStream, (const VkPipelineVertexInputStateCreateInfo*)(forMarshaling->pVertexInputState), ptr);
+        reservedmarshal_VkPipelineVertexInputStateCreateInfo(vkStream, rootType, (const VkPipelineVertexInputStateCreateInfo*)(forMarshaling->pVertexInputState), ptr);
     }
     // WARNING PTR CHECK
     if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
@@ -2081,7 +2373,7 @@
     }
     if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || forMarshaling->pInputAssemblyState))
     {
-        reservedmarshal_VkPipelineInputAssemblyStateCreateInfo(vkStream, (const VkPipelineInputAssemblyStateCreateInfo*)(forMarshaling->pInputAssemblyState), ptr);
+        reservedmarshal_VkPipelineInputAssemblyStateCreateInfo(vkStream, rootType, (const VkPipelineInputAssemblyStateCreateInfo*)(forMarshaling->pInputAssemblyState), ptr);
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pTessellationState;
@@ -2092,7 +2384,7 @@
     {
         if (hasTessellation)
         {
-            reservedmarshal_VkPipelineTessellationStateCreateInfo(vkStream, (const VkPipelineTessellationStateCreateInfo*)(forMarshaling->pTessellationState), ptr);
+            reservedmarshal_VkPipelineTessellationStateCreateInfo(vkStream, rootType, (const VkPipelineTessellationStateCreateInfo*)(forMarshaling->pTessellationState), ptr);
         }
     }
     // WARNING PTR CHECK
@@ -2104,7 +2396,7 @@
     {
         if (hasRasterization)
         {
-            reservedmarshal_VkPipelineViewportStateCreateInfo(vkStream, (const VkPipelineViewportStateCreateInfo*)(forMarshaling->pViewportState), ptr);
+            reservedmarshal_VkPipelineViewportStateCreateInfo(vkStream, rootType, (const VkPipelineViewportStateCreateInfo*)(forMarshaling->pViewportState), ptr);
         }
     }
     // WARNING PTR CHECK
@@ -2117,7 +2409,7 @@
     }
     if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || forMarshaling->pRasterizationState))
     {
-        reservedmarshal_VkPipelineRasterizationStateCreateInfo(vkStream, (const VkPipelineRasterizationStateCreateInfo*)(forMarshaling->pRasterizationState), ptr);
+        reservedmarshal_VkPipelineRasterizationStateCreateInfo(vkStream, rootType, (const VkPipelineRasterizationStateCreateInfo*)(forMarshaling->pRasterizationState), ptr);
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)forMarshaling->pMultisampleState;
@@ -2128,7 +2420,7 @@
     {
         if (hasRasterization)
         {
-            reservedmarshal_VkPipelineMultisampleStateCreateInfo(vkStream, (const VkPipelineMultisampleStateCreateInfo*)(forMarshaling->pMultisampleState), ptr);
+            reservedmarshal_VkPipelineMultisampleStateCreateInfo(vkStream, rootType, (const VkPipelineMultisampleStateCreateInfo*)(forMarshaling->pMultisampleState), ptr);
         }
     }
     // WARNING PTR CHECK
@@ -2140,7 +2432,7 @@
     {
         if (hasRasterization)
         {
-            reservedmarshal_VkPipelineDepthStencilStateCreateInfo(vkStream, (const VkPipelineDepthStencilStateCreateInfo*)(forMarshaling->pDepthStencilState), ptr);
+            reservedmarshal_VkPipelineDepthStencilStateCreateInfo(vkStream, rootType, (const VkPipelineDepthStencilStateCreateInfo*)(forMarshaling->pDepthStencilState), ptr);
         }
     }
     // WARNING PTR CHECK
@@ -2152,7 +2444,7 @@
     {
         if (hasRasterization)
         {
-            reservedmarshal_VkPipelineColorBlendStateCreateInfo(vkStream, (const VkPipelineColorBlendStateCreateInfo*)(forMarshaling->pColorBlendState), ptr);
+            reservedmarshal_VkPipelineColorBlendStateCreateInfo(vkStream, rootType, (const VkPipelineColorBlendStateCreateInfo*)(forMarshaling->pColorBlendState), ptr);
         }
     }
     // WARNING PTR CHECK
@@ -2162,7 +2454,7 @@
     *ptr += 8;
     if (forMarshaling->pDynamicState)
     {
-        reservedmarshal_VkPipelineDynamicStateCreateInfo(vkStream, (const VkPipelineDynamicStateCreateInfo*)(forMarshaling->pDynamicState), ptr);
+        reservedmarshal_VkPipelineDynamicStateCreateInfo(vkStream, rootType, (const VkPipelineDynamicStateCreateInfo*)(forMarshaling->pDynamicState), ptr);
     }
     uint64_t cgen_var_6;
     *&cgen_var_6 = get_host_u64_VkPipelineLayout((*&forMarshaling->layout));
@@ -2184,10 +2476,12 @@
 
 void reservedmarshal_VkPushConstantRange(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPushConstantRange* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkShaderStageFlags*)&forMarshaling->stageFlags, sizeof(VkShaderStageFlags));
     *ptr += sizeof(VkShaderStageFlags);
     memcpy(*ptr, (uint32_t*)&forMarshaling->offset, sizeof(uint32_t));
@@ -2198,13 +2492,19 @@
 
 void reservedmarshal_VkPipelineLayoutCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineLayoutCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineLayoutCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineLayoutCreateFlags));
     *ptr += sizeof(VkPipelineLayoutCreateFlags);
     memcpy(*ptr, (uint32_t*)&forMarshaling->setLayoutCount, sizeof(uint32_t));
@@ -2226,19 +2526,25 @@
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->pushConstantRangeCount; ++i)
     {
-        reservedmarshal_VkPushConstantRange(vkStream, (const VkPushConstantRange*)(forMarshaling->pPushConstantRanges + i), ptr);
+        reservedmarshal_VkPushConstantRange(vkStream, rootType, (const VkPushConstantRange*)(forMarshaling->pPushConstantRanges + i), ptr);
     }
 }
 
 void reservedmarshal_VkSamplerCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSamplerCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkSamplerCreateFlags*)&forMarshaling->flags, sizeof(VkSamplerCreateFlags));
     *ptr += sizeof(VkSamplerCreateFlags);
     memcpy(*ptr, (VkFilter*)&forMarshaling->magFilter, sizeof(VkFilter));
@@ -2275,13 +2581,19 @@
 
 void reservedmarshal_VkCopyDescriptorSet(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyDescriptorSet* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkDescriptorSet((*&forMarshaling->srcSet));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -2304,10 +2616,12 @@
 
 void reservedmarshal_VkDescriptorBufferInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorBufferInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkBuffer((*&forMarshaling->buffer));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -2320,10 +2634,12 @@
 
 void reservedmarshal_VkDescriptorImageInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorImageInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkSampler((*&forMarshaling->sampler));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -2338,10 +2654,12 @@
 
 void reservedmarshal_VkDescriptorPoolSize(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorPoolSize* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkDescriptorType*)&forMarshaling->type, sizeof(VkDescriptorType));
     *ptr += sizeof(VkDescriptorType);
     memcpy(*ptr, (uint32_t*)&forMarshaling->descriptorCount, sizeof(uint32_t));
@@ -2350,13 +2668,19 @@
 
 void reservedmarshal_VkDescriptorPoolCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorPoolCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDescriptorPoolCreateFlags*)&forMarshaling->flags, sizeof(VkDescriptorPoolCreateFlags));
     *ptr += sizeof(VkDescriptorPoolCreateFlags);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxSets, sizeof(uint32_t));
@@ -2365,19 +2689,25 @@
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->poolSizeCount; ++i)
     {
-        reservedmarshal_VkDescriptorPoolSize(vkStream, (const VkDescriptorPoolSize*)(forMarshaling->pPoolSizes + i), ptr);
+        reservedmarshal_VkDescriptorPoolSize(vkStream, rootType, (const VkDescriptorPoolSize*)(forMarshaling->pPoolSizes + i), ptr);
     }
 }
 
 void reservedmarshal_VkDescriptorSetAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetAllocateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkDescriptorPool((*&forMarshaling->descriptorPool));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -2401,10 +2731,12 @@
 
 void reservedmarshal_VkDescriptorSetLayoutBinding(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutBinding* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->binding, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (VkDescriptorType*)&forMarshaling->descriptorType, sizeof(VkDescriptorType));
@@ -2438,32 +2770,44 @@
 
 void reservedmarshal_VkDescriptorSetLayoutCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDescriptorSetLayoutCreateFlags*)&forMarshaling->flags, sizeof(VkDescriptorSetLayoutCreateFlags));
     *ptr += sizeof(VkDescriptorSetLayoutCreateFlags);
     memcpy(*ptr, (uint32_t*)&forMarshaling->bindingCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->bindingCount; ++i)
     {
-        reservedmarshal_VkDescriptorSetLayoutBinding(vkStream, (const VkDescriptorSetLayoutBinding*)(forMarshaling->pBindings + i), ptr);
+        reservedmarshal_VkDescriptorSetLayoutBinding(vkStream, rootType, (const VkDescriptorSetLayoutBinding*)(forMarshaling->pBindings + i), ptr);
     }
 }
 
 void reservedmarshal_VkWriteDescriptorSet(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWriteDescriptorSet* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkDescriptorSet((*&forMarshaling->dstSet));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -2487,7 +2831,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forMarshaling->descriptorCount; ++i)
             {
-                reservedmarshal_VkDescriptorImageInfo(vkStream, (const VkDescriptorImageInfo*)(forMarshaling->pImageInfo + i), ptr);
+                reservedmarshal_VkDescriptorImageInfo(vkStream, rootType, (const VkDescriptorImageInfo*)(forMarshaling->pImageInfo + i), ptr);
             }
         }
     }
@@ -2502,7 +2846,7 @@
         {
             for (uint32_t i = 0; i < (uint32_t)forMarshaling->descriptorCount; ++i)
             {
-                reservedmarshal_VkDescriptorBufferInfo(vkStream, (const VkDescriptorBufferInfo*)(forMarshaling->pBufferInfo + i), ptr);
+                reservedmarshal_VkDescriptorBufferInfo(vkStream, rootType, (const VkDescriptorBufferInfo*)(forMarshaling->pBufferInfo + i), ptr);
             }
         }
     }
@@ -2534,10 +2878,12 @@
 
 void reservedmarshal_VkAttachmentDescription(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentDescription* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkAttachmentDescriptionFlags*)&forMarshaling->flags, sizeof(VkAttachmentDescriptionFlags));
     *ptr += sizeof(VkAttachmentDescriptionFlags);
     memcpy(*ptr, (VkFormat*)&forMarshaling->format, sizeof(VkFormat));
@@ -2560,10 +2906,12 @@
 
 void reservedmarshal_VkAttachmentReference(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentReference* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->attachment, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (VkImageLayout*)&forMarshaling->layout, sizeof(VkImageLayout));
@@ -2572,13 +2920,19 @@
 
 void reservedmarshal_VkFramebufferCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFramebufferCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkFramebufferCreateFlags*)&forMarshaling->flags, sizeof(VkFramebufferCreateFlags));
     *ptr += sizeof(VkFramebufferCreateFlags);
     uint64_t cgen_var_0;
@@ -2610,10 +2964,12 @@
 
 void reservedmarshal_VkSubpassDescription(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassDescription* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkSubpassDescriptionFlags*)&forMarshaling->flags, sizeof(VkSubpassDescriptionFlags));
     *ptr += sizeof(VkSubpassDescriptionFlags);
     memcpy(*ptr, (VkPipelineBindPoint*)&forMarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
@@ -2622,13 +2978,13 @@
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->inputAttachmentCount; ++i)
     {
-        reservedmarshal_VkAttachmentReference(vkStream, (const VkAttachmentReference*)(forMarshaling->pInputAttachments + i), ptr);
+        reservedmarshal_VkAttachmentReference(vkStream, rootType, (const VkAttachmentReference*)(forMarshaling->pInputAttachments + i), ptr);
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->colorAttachmentCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->colorAttachmentCount; ++i)
     {
-        reservedmarshal_VkAttachmentReference(vkStream, (const VkAttachmentReference*)(forMarshaling->pColorAttachments + i), ptr);
+        reservedmarshal_VkAttachmentReference(vkStream, rootType, (const VkAttachmentReference*)(forMarshaling->pColorAttachments + i), ptr);
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pResolveAttachments;
@@ -2639,7 +2995,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->colorAttachmentCount; ++i)
         {
-            reservedmarshal_VkAttachmentReference(vkStream, (const VkAttachmentReference*)(forMarshaling->pResolveAttachments + i), ptr);
+            reservedmarshal_VkAttachmentReference(vkStream, rootType, (const VkAttachmentReference*)(forMarshaling->pResolveAttachments + i), ptr);
         }
     }
     // WARNING PTR CHECK
@@ -2649,7 +3005,7 @@
     *ptr += 8;
     if (forMarshaling->pDepthStencilAttachment)
     {
-        reservedmarshal_VkAttachmentReference(vkStream, (const VkAttachmentReference*)(forMarshaling->pDepthStencilAttachment), ptr);
+        reservedmarshal_VkAttachmentReference(vkStream, rootType, (const VkAttachmentReference*)(forMarshaling->pDepthStencilAttachment), ptr);
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->preserveAttachmentCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -2659,10 +3015,12 @@
 
 void reservedmarshal_VkSubpassDependency(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassDependency* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->srcSubpass, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->dstSubpass, sizeof(uint32_t));
@@ -2681,44 +3039,56 @@
 
 void reservedmarshal_VkRenderPassCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkRenderPassCreateFlags*)&forMarshaling->flags, sizeof(VkRenderPassCreateFlags));
     *ptr += sizeof(VkRenderPassCreateFlags);
     memcpy(*ptr, (uint32_t*)&forMarshaling->attachmentCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->attachmentCount; ++i)
     {
-        reservedmarshal_VkAttachmentDescription(vkStream, (const VkAttachmentDescription*)(forMarshaling->pAttachments + i), ptr);
+        reservedmarshal_VkAttachmentDescription(vkStream, rootType, (const VkAttachmentDescription*)(forMarshaling->pAttachments + i), ptr);
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->subpassCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->subpassCount; ++i)
     {
-        reservedmarshal_VkSubpassDescription(vkStream, (const VkSubpassDescription*)(forMarshaling->pSubpasses + i), ptr);
+        reservedmarshal_VkSubpassDescription(vkStream, rootType, (const VkSubpassDescription*)(forMarshaling->pSubpasses + i), ptr);
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->dependencyCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->dependencyCount; ++i)
     {
-        reservedmarshal_VkSubpassDependency(vkStream, (const VkSubpassDependency*)(forMarshaling->pDependencies + i), ptr);
+        reservedmarshal_VkSubpassDependency(vkStream, rootType, (const VkSubpassDependency*)(forMarshaling->pDependencies + i), ptr);
     }
 }
 
 void reservedmarshal_VkCommandPoolCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCommandPoolCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkCommandPoolCreateFlags*)&forMarshaling->flags, sizeof(VkCommandPoolCreateFlags));
     *ptr += sizeof(VkCommandPoolCreateFlags);
     memcpy(*ptr, (uint32_t*)&forMarshaling->queueFamilyIndex, sizeof(uint32_t));
@@ -2727,13 +3097,19 @@
 
 void reservedmarshal_VkCommandBufferAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCommandBufferAllocateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkCommandPool((*&forMarshaling->commandPool));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -2746,13 +3122,19 @@
 
 void reservedmarshal_VkCommandBufferInheritanceInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCommandBufferInheritanceInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkRenderPass((*&forMarshaling->renderPass));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -2773,13 +3155,19 @@
 
 void reservedmarshal_VkCommandBufferBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCommandBufferBeginInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkCommandBufferUsageFlags*)&forMarshaling->flags, sizeof(VkCommandBufferUsageFlags));
     *ptr += sizeof(VkCommandBufferUsageFlags);
     // WARNING PTR CHECK
@@ -2789,16 +3177,18 @@
     *ptr += 8;
     if (forMarshaling->pInheritanceInfo)
     {
-        reservedmarshal_VkCommandBufferInheritanceInfo(vkStream, (const VkCommandBufferInheritanceInfo*)(forMarshaling->pInheritanceInfo), ptr);
+        reservedmarshal_VkCommandBufferInheritanceInfo(vkStream, rootType, (const VkCommandBufferInheritanceInfo*)(forMarshaling->pInheritanceInfo), ptr);
     }
 }
 
 void reservedmarshal_VkBufferCopy(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferCopy* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->srcOffset, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->dstOffset, sizeof(VkDeviceSize));
@@ -2809,10 +3199,12 @@
 
 void reservedmarshal_VkImageSubresourceLayers(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageSubresourceLayers* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkImageAspectFlags*)&forMarshaling->aspectMask, sizeof(VkImageAspectFlags));
     *ptr += sizeof(VkImageAspectFlags);
     memcpy(*ptr, (uint32_t*)&forMarshaling->mipLevel, sizeof(uint32_t));
@@ -2825,37 +3217,43 @@
 
 void reservedmarshal_VkBufferImageCopy(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferImageCopy* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->bufferOffset, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy(*ptr, (uint32_t*)&forMarshaling->bufferRowLength, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->bufferImageHeight, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    reservedmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->imageSubresource), ptr);
-    reservedmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->imageOffset), ptr);
-    reservedmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->imageExtent), ptr);
+    reservedmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->imageSubresource), ptr);
+    reservedmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->imageOffset), ptr);
+    reservedmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->imageExtent), ptr);
 }
 
 void reservedmarshal_VkClearColorValue(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkClearColorValue* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (float*)forMarshaling->float32, 4 * sizeof(float));
     *ptr += 4 * sizeof(float);
 }
 
 void reservedmarshal_VkClearDepthStencilValue(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkClearDepthStencilValue* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (float*)&forMarshaling->depth, sizeof(float));
     *ptr += sizeof(float);
     memcpy(*ptr, (uint32_t*)&forMarshaling->stencil, sizeof(uint32_t));
@@ -2864,33 +3262,39 @@
 
 void reservedmarshal_VkClearValue(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkClearValue* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
-    reservedmarshal_VkClearColorValue(vkStream, (VkClearColorValue*)(&forMarshaling->color), ptr);
+    (void)rootType;
+    reservedmarshal_VkClearColorValue(vkStream, rootType, (VkClearColorValue*)(&forMarshaling->color), ptr);
 }
 
 void reservedmarshal_VkClearAttachment(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkClearAttachment* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkImageAspectFlags*)&forMarshaling->aspectMask, sizeof(VkImageAspectFlags));
     *ptr += sizeof(VkImageAspectFlags);
     memcpy(*ptr, (uint32_t*)&forMarshaling->colorAttachment, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    reservedmarshal_VkClearValue(vkStream, (VkClearValue*)(&forMarshaling->clearValue), ptr);
+    reservedmarshal_VkClearValue(vkStream, rootType, (VkClearValue*)(&forMarshaling->clearValue), ptr);
 }
 
 void reservedmarshal_VkClearRect(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkClearRect* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
-    reservedmarshal_VkRect2D(vkStream, (VkRect2D*)(&forMarshaling->rect), ptr);
+    (void)rootType;
+    reservedmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(&forMarshaling->rect), ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->baseArrayLayer, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->layerCount, sizeof(uint32_t));
@@ -2899,57 +3303,69 @@
 
 void reservedmarshal_VkImageBlit(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageBlit* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
-    reservedmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource), ptr);
+    (void)rootType;
+    reservedmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource), ptr);
     for (uint32_t i = 0; i < (uint32_t)2; ++i)
     {
-        reservedmarshal_VkOffset3D(vkStream, (VkOffset3D*)(forMarshaling->srcOffsets + i), ptr);
+        reservedmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(forMarshaling->srcOffsets + i), ptr);
     }
-    reservedmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource), ptr);
+    reservedmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource), ptr);
     for (uint32_t i = 0; i < (uint32_t)2; ++i)
     {
-        reservedmarshal_VkOffset3D(vkStream, (VkOffset3D*)(forMarshaling->dstOffsets + i), ptr);
+        reservedmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(forMarshaling->dstOffsets + i), ptr);
     }
 }
 
 void reservedmarshal_VkImageCopy(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageCopy* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
-    reservedmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource), ptr);
-    reservedmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->srcOffset), ptr);
-    reservedmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource), ptr);
-    reservedmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->dstOffset), ptr);
-    reservedmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->extent), ptr);
+    (void)rootType;
+    reservedmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource), ptr);
+    reservedmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->srcOffset), ptr);
+    reservedmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource), ptr);
+    reservedmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->dstOffset), ptr);
+    reservedmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->extent), ptr);
 }
 
 void reservedmarshal_VkImageResolve(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageResolve* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
-    reservedmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource), ptr);
-    reservedmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->srcOffset), ptr);
-    reservedmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource), ptr);
-    reservedmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->dstOffset), ptr);
-    reservedmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->extent), ptr);
+    (void)rootType;
+    reservedmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource), ptr);
+    reservedmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->srcOffset), ptr);
+    reservedmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource), ptr);
+    reservedmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->dstOffset), ptr);
+    reservedmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->extent), ptr);
 }
 
 void reservedmarshal_VkRenderPassBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassBeginInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkRenderPass((*&forMarshaling->renderPass));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -2958,7 +3374,7 @@
     *&cgen_var_1 = get_host_u64_VkFramebuffer((*&forMarshaling->framebuffer));
     memcpy(*ptr, (uint64_t*)&cgen_var_1, 1 * 8);
     *ptr += 1 * 8;
-    reservedmarshal_VkRect2D(vkStream, (VkRect2D*)(&forMarshaling->renderArea), ptr);
+    reservedmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(&forMarshaling->renderArea), ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->clearValueCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     // WARNING PTR CHECK
@@ -2970,7 +3386,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->clearValueCount; ++i)
         {
-            reservedmarshal_VkClearValue(vkStream, (const VkClearValue*)(forMarshaling->pClearValues + i), ptr);
+            reservedmarshal_VkClearValue(vkStream, rootType, (const VkClearValue*)(forMarshaling->pClearValues + i), ptr);
         }
     }
 }
@@ -2979,13 +3395,19 @@
 #ifdef VK_VERSION_1_1
 void reservedmarshal_VkPhysicalDeviceSubgroupProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSubgroupProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->subgroupSize, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (VkShaderStageFlags*)&forMarshaling->supportedStages, sizeof(VkShaderStageFlags));
@@ -2998,13 +3420,19 @@
 
 void reservedmarshal_VkBindBufferMemoryInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindBufferMemoryInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkBuffer((*&forMarshaling->buffer));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -3019,13 +3447,19 @@
 
 void reservedmarshal_VkBindImageMemoryInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindImageMemoryInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkImage((*&forMarshaling->image));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -3040,13 +3474,19 @@
 
 void reservedmarshal_VkPhysicalDevice16BitStorageFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevice16BitStorageFeatures* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->storageBuffer16BitAccess, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->uniformAndStorageBuffer16BitAccess, sizeof(VkBool32));
@@ -3059,13 +3499,19 @@
 
 void reservedmarshal_VkMemoryDedicatedRequirements(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryDedicatedRequirements* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->prefersDedicatedAllocation, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->requiresDedicatedAllocation, sizeof(VkBool32));
@@ -3074,13 +3520,19 @@
 
 void reservedmarshal_VkMemoryDedicatedAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryDedicatedAllocateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkImage((*&forMarshaling->image));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -3093,13 +3545,19 @@
 
 void reservedmarshal_VkMemoryAllocateFlagsInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryAllocateFlagsInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkMemoryAllocateFlags*)&forMarshaling->flags, sizeof(VkMemoryAllocateFlags));
     *ptr += sizeof(VkMemoryAllocateFlags);
     memcpy(*ptr, (uint32_t*)&forMarshaling->deviceMask, sizeof(uint32_t));
@@ -3108,45 +3566,63 @@
 
 void reservedmarshal_VkDeviceGroupRenderPassBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupRenderPassBeginInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->deviceMask, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->deviceRenderAreaCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->deviceRenderAreaCount; ++i)
     {
-        reservedmarshal_VkRect2D(vkStream, (const VkRect2D*)(forMarshaling->pDeviceRenderAreas + i), ptr);
+        reservedmarshal_VkRect2D(vkStream, rootType, (const VkRect2D*)(forMarshaling->pDeviceRenderAreas + i), ptr);
     }
 }
 
 void reservedmarshal_VkDeviceGroupCommandBufferBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupCommandBufferBeginInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->deviceMask, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedmarshal_VkDeviceGroupSubmitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupSubmitInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->waitSemaphoreCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (const uint32_t*)forMarshaling->pWaitSemaphoreDeviceIndices, forMarshaling->waitSemaphoreCount * sizeof(const uint32_t));
@@ -3163,13 +3639,19 @@
 
 void reservedmarshal_VkDeviceGroupBindSparseInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupBindSparseInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->resourceDeviceIndex, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->memoryDeviceIndex, sizeof(uint32_t));
@@ -3178,13 +3660,19 @@
 
 void reservedmarshal_VkBindBufferMemoryDeviceGroupInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindBufferMemoryDeviceGroupInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->deviceIndexCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (const uint32_t*)forMarshaling->pDeviceIndices, forMarshaling->deviceIndexCount * sizeof(const uint32_t));
@@ -3193,13 +3681,19 @@
 
 void reservedmarshal_VkBindImageMemoryDeviceGroupInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindImageMemoryDeviceGroupInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->deviceIndexCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (const uint32_t*)forMarshaling->pDeviceIndices, forMarshaling->deviceIndexCount * sizeof(const uint32_t));
@@ -3208,19 +3702,25 @@
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->splitInstanceBindRegionCount; ++i)
     {
-        reservedmarshal_VkRect2D(vkStream, (const VkRect2D*)(forMarshaling->pSplitInstanceBindRegions + i), ptr);
+        reservedmarshal_VkRect2D(vkStream, rootType, (const VkRect2D*)(forMarshaling->pSplitInstanceBindRegions + i), ptr);
     }
 }
 
 void reservedmarshal_VkPhysicalDeviceGroupProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceGroupProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->physicalDeviceCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (VkPhysicalDevice*)forMarshaling->physicalDevices, VK_MAX_DEVICE_GROUP_SIZE * sizeof(VkPhysicalDevice));
@@ -3231,13 +3731,19 @@
 
 void reservedmarshal_VkDeviceGroupDeviceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupDeviceCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->physicalDeviceCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     if (forMarshaling->physicalDeviceCount)
@@ -3257,13 +3763,19 @@
 
 void reservedmarshal_VkBufferMemoryRequirementsInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferMemoryRequirementsInfo2* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkBuffer((*&forMarshaling->buffer));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -3272,13 +3784,19 @@
 
 void reservedmarshal_VkImageMemoryRequirementsInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageMemoryRequirementsInfo2* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkImage((*&forMarshaling->image));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -3287,13 +3805,19 @@
 
 void reservedmarshal_VkImageSparseMemoryRequirementsInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageSparseMemoryRequirementsInfo2* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkImage((*&forMarshaling->image));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -3302,85 +3826,127 @@
 
 void reservedmarshal_VkMemoryRequirements2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryRequirements2* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkMemoryRequirements(vkStream, (VkMemoryRequirements*)(&forMarshaling->memoryRequirements), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkMemoryRequirements(vkStream, rootType, (VkMemoryRequirements*)(&forMarshaling->memoryRequirements), ptr);
 }
 
 void reservedmarshal_VkSparseImageMemoryRequirements2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseImageMemoryRequirements2* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkSparseImageMemoryRequirements(vkStream, (VkSparseImageMemoryRequirements*)(&forMarshaling->memoryRequirements), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkSparseImageMemoryRequirements(vkStream, rootType, (VkSparseImageMemoryRequirements*)(&forMarshaling->memoryRequirements), ptr);
 }
 
 void reservedmarshal_VkPhysicalDeviceFeatures2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFeatures2* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkPhysicalDeviceFeatures(vkStream, (VkPhysicalDeviceFeatures*)(&forMarshaling->features), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkPhysicalDeviceFeatures(vkStream, rootType, (VkPhysicalDeviceFeatures*)(&forMarshaling->features), ptr);
 }
 
 void reservedmarshal_VkPhysicalDeviceProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceProperties2* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkPhysicalDeviceProperties(vkStream, (VkPhysicalDeviceProperties*)(&forMarshaling->properties), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkPhysicalDeviceProperties(vkStream, rootType, (VkPhysicalDeviceProperties*)(&forMarshaling->properties), ptr);
 }
 
 void reservedmarshal_VkFormatProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFormatProperties2* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkFormatProperties(vkStream, (VkFormatProperties*)(&forMarshaling->formatProperties), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkFormatProperties(vkStream, rootType, (VkFormatProperties*)(&forMarshaling->formatProperties), ptr);
 }
 
 void reservedmarshal_VkImageFormatProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageFormatProperties2* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkImageFormatProperties(vkStream, (VkImageFormatProperties*)(&forMarshaling->imageFormatProperties), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkImageFormatProperties(vkStream, rootType, (VkImageFormatProperties*)(&forMarshaling->imageFormatProperties), ptr);
 }
 
 void reservedmarshal_VkPhysicalDeviceImageFormatInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageFormatInfo2* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkFormat*)&forMarshaling->format, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
     memcpy(*ptr, (VkImageType*)&forMarshaling->type, sizeof(VkImageType));
@@ -3395,49 +3961,73 @@
 
 void reservedmarshal_VkQueueFamilyProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkQueueFamilyProperties2* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkQueueFamilyProperties(vkStream, (VkQueueFamilyProperties*)(&forMarshaling->queueFamilyProperties), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkQueueFamilyProperties(vkStream, rootType, (VkQueueFamilyProperties*)(&forMarshaling->queueFamilyProperties), ptr);
 }
 
 void reservedmarshal_VkPhysicalDeviceMemoryProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryProperties2* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkPhysicalDeviceMemoryProperties(vkStream, (VkPhysicalDeviceMemoryProperties*)(&forMarshaling->memoryProperties), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkPhysicalDeviceMemoryProperties(vkStream, rootType, (VkPhysicalDeviceMemoryProperties*)(&forMarshaling->memoryProperties), ptr);
 }
 
 void reservedmarshal_VkSparseImageFormatProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseImageFormatProperties2* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkSparseImageFormatProperties(vkStream, (VkSparseImageFormatProperties*)(&forMarshaling->properties), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkSparseImageFormatProperties(vkStream, rootType, (VkSparseImageFormatProperties*)(&forMarshaling->properties), ptr);
 }
 
 void reservedmarshal_VkPhysicalDeviceSparseImageFormatInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSparseImageFormatInfo2* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkFormat*)&forMarshaling->format, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
     memcpy(*ptr, (VkImageType*)&forMarshaling->type, sizeof(VkImageType));
@@ -3452,23 +4042,31 @@
 
 void reservedmarshal_VkPhysicalDevicePointClippingProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePointClippingProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPointClippingBehavior*)&forMarshaling->pointClippingBehavior, sizeof(VkPointClippingBehavior));
     *ptr += sizeof(VkPointClippingBehavior);
 }
 
 void reservedmarshal_VkInputAttachmentAspectReference(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkInputAttachmentAspectReference* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->subpass, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->inputAttachmentIndex, sizeof(uint32_t));
@@ -3479,56 +4077,80 @@
 
 void reservedmarshal_VkRenderPassInputAttachmentAspectCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassInputAttachmentAspectCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->aspectReferenceCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->aspectReferenceCount; ++i)
     {
-        reservedmarshal_VkInputAttachmentAspectReference(vkStream, (const VkInputAttachmentAspectReference*)(forMarshaling->pAspectReferences + i), ptr);
+        reservedmarshal_VkInputAttachmentAspectReference(vkStream, rootType, (const VkInputAttachmentAspectReference*)(forMarshaling->pAspectReferences + i), ptr);
     }
 }
 
 void reservedmarshal_VkImageViewUsageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageViewUsageCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkImageUsageFlags*)&forMarshaling->usage, sizeof(VkImageUsageFlags));
     *ptr += sizeof(VkImageUsageFlags);
 }
 
 void reservedmarshal_VkPipelineTessellationDomainOriginStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineTessellationDomainOriginStateCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkTessellationDomainOrigin*)&forMarshaling->domainOrigin, sizeof(VkTessellationDomainOrigin));
     *ptr += sizeof(VkTessellationDomainOrigin);
 }
 
 void reservedmarshal_VkRenderPassMultiviewCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassMultiviewCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->subpassCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (const uint32_t*)forMarshaling->pViewMasks, forMarshaling->subpassCount * sizeof(const uint32_t));
@@ -3545,13 +4167,19 @@
 
 void reservedmarshal_VkPhysicalDeviceMultiviewFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMultiviewFeatures* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->multiview, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->multiviewGeometryShader, sizeof(VkBool32));
@@ -3562,13 +4190,19 @@
 
 void reservedmarshal_VkPhysicalDeviceMultiviewProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMultiviewProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxMultiviewViewCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxMultiviewInstanceIndex, sizeof(uint32_t));
@@ -3577,13 +4211,19 @@
 
 void reservedmarshal_VkPhysicalDeviceVariablePointersFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVariablePointersFeatures* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->variablePointersStorageBuffer, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->variablePointers, sizeof(VkBool32));
@@ -3592,39 +4232,57 @@
 
 void reservedmarshal_VkPhysicalDeviceProtectedMemoryFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceProtectedMemoryFeatures* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->protectedMemory, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkPhysicalDeviceProtectedMemoryProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceProtectedMemoryProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->protectedNoFault, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkDeviceQueueInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceQueueInfo2* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDeviceQueueCreateFlags*)&forMarshaling->flags, sizeof(VkDeviceQueueCreateFlags));
     *ptr += sizeof(VkDeviceQueueCreateFlags);
     memcpy(*ptr, (uint32_t*)&forMarshaling->queueFamilyIndex, sizeof(uint32_t));
@@ -3635,33 +4293,45 @@
 
 void reservedmarshal_VkProtectedSubmitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkProtectedSubmitInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->protectedSubmit, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkSamplerYcbcrConversionCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSamplerYcbcrConversionCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkFormat*)&forMarshaling->format, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
     memcpy(*ptr, (VkSamplerYcbcrModelConversion*)&forMarshaling->ycbcrModel, sizeof(VkSamplerYcbcrModelConversion));
     *ptr += sizeof(VkSamplerYcbcrModelConversion);
     memcpy(*ptr, (VkSamplerYcbcrRange*)&forMarshaling->ycbcrRange, sizeof(VkSamplerYcbcrRange));
     *ptr += sizeof(VkSamplerYcbcrRange);
-    reservedmarshal_VkComponentMapping(vkStream, (VkComponentMapping*)(&forMarshaling->components), ptr);
+    reservedmarshal_VkComponentMapping(vkStream, rootType, (VkComponentMapping*)(&forMarshaling->components), ptr);
     memcpy(*ptr, (VkChromaLocation*)&forMarshaling->xChromaOffset, sizeof(VkChromaLocation));
     *ptr += sizeof(VkChromaLocation);
     memcpy(*ptr, (VkChromaLocation*)&forMarshaling->yChromaOffset, sizeof(VkChromaLocation));
@@ -3674,13 +4344,19 @@
 
 void reservedmarshal_VkSamplerYcbcrConversionInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSamplerYcbcrConversionInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkSamplerYcbcrConversion((*&forMarshaling->conversion));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -3689,62 +4365,88 @@
 
 void reservedmarshal_VkBindImagePlaneMemoryInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindImagePlaneMemoryInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkImageAspectFlagBits*)&forMarshaling->planeAspect, sizeof(VkImageAspectFlagBits));
     *ptr += sizeof(VkImageAspectFlagBits);
 }
 
 void reservedmarshal_VkImagePlaneMemoryRequirementsInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImagePlaneMemoryRequirementsInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkImageAspectFlagBits*)&forMarshaling->planeAspect, sizeof(VkImageAspectFlagBits));
     *ptr += sizeof(VkImageAspectFlagBits);
 }
 
 void reservedmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSamplerYcbcrConversionFeatures* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->samplerYcbcrConversion, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkSamplerYcbcrConversionImageFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSamplerYcbcrConversionImageFormatProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->combinedImageSamplerDescriptorCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedmarshal_VkDescriptorUpdateTemplateEntry(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorUpdateTemplateEntry* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->dstBinding, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->dstArrayElement, sizeof(uint32_t));
@@ -3765,20 +4467,26 @@
 
 void reservedmarshal_VkDescriptorUpdateTemplateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorUpdateTemplateCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDescriptorUpdateTemplateCreateFlags*)&forMarshaling->flags, sizeof(VkDescriptorUpdateTemplateCreateFlags));
     *ptr += sizeof(VkDescriptorUpdateTemplateCreateFlags);
     memcpy(*ptr, (uint32_t*)&forMarshaling->descriptorUpdateEntryCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->descriptorUpdateEntryCount; ++i)
     {
-        reservedmarshal_VkDescriptorUpdateTemplateEntry(vkStream, (const VkDescriptorUpdateTemplateEntry*)(forMarshaling->pDescriptorUpdateEntries + i), ptr);
+        reservedmarshal_VkDescriptorUpdateTemplateEntry(vkStream, rootType, (const VkDescriptorUpdateTemplateEntry*)(forMarshaling->pDescriptorUpdateEntries + i), ptr);
     }
     memcpy(*ptr, (VkDescriptorUpdateTemplateType*)&forMarshaling->templateType, sizeof(VkDescriptorUpdateTemplateType));
     *ptr += sizeof(VkDescriptorUpdateTemplateType);
@@ -3798,10 +4506,12 @@
 
 void reservedmarshal_VkExternalMemoryProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalMemoryProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkExternalMemoryFeatureFlags*)&forMarshaling->externalMemoryFeatures, sizeof(VkExternalMemoryFeatureFlags));
     *ptr += sizeof(VkExternalMemoryFeatureFlags);
     memcpy(*ptr, (VkExternalMemoryHandleTypeFlags*)&forMarshaling->exportFromImportedHandleTypes, sizeof(VkExternalMemoryHandleTypeFlags));
@@ -3812,38 +4522,56 @@
 
 void reservedmarshal_VkPhysicalDeviceExternalImageFormatInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalImageFormatInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlagBits);
 }
 
 void reservedmarshal_VkExternalImageFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalImageFormatProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkExternalMemoryProperties(vkStream, (VkExternalMemoryProperties*)(&forMarshaling->externalMemoryProperties), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkExternalMemoryProperties(vkStream, rootType, (VkExternalMemoryProperties*)(&forMarshaling->externalMemoryProperties), ptr);
 }
 
 void reservedmarshal_VkPhysicalDeviceExternalBufferInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalBufferInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBufferCreateFlags*)&forMarshaling->flags, sizeof(VkBufferCreateFlags));
     *ptr += sizeof(VkBufferCreateFlags);
     memcpy(*ptr, (VkBufferUsageFlags*)&forMarshaling->usage, sizeof(VkBufferUsageFlags));
@@ -3854,25 +4582,37 @@
 
 void reservedmarshal_VkExternalBufferProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalBufferProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkExternalMemoryProperties(vkStream, (VkExternalMemoryProperties*)(&forMarshaling->externalMemoryProperties), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkExternalMemoryProperties(vkStream, rootType, (VkExternalMemoryProperties*)(&forMarshaling->externalMemoryProperties), ptr);
 }
 
 void reservedmarshal_VkPhysicalDeviceIDProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceIDProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint8_t*)forMarshaling->deviceUUID, VK_UUID_SIZE * sizeof(uint8_t));
     *ptr += VK_UUID_SIZE * sizeof(uint8_t);
     memcpy(*ptr, (uint8_t*)forMarshaling->driverUUID, VK_UUID_SIZE * sizeof(uint8_t));
@@ -3887,65 +4627,95 @@
 
 void reservedmarshal_VkExternalMemoryImageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalMemoryImageCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkExternalMemoryHandleTypeFlags*)&forMarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlags));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlags);
 }
 
 void reservedmarshal_VkExternalMemoryBufferCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalMemoryBufferCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkExternalMemoryHandleTypeFlags*)&forMarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlags));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlags);
 }
 
 void reservedmarshal_VkExportMemoryAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportMemoryAllocateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkExternalMemoryHandleTypeFlags*)&forMarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlags));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlags);
 }
 
 void reservedmarshal_VkPhysicalDeviceExternalFenceInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalFenceInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkExternalFenceHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalFenceHandleTypeFlagBits));
     *ptr += sizeof(VkExternalFenceHandleTypeFlagBits);
 }
 
 void reservedmarshal_VkExternalFenceProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalFenceProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkExternalFenceHandleTypeFlags*)&forMarshaling->exportFromImportedHandleTypes, sizeof(VkExternalFenceHandleTypeFlags));
     *ptr += sizeof(VkExternalFenceHandleTypeFlags);
     memcpy(*ptr, (VkExternalFenceHandleTypeFlags*)&forMarshaling->compatibleHandleTypes, sizeof(VkExternalFenceHandleTypeFlags));
@@ -3956,52 +4726,76 @@
 
 void reservedmarshal_VkExportFenceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportFenceCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkExternalFenceHandleTypeFlags*)&forMarshaling->handleTypes, sizeof(VkExternalFenceHandleTypeFlags));
     *ptr += sizeof(VkExternalFenceHandleTypeFlags);
 }
 
 void reservedmarshal_VkExportSemaphoreCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportSemaphoreCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkExternalSemaphoreHandleTypeFlags*)&forMarshaling->handleTypes, sizeof(VkExternalSemaphoreHandleTypeFlags));
     *ptr += sizeof(VkExternalSemaphoreHandleTypeFlags);
 }
 
 void reservedmarshal_VkPhysicalDeviceExternalSemaphoreInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalSemaphoreInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkExternalSemaphoreHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
     *ptr += sizeof(VkExternalSemaphoreHandleTypeFlagBits);
 }
 
 void reservedmarshal_VkExternalSemaphoreProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalSemaphoreProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkExternalSemaphoreHandleTypeFlags*)&forMarshaling->exportFromImportedHandleTypes, sizeof(VkExternalSemaphoreHandleTypeFlags));
     *ptr += sizeof(VkExternalSemaphoreHandleTypeFlags);
     memcpy(*ptr, (VkExternalSemaphoreHandleTypeFlags*)&forMarshaling->compatibleHandleTypes, sizeof(VkExternalSemaphoreHandleTypeFlags));
@@ -4012,13 +4806,19 @@
 
 void reservedmarshal_VkPhysicalDeviceMaintenance3Properties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMaintenance3Properties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxPerSetDescriptors, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->maxMemoryAllocationSize, sizeof(VkDeviceSize));
@@ -4027,26 +4827,38 @@
 
 void reservedmarshal_VkDescriptorSetLayoutSupport(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutSupport* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->supported, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkPhysicalDeviceShaderDrawParametersFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderDrawParametersFeatures* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->shaderDrawParameters, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -4055,13 +4867,19 @@
 #ifdef VK_VERSION_1_2
 void reservedmarshal_VkPhysicalDeviceVulkan11Features(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan11Features* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->storageBuffer16BitAccess, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->uniformAndStorageBuffer16BitAccess, sizeof(VkBool32));
@@ -4090,13 +4908,19 @@
 
 void reservedmarshal_VkPhysicalDeviceVulkan11Properties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan11Properties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint8_t*)forMarshaling->deviceUUID, VK_UUID_SIZE * sizeof(uint8_t));
     *ptr += VK_UUID_SIZE * sizeof(uint8_t);
     memcpy(*ptr, (uint8_t*)forMarshaling->driverUUID, VK_UUID_SIZE * sizeof(uint8_t));
@@ -4131,13 +4955,19 @@
 
 void reservedmarshal_VkPhysicalDeviceVulkan12Features(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan12Features* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->samplerMirrorClampToEdge, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->drawIndirectCount, sizeof(VkBool32));
@@ -4236,10 +5066,12 @@
 
 void reservedmarshal_VkConformanceVersion(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkConformanceVersion* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint8_t*)&forMarshaling->major, sizeof(uint8_t));
     *ptr += sizeof(uint8_t);
     memcpy(*ptr, (uint8_t*)&forMarshaling->minor, sizeof(uint8_t));
@@ -4252,20 +5084,26 @@
 
 void reservedmarshal_VkPhysicalDeviceVulkan12Properties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan12Properties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDriverId*)&forMarshaling->driverID, sizeof(VkDriverId));
     *ptr += sizeof(VkDriverId);
     memcpy(*ptr, (char*)forMarshaling->driverName, VK_MAX_DRIVER_NAME_SIZE * sizeof(char));
     *ptr += VK_MAX_DRIVER_NAME_SIZE * sizeof(char);
     memcpy(*ptr, (char*)forMarshaling->driverInfo, VK_MAX_DRIVER_INFO_SIZE * sizeof(char));
     *ptr += VK_MAX_DRIVER_INFO_SIZE * sizeof(char);
-    reservedmarshal_VkConformanceVersion(vkStream, (VkConformanceVersion*)(&forMarshaling->conformanceVersion), ptr);
+    reservedmarshal_VkConformanceVersion(vkStream, rootType, (VkConformanceVersion*)(&forMarshaling->conformanceVersion), ptr);
     memcpy(*ptr, (VkShaderFloatControlsIndependence*)&forMarshaling->denormBehaviorIndependence, sizeof(VkShaderFloatControlsIndependence));
     *ptr += sizeof(VkShaderFloatControlsIndependence);
     memcpy(*ptr, (VkShaderFloatControlsIndependence*)&forMarshaling->roundingModeIndependence, sizeof(VkShaderFloatControlsIndependence));
@@ -4366,13 +5204,19 @@
 
 void reservedmarshal_VkImageFormatListCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageFormatListCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->viewFormatCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (const VkFormat*)forMarshaling->pViewFormats, forMarshaling->viewFormatCount * sizeof(const VkFormat));
@@ -4381,13 +5225,19 @@
 
 void reservedmarshal_VkAttachmentDescription2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentDescription2* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkAttachmentDescriptionFlags*)&forMarshaling->flags, sizeof(VkAttachmentDescriptionFlags));
     *ptr += sizeof(VkAttachmentDescriptionFlags);
     memcpy(*ptr, (VkFormat*)&forMarshaling->format, sizeof(VkFormat));
@@ -4410,13 +5260,19 @@
 
 void reservedmarshal_VkAttachmentReference2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentReference2* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->attachment, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (VkImageLayout*)&forMarshaling->layout, sizeof(VkImageLayout));
@@ -4427,13 +5283,19 @@
 
 void reservedmarshal_VkSubpassDescription2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassDescription2* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkSubpassDescriptionFlags*)&forMarshaling->flags, sizeof(VkSubpassDescriptionFlags));
     *ptr += sizeof(VkSubpassDescriptionFlags);
     memcpy(*ptr, (VkPipelineBindPoint*)&forMarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
@@ -4444,13 +5306,13 @@
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->inputAttachmentCount; ++i)
     {
-        reservedmarshal_VkAttachmentReference2(vkStream, (const VkAttachmentReference2*)(forMarshaling->pInputAttachments + i), ptr);
+        reservedmarshal_VkAttachmentReference2(vkStream, rootType, (const VkAttachmentReference2*)(forMarshaling->pInputAttachments + i), ptr);
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->colorAttachmentCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->colorAttachmentCount; ++i)
     {
-        reservedmarshal_VkAttachmentReference2(vkStream, (const VkAttachmentReference2*)(forMarshaling->pColorAttachments + i), ptr);
+        reservedmarshal_VkAttachmentReference2(vkStream, rootType, (const VkAttachmentReference2*)(forMarshaling->pColorAttachments + i), ptr);
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pResolveAttachments;
@@ -4461,7 +5323,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->colorAttachmentCount; ++i)
         {
-            reservedmarshal_VkAttachmentReference2(vkStream, (const VkAttachmentReference2*)(forMarshaling->pResolveAttachments + i), ptr);
+            reservedmarshal_VkAttachmentReference2(vkStream, rootType, (const VkAttachmentReference2*)(forMarshaling->pResolveAttachments + i), ptr);
         }
     }
     // WARNING PTR CHECK
@@ -4471,7 +5333,7 @@
     *ptr += 8;
     if (forMarshaling->pDepthStencilAttachment)
     {
-        reservedmarshal_VkAttachmentReference2(vkStream, (const VkAttachmentReference2*)(forMarshaling->pDepthStencilAttachment), ptr);
+        reservedmarshal_VkAttachmentReference2(vkStream, rootType, (const VkAttachmentReference2*)(forMarshaling->pDepthStencilAttachment), ptr);
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->preserveAttachmentCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -4481,13 +5343,19 @@
 
 void reservedmarshal_VkSubpassDependency2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassDependency2* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->srcSubpass, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->dstSubpass, sizeof(uint32_t));
@@ -4508,32 +5376,38 @@
 
 void reservedmarshal_VkRenderPassCreateInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassCreateInfo2* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkRenderPassCreateFlags*)&forMarshaling->flags, sizeof(VkRenderPassCreateFlags));
     *ptr += sizeof(VkRenderPassCreateFlags);
     memcpy(*ptr, (uint32_t*)&forMarshaling->attachmentCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->attachmentCount; ++i)
     {
-        reservedmarshal_VkAttachmentDescription2(vkStream, (const VkAttachmentDescription2*)(forMarshaling->pAttachments + i), ptr);
+        reservedmarshal_VkAttachmentDescription2(vkStream, rootType, (const VkAttachmentDescription2*)(forMarshaling->pAttachments + i), ptr);
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->subpassCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->subpassCount; ++i)
     {
-        reservedmarshal_VkSubpassDescription2(vkStream, (const VkSubpassDescription2*)(forMarshaling->pSubpasses + i), ptr);
+        reservedmarshal_VkSubpassDescription2(vkStream, rootType, (const VkSubpassDescription2*)(forMarshaling->pSubpasses + i), ptr);
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->dependencyCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->dependencyCount; ++i)
     {
-        reservedmarshal_VkSubpassDependency2(vkStream, (const VkSubpassDependency2*)(forMarshaling->pDependencies + i), ptr);
+        reservedmarshal_VkSubpassDependency2(vkStream, rootType, (const VkSubpassDependency2*)(forMarshaling->pDependencies + i), ptr);
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->correlatedViewMaskCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -4543,37 +5417,55 @@
 
 void reservedmarshal_VkSubpassBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassBeginInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkSubpassContents*)&forMarshaling->contents, sizeof(VkSubpassContents));
     *ptr += sizeof(VkSubpassContents);
 }
 
 void reservedmarshal_VkSubpassEndInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassEndInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
 }
 
 void reservedmarshal_VkPhysicalDevice8BitStorageFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevice8BitStorageFeatures* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->storageBuffer8BitAccess, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->uniformAndStorageBuffer8BitAccess, sizeof(VkBool32));
@@ -4584,31 +5476,43 @@
 
 void reservedmarshal_VkPhysicalDeviceDriverProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDriverProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDriverId*)&forMarshaling->driverID, sizeof(VkDriverId));
     *ptr += sizeof(VkDriverId);
     memcpy(*ptr, (char*)forMarshaling->driverName, VK_MAX_DRIVER_NAME_SIZE * sizeof(char));
     *ptr += VK_MAX_DRIVER_NAME_SIZE * sizeof(char);
     memcpy(*ptr, (char*)forMarshaling->driverInfo, VK_MAX_DRIVER_INFO_SIZE * sizeof(char));
     *ptr += VK_MAX_DRIVER_INFO_SIZE * sizeof(char);
-    reservedmarshal_VkConformanceVersion(vkStream, (VkConformanceVersion*)(&forMarshaling->conformanceVersion), ptr);
+    reservedmarshal_VkConformanceVersion(vkStream, rootType, (VkConformanceVersion*)(&forMarshaling->conformanceVersion), ptr);
 }
 
 void reservedmarshal_VkPhysicalDeviceShaderAtomicInt64Features(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderAtomicInt64Features* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->shaderBufferInt64Atomics, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->shaderSharedInt64Atomics, sizeof(VkBool32));
@@ -4617,13 +5521,19 @@
 
 void reservedmarshal_VkPhysicalDeviceShaderFloat16Int8Features(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderFloat16Int8Features* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->shaderFloat16, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->shaderInt8, sizeof(VkBool32));
@@ -4632,13 +5542,19 @@
 
 void reservedmarshal_VkPhysicalDeviceFloatControlsProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFloatControlsProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkShaderFloatControlsIndependence*)&forMarshaling->denormBehaviorIndependence, sizeof(VkShaderFloatControlsIndependence));
     *ptr += sizeof(VkShaderFloatControlsIndependence);
     memcpy(*ptr, (VkShaderFloatControlsIndependence*)&forMarshaling->roundingModeIndependence, sizeof(VkShaderFloatControlsIndependence));
@@ -4677,13 +5593,19 @@
 
 void reservedmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutBindingFlagsCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->bindingCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     // WARNING PTR CHECK
@@ -4700,13 +5622,19 @@
 
 void reservedmarshal_VkPhysicalDeviceDescriptorIndexingFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDescriptorIndexingFeatures* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->shaderInputAttachmentArrayDynamicIndexing, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->shaderUniformTexelBufferArrayDynamicIndexing, sizeof(VkBool32));
@@ -4751,13 +5679,19 @@
 
 void reservedmarshal_VkPhysicalDeviceDescriptorIndexingProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDescriptorIndexingProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxUpdateAfterBindDescriptorsInAllPools, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (VkBool32*)&forMarshaling->shaderUniformBufferArrayNonUniformIndexingNative, sizeof(VkBool32));
@@ -4808,13 +5742,19 @@
 
 void reservedmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetVariableDescriptorCountAllocateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->descriptorSetCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (const uint32_t*)forMarshaling->pDescriptorCounts, forMarshaling->descriptorSetCount * sizeof(const uint32_t));
@@ -4823,26 +5763,38 @@
 
 void reservedmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupport(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetVariableDescriptorCountLayoutSupport* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxVariableDescriptorCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedmarshal_VkSubpassDescriptionDepthStencilResolve(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassDescriptionDepthStencilResolve* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkResolveModeFlagBits*)&forMarshaling->depthResolveMode, sizeof(VkResolveModeFlagBits));
     *ptr += sizeof(VkResolveModeFlagBits);
     memcpy(*ptr, (VkResolveModeFlagBits*)&forMarshaling->stencilResolveMode, sizeof(VkResolveModeFlagBits));
@@ -4854,19 +5806,25 @@
     *ptr += 8;
     if (forMarshaling->pDepthStencilResolveAttachment)
     {
-        reservedmarshal_VkAttachmentReference2(vkStream, (const VkAttachmentReference2*)(forMarshaling->pDepthStencilResolveAttachment), ptr);
+        reservedmarshal_VkAttachmentReference2(vkStream, rootType, (const VkAttachmentReference2*)(forMarshaling->pDepthStencilResolveAttachment), ptr);
     }
 }
 
 void reservedmarshal_VkPhysicalDeviceDepthStencilResolveProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDepthStencilResolveProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkResolveModeFlags*)&forMarshaling->supportedDepthResolveModes, sizeof(VkResolveModeFlags));
     *ptr += sizeof(VkResolveModeFlags);
     memcpy(*ptr, (VkResolveModeFlags*)&forMarshaling->supportedStencilResolveModes, sizeof(VkResolveModeFlags));
@@ -4879,52 +5837,76 @@
 
 void reservedmarshal_VkPhysicalDeviceScalarBlockLayoutFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceScalarBlockLayoutFeatures* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->scalarBlockLayout, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkImageStencilUsageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageStencilUsageCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkImageUsageFlags*)&forMarshaling->stencilUsage, sizeof(VkImageUsageFlags));
     *ptr += sizeof(VkImageUsageFlags);
 }
 
 void reservedmarshal_VkSamplerReductionModeCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSamplerReductionModeCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkSamplerReductionMode*)&forMarshaling->reductionMode, sizeof(VkSamplerReductionMode));
     *ptr += sizeof(VkSamplerReductionMode);
 }
 
 void reservedmarshal_VkPhysicalDeviceSamplerFilterMinmaxProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSamplerFilterMinmaxProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->filterMinmaxSingleComponentFormats, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->filterMinmaxImageComponentMapping, sizeof(VkBool32));
@@ -4933,13 +5915,19 @@
 
 void reservedmarshal_VkPhysicalDeviceVulkanMemoryModelFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkanMemoryModelFeatures* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->vulkanMemoryModel, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->vulkanMemoryModelDeviceScope, sizeof(VkBool32));
@@ -4950,26 +5938,38 @@
 
 void reservedmarshal_VkPhysicalDeviceImagelessFramebufferFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceImagelessFramebufferFeatures* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->imagelessFramebuffer, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkFramebufferAttachmentImageInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFramebufferAttachmentImageInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkImageCreateFlags*)&forMarshaling->flags, sizeof(VkImageCreateFlags));
     *ptr += sizeof(VkImageCreateFlags);
     memcpy(*ptr, (VkImageUsageFlags*)&forMarshaling->usage, sizeof(VkImageUsageFlags));
@@ -4988,30 +5988,42 @@
 
 void reservedmarshal_VkFramebufferAttachmentsCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFramebufferAttachmentsCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->attachmentImageInfoCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->attachmentImageInfoCount; ++i)
     {
-        reservedmarshal_VkFramebufferAttachmentImageInfo(vkStream, (const VkFramebufferAttachmentImageInfo*)(forMarshaling->pAttachmentImageInfos + i), ptr);
+        reservedmarshal_VkFramebufferAttachmentImageInfo(vkStream, rootType, (const VkFramebufferAttachmentImageInfo*)(forMarshaling->pAttachmentImageInfos + i), ptr);
     }
 }
 
 void reservedmarshal_VkRenderPassAttachmentBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassAttachmentBeginInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->attachmentCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     if (forMarshaling->attachmentCount)
@@ -5031,65 +6043,95 @@
 
 void reservedmarshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceUniformBufferStandardLayoutFeatures* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->uniformBufferStandardLayout, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->shaderSubgroupExtendedTypes, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->separateDepthStencilLayouts, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkAttachmentReferenceStencilLayout(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentReferenceStencilLayout* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkImageLayout*)&forMarshaling->stencilLayout, sizeof(VkImageLayout));
     *ptr += sizeof(VkImageLayout);
 }
 
 void reservedmarshal_VkAttachmentDescriptionStencilLayout(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentDescriptionStencilLayout* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkImageLayout*)&forMarshaling->stencilInitialLayout, sizeof(VkImageLayout));
     *ptr += sizeof(VkImageLayout);
     memcpy(*ptr, (VkImageLayout*)&forMarshaling->stencilFinalLayout, sizeof(VkImageLayout));
@@ -5098,52 +6140,76 @@
 
 void reservedmarshal_VkPhysicalDeviceHostQueryResetFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceHostQueryResetFeatures* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->hostQueryReset, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkPhysicalDeviceTimelineSemaphoreFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTimelineSemaphoreFeatures* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->timelineSemaphore, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkPhysicalDeviceTimelineSemaphoreProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTimelineSemaphoreProperties* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint64_t*)&forMarshaling->maxTimelineSemaphoreValueDifference, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
 }
 
 void reservedmarshal_VkSemaphoreTypeCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSemaphoreTypeCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkSemaphoreType*)&forMarshaling->semaphoreType, sizeof(VkSemaphoreType));
     *ptr += sizeof(VkSemaphoreType);
     memcpy(*ptr, (uint64_t*)&forMarshaling->initialValue, sizeof(uint64_t));
@@ -5152,13 +6218,19 @@
 
 void reservedmarshal_VkTimelineSemaphoreSubmitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkTimelineSemaphoreSubmitInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->waitSemaphoreValueCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     // WARNING PTR CHECK
@@ -5187,13 +6259,19 @@
 
 void reservedmarshal_VkSemaphoreWaitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSemaphoreWaitInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkSemaphoreWaitFlags*)&forMarshaling->flags, sizeof(VkSemaphoreWaitFlags));
     *ptr += sizeof(VkSemaphoreWaitFlags);
     memcpy(*ptr, (uint32_t*)&forMarshaling->semaphoreCount, sizeof(uint32_t));
@@ -5217,13 +6295,19 @@
 
 void reservedmarshal_VkSemaphoreSignalInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSemaphoreSignalInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkSemaphore((*&forMarshaling->semaphore));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -5234,13 +6318,19 @@
 
 void reservedmarshal_VkPhysicalDeviceBufferDeviceAddressFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceBufferDeviceAddressFeatures* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->bufferDeviceAddress, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->bufferDeviceAddressCaptureReplay, sizeof(VkBool32));
@@ -5251,13 +6341,19 @@
 
 void reservedmarshal_VkBufferDeviceAddressInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferDeviceAddressInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkBuffer((*&forMarshaling->buffer));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -5266,39 +6362,57 @@
 
 void reservedmarshal_VkBufferOpaqueCaptureAddressCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferOpaqueCaptureAddressCreateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint64_t*)&forMarshaling->opaqueCaptureAddress, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
 }
 
 void reservedmarshal_VkMemoryOpaqueCaptureAddressAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryOpaqueCaptureAddressAllocateInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint64_t*)&forMarshaling->opaqueCaptureAddress, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
 }
 
 void reservedmarshal_VkDeviceMemoryOpaqueCaptureAddressInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceMemoryOpaqueCaptureAddressInfo* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkDeviceMemory((*&forMarshaling->memory));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -5309,17 +6423,19 @@
 #ifdef VK_KHR_surface
 void reservedmarshal_VkSurfaceCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceCapabilitiesKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->minImageCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxImageCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->currentExtent), ptr);
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->minImageExtent), ptr);
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->maxImageExtent), ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->currentExtent), ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->minImageExtent), ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->maxImageExtent), ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxImageArrayLayers, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (VkSurfaceTransformFlagsKHR*)&forMarshaling->supportedTransforms, sizeof(VkSurfaceTransformFlagsKHR));
@@ -5334,10 +6450,12 @@
 
 void reservedmarshal_VkSurfaceFormatKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceFormatKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkFormat*)&forMarshaling->format, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
     memcpy(*ptr, (VkColorSpaceKHR*)&forMarshaling->colorSpace, sizeof(VkColorSpaceKHR));
@@ -5348,13 +6466,19 @@
 #ifdef VK_KHR_swapchain
 void reservedmarshal_VkSwapchainCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSwapchainCreateInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkSwapchainCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkSwapchainCreateFlagsKHR));
     *ptr += sizeof(VkSwapchainCreateFlagsKHR);
     uint64_t cgen_var_0;
@@ -5367,7 +6491,7 @@
     *ptr += sizeof(VkFormat);
     memcpy(*ptr, (VkColorSpaceKHR*)&forMarshaling->imageColorSpace, sizeof(VkColorSpaceKHR));
     *ptr += sizeof(VkColorSpaceKHR);
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->imageExtent), ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->imageExtent), ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->imageArrayLayers, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (VkImageUsageFlags*)&forMarshaling->imageUsage, sizeof(VkImageUsageFlags));
@@ -5402,13 +6526,19 @@
 
 void reservedmarshal_VkPresentInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPresentInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->waitSemaphoreCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     if (forMarshaling->waitSemaphoreCount)
@@ -5455,13 +6585,19 @@
 
 void reservedmarshal_VkImageSwapchainCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageSwapchainCreateInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkSwapchainKHR((*&forMarshaling->swapchain));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -5470,13 +6606,19 @@
 
 void reservedmarshal_VkBindImageMemorySwapchainInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindImageMemorySwapchainInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkSwapchainKHR((*&forMarshaling->swapchain));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -5487,13 +6629,19 @@
 
 void reservedmarshal_VkAcquireNextImageInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAcquireNextImageInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkSwapchainKHR((*&forMarshaling->swapchain));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -5514,13 +6662,19 @@
 
 void reservedmarshal_VkDeviceGroupPresentCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupPresentCapabilitiesKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)forMarshaling->presentMask, VK_MAX_DEVICE_GROUP_SIZE * sizeof(uint32_t));
     *ptr += VK_MAX_DEVICE_GROUP_SIZE * sizeof(uint32_t);
     memcpy(*ptr, (VkDeviceGroupPresentModeFlagsKHR*)&forMarshaling->modes, sizeof(VkDeviceGroupPresentModeFlagsKHR));
@@ -5529,13 +6683,19 @@
 
 void reservedmarshal_VkDeviceGroupPresentInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupPresentInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->swapchainCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (const uint32_t*)forMarshaling->pDeviceMasks, forMarshaling->swapchainCount * sizeof(const uint32_t));
@@ -5546,13 +6706,19 @@
 
 void reservedmarshal_VkDeviceGroupSwapchainCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupSwapchainCreateInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDeviceGroupPresentModeFlagsKHR*)&forMarshaling->modes, sizeof(VkDeviceGroupPresentModeFlagsKHR));
     *ptr += sizeof(VkDeviceGroupPresentModeFlagsKHR);
 }
@@ -5561,66 +6727,80 @@
 #ifdef VK_KHR_display
 void reservedmarshal_VkDisplayModeParametersKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayModeParametersKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->visibleRegion), ptr);
+    (void)rootType;
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->visibleRegion), ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->refreshRate, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedmarshal_VkDisplayModeCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayModeCreateInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDisplayModeCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkDisplayModeCreateFlagsKHR));
     *ptr += sizeof(VkDisplayModeCreateFlagsKHR);
-    reservedmarshal_VkDisplayModeParametersKHR(vkStream, (VkDisplayModeParametersKHR*)(&forMarshaling->parameters), ptr);
+    reservedmarshal_VkDisplayModeParametersKHR(vkStream, rootType, (VkDisplayModeParametersKHR*)(&forMarshaling->parameters), ptr);
 }
 
 void reservedmarshal_VkDisplayModePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayModePropertiesKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkDisplayModeKHR((*&forMarshaling->displayMode));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
     *ptr += 1 * 8;
-    reservedmarshal_VkDisplayModeParametersKHR(vkStream, (VkDisplayModeParametersKHR*)(&forMarshaling->parameters), ptr);
+    reservedmarshal_VkDisplayModeParametersKHR(vkStream, rootType, (VkDisplayModeParametersKHR*)(&forMarshaling->parameters), ptr);
 }
 
 void reservedmarshal_VkDisplayPlaneCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPlaneCapabilitiesKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkDisplayPlaneAlphaFlagsKHR*)&forMarshaling->supportedAlpha, sizeof(VkDisplayPlaneAlphaFlagsKHR));
     *ptr += sizeof(VkDisplayPlaneAlphaFlagsKHR);
-    reservedmarshal_VkOffset2D(vkStream, (VkOffset2D*)(&forMarshaling->minSrcPosition), ptr);
-    reservedmarshal_VkOffset2D(vkStream, (VkOffset2D*)(&forMarshaling->maxSrcPosition), ptr);
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->minSrcExtent), ptr);
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->maxSrcExtent), ptr);
-    reservedmarshal_VkOffset2D(vkStream, (VkOffset2D*)(&forMarshaling->minDstPosition), ptr);
-    reservedmarshal_VkOffset2D(vkStream, (VkOffset2D*)(&forMarshaling->maxDstPosition), ptr);
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->minDstExtent), ptr);
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->maxDstExtent), ptr);
+    reservedmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forMarshaling->minSrcPosition), ptr);
+    reservedmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forMarshaling->maxSrcPosition), ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->minSrcExtent), ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->maxSrcExtent), ptr);
+    reservedmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forMarshaling->minDstPosition), ptr);
+    reservedmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forMarshaling->maxDstPosition), ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->minDstExtent), ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->maxDstExtent), ptr);
 }
 
 void reservedmarshal_VkDisplayPlanePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPlanePropertiesKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkDisplayKHR((*&forMarshaling->currentDisplay));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -5631,10 +6811,12 @@
 
 void reservedmarshal_VkDisplayPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPropertiesKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkDisplayKHR((*&forMarshaling->display));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -5647,8 +6829,8 @@
         memcpy(*ptr, (char*)forMarshaling->displayName, l);
         *ptr += l;
     }
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->physicalDimensions), ptr);
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->physicalResolution), ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->physicalDimensions), ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->physicalResolution), ptr);
     memcpy(*ptr, (VkSurfaceTransformFlagsKHR*)&forMarshaling->supportedTransforms, sizeof(VkSurfaceTransformFlagsKHR));
     *ptr += sizeof(VkSurfaceTransformFlagsKHR);
     memcpy(*ptr, (VkBool32*)&forMarshaling->planeReorderPossible, sizeof(VkBool32));
@@ -5659,13 +6841,19 @@
 
 void reservedmarshal_VkDisplaySurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplaySurfaceCreateInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDisplaySurfaceCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkDisplaySurfaceCreateFlagsKHR));
     *ptr += sizeof(VkDisplaySurfaceCreateFlagsKHR);
     uint64_t cgen_var_0;
@@ -5682,22 +6870,28 @@
     *ptr += sizeof(float);
     memcpy(*ptr, (VkDisplayPlaneAlphaFlagBitsKHR*)&forMarshaling->alphaMode, sizeof(VkDisplayPlaneAlphaFlagBitsKHR));
     *ptr += sizeof(VkDisplayPlaneAlphaFlagBitsKHR);
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->imageExtent), ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->imageExtent), ptr);
 }
 
 #endif
 #ifdef VK_KHR_display_swapchain
 void reservedmarshal_VkDisplayPresentInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPresentInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkRect2D(vkStream, (VkRect2D*)(&forMarshaling->srcRect), ptr);
-    reservedmarshal_VkRect2D(vkStream, (VkRect2D*)(&forMarshaling->dstRect), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(&forMarshaling->srcRect), ptr);
+    reservedmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(&forMarshaling->dstRect), ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->persistent, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -5706,13 +6900,19 @@
 #ifdef VK_KHR_xlib_surface
 void reservedmarshal_VkXlibSurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkXlibSurfaceCreateInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkXlibSurfaceCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkXlibSurfaceCreateFlagsKHR));
     *ptr += sizeof(VkXlibSurfaceCreateFlagsKHR);
     // WARNING PTR CHECK
@@ -5733,13 +6933,19 @@
 #ifdef VK_KHR_xcb_surface
 void reservedmarshal_VkXcbSurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkXcbSurfaceCreateInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkXcbSurfaceCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkXcbSurfaceCreateFlagsKHR));
     *ptr += sizeof(VkXcbSurfaceCreateFlagsKHR);
     // WARNING PTR CHECK
@@ -5760,13 +6966,19 @@
 #ifdef VK_KHR_wayland_surface
 void reservedmarshal_VkWaylandSurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWaylandSurfaceCreateInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkWaylandSurfaceCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkWaylandSurfaceCreateFlagsKHR));
     *ptr += sizeof(VkWaylandSurfaceCreateFlagsKHR);
     // WARNING PTR CHECK
@@ -5795,13 +7007,19 @@
 #ifdef VK_KHR_android_surface
 void reservedmarshal_VkAndroidSurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAndroidSurfaceCreateInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkAndroidSurfaceCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkAndroidSurfaceCreateFlagsKHR));
     *ptr += sizeof(VkAndroidSurfaceCreateFlagsKHR);
     // WARNING PTR CHECK
@@ -5820,13 +7038,19 @@
 #ifdef VK_KHR_win32_surface
 void reservedmarshal_VkWin32SurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWin32SurfaceCreateInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkWin32SurfaceCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkWin32SurfaceCreateFlagsKHR));
     *ptr += sizeof(VkWin32SurfaceCreateFlagsKHR);
     memcpy(*ptr, (HINSTANCE*)&forMarshaling->hinstance, sizeof(HINSTANCE));
@@ -5857,13 +7081,19 @@
 #ifdef VK_KHR_external_memory_win32
 void reservedmarshal_VkImportMemoryWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportMemoryWin32HandleInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlagBits);
     memcpy(*ptr, (HANDLE*)&forMarshaling->handle, sizeof(HANDLE));
@@ -5874,13 +7104,19 @@
 
 void reservedmarshal_VkExportMemoryWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportMemoryWin32HandleInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pAttributes;
     memcpy((*ptr), &cgen_var_0, 8);
@@ -5899,26 +7135,38 @@
 
 void reservedmarshal_VkMemoryWin32HandlePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryWin32HandlePropertiesKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->memoryTypeBits, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedmarshal_VkMemoryGetWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryGetWin32HandleInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkDeviceMemory((*&forMarshaling->memory));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -5931,13 +7179,19 @@
 #ifdef VK_KHR_external_memory_fd
 void reservedmarshal_VkImportMemoryFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportMemoryFdInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlagBits);
     memcpy(*ptr, (int*)&forMarshaling->fd, sizeof(int));
@@ -5946,26 +7200,38 @@
 
 void reservedmarshal_VkMemoryFdPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryFdPropertiesKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->memoryTypeBits, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedmarshal_VkMemoryGetFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryGetFdInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkDeviceMemory((*&forMarshaling->memory));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -5978,13 +7244,19 @@
 #ifdef VK_KHR_win32_keyed_mutex
 void reservedmarshal_VkWin32KeyedMutexAcquireReleaseInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWin32KeyedMutexAcquireReleaseInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->acquireCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     if (forMarshaling->acquireCount)
@@ -6031,13 +7303,19 @@
 #ifdef VK_KHR_external_semaphore_win32
 void reservedmarshal_VkImportSemaphoreWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportSemaphoreWin32HandleInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkSemaphore((*&forMarshaling->semaphore));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -6054,13 +7332,19 @@
 
 void reservedmarshal_VkExportSemaphoreWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportSemaphoreWin32HandleInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pAttributes;
     memcpy((*ptr), &cgen_var_0, 8);
@@ -6079,13 +7363,19 @@
 
 void reservedmarshal_VkD3D12FenceSubmitInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkD3D12FenceSubmitInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->waitSemaphoreValuesCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     // WARNING PTR CHECK
@@ -6114,13 +7404,19 @@
 
 void reservedmarshal_VkSemaphoreGetWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSemaphoreGetWin32HandleInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkSemaphore((*&forMarshaling->semaphore));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -6133,13 +7429,19 @@
 #ifdef VK_KHR_external_semaphore_fd
 void reservedmarshal_VkImportSemaphoreFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportSemaphoreFdInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkSemaphore((*&forMarshaling->semaphore));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -6154,13 +7456,19 @@
 
 void reservedmarshal_VkSemaphoreGetFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSemaphoreGetFdInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkSemaphore((*&forMarshaling->semaphore));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -6173,13 +7481,19 @@
 #ifdef VK_KHR_push_descriptor
 void reservedmarshal_VkPhysicalDevicePushDescriptorPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePushDescriptorPropertiesKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxPushDescriptors, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
@@ -6192,22 +7506,26 @@
 #ifdef VK_KHR_incremental_present
 void reservedmarshal_VkRectLayerKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRectLayerKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
-    reservedmarshal_VkOffset2D(vkStream, (VkOffset2D*)(&forMarshaling->offset), ptr);
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->extent), ptr);
+    (void)rootType;
+    reservedmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forMarshaling->offset), ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->extent), ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->layer, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedmarshal_VkPresentRegionKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPresentRegionKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->rectangleCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     // WARNING PTR CHECK
@@ -6219,20 +7537,26 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->rectangleCount; ++i)
         {
-            reservedmarshal_VkRectLayerKHR(vkStream, (const VkRectLayerKHR*)(forMarshaling->pRectangles + i), ptr);
+            reservedmarshal_VkRectLayerKHR(vkStream, rootType, (const VkRectLayerKHR*)(forMarshaling->pRectangles + i), ptr);
         }
     }
 }
 
 void reservedmarshal_VkPresentRegionsKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPresentRegionsKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->swapchainCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     // WARNING PTR CHECK
@@ -6244,7 +7568,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->swapchainCount; ++i)
         {
-            reservedmarshal_VkPresentRegionKHR(vkStream, (const VkPresentRegionKHR*)(forMarshaling->pRegions + i), ptr);
+            reservedmarshal_VkPresentRegionKHR(vkStream, rootType, (const VkPresentRegionKHR*)(forMarshaling->pRegions + i), ptr);
         }
     }
 }
@@ -6259,13 +7583,19 @@
 #ifdef VK_KHR_shared_presentable_image
 void reservedmarshal_VkSharedPresentSurfaceCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSharedPresentSurfaceCapabilitiesKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkImageUsageFlags*)&forMarshaling->sharedPresentSupportedUsageFlags, sizeof(VkImageUsageFlags));
     *ptr += sizeof(VkImageUsageFlags);
 }
@@ -6278,13 +7608,19 @@
 #ifdef VK_KHR_external_fence_win32
 void reservedmarshal_VkImportFenceWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportFenceWin32HandleInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkFence((*&forMarshaling->fence));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -6301,13 +7637,19 @@
 
 void reservedmarshal_VkExportFenceWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportFenceWin32HandleInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pAttributes;
     memcpy((*ptr), &cgen_var_0, 8);
@@ -6326,13 +7668,19 @@
 
 void reservedmarshal_VkFenceGetWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFenceGetWin32HandleInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkFence((*&forMarshaling->fence));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -6345,13 +7693,19 @@
 #ifdef VK_KHR_external_fence_fd
 void reservedmarshal_VkImportFenceFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportFenceFdInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkFence((*&forMarshaling->fence));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -6366,13 +7720,19 @@
 
 void reservedmarshal_VkFenceGetFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFenceGetFdInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkFence((*&forMarshaling->fence));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -6385,13 +7745,19 @@
 #ifdef VK_KHR_performance_query
 void reservedmarshal_VkPhysicalDevicePerformanceQueryFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePerformanceQueryFeaturesKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->performanceCounterQueryPools, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->performanceCounterMultipleQueryPools, sizeof(VkBool32));
@@ -6400,26 +7766,38 @@
 
 void reservedmarshal_VkPhysicalDevicePerformanceQueryPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePerformanceQueryPropertiesKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->allowCommandBufferQueryCopies, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkPerformanceCounterKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceCounterKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPerformanceCounterUnitKHR*)&forMarshaling->unit, sizeof(VkPerformanceCounterUnitKHR));
     *ptr += sizeof(VkPerformanceCounterUnitKHR);
     memcpy(*ptr, (VkPerformanceCounterScopeKHR*)&forMarshaling->scope, sizeof(VkPerformanceCounterScopeKHR));
@@ -6432,13 +7810,19 @@
 
 void reservedmarshal_VkPerformanceCounterDescriptionKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceCounterDescriptionKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPerformanceCounterDescriptionFlagsKHR*)&forMarshaling->flags, sizeof(VkPerformanceCounterDescriptionFlagsKHR));
     *ptr += sizeof(VkPerformanceCounterDescriptionFlagsKHR);
     memcpy(*ptr, (char*)forMarshaling->name, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
@@ -6451,13 +7835,19 @@
 
 void reservedmarshal_VkQueryPoolPerformanceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkQueryPoolPerformanceCreateInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->queueFamilyIndex, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->counterIndexCount, sizeof(uint32_t));
@@ -6468,23 +7858,31 @@
 
 void reservedmarshal_VkPerformanceCounterResultKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceCounterResultKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (int32_t*)&forMarshaling->int32, sizeof(int32_t));
     *ptr += sizeof(int32_t);
 }
 
 void reservedmarshal_VkAcquireProfilingLockInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAcquireProfilingLockInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkAcquireProfilingLockFlagsKHR*)&forMarshaling->flags, sizeof(VkAcquireProfilingLockFlagsKHR));
     *ptr += sizeof(VkAcquireProfilingLockFlagsKHR);
     memcpy(*ptr, (uint64_t*)&forMarshaling->timeout, sizeof(uint64_t));
@@ -6493,13 +7891,19 @@
 
 void reservedmarshal_VkPerformanceQuerySubmitInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceQuerySubmitInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->counterPassIndex, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
@@ -6510,13 +7914,19 @@
 #ifdef VK_KHR_get_surface_capabilities2
 void reservedmarshal_VkPhysicalDeviceSurfaceInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSurfaceInfo2KHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkSurfaceKHR((*&forMarshaling->surface));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -6525,26 +7935,38 @@
 
 void reservedmarshal_VkSurfaceCapabilities2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceCapabilities2KHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkSurfaceCapabilitiesKHR(vkStream, (VkSurfaceCapabilitiesKHR*)(&forMarshaling->surfaceCapabilities), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkSurfaceCapabilitiesKHR(vkStream, rootType, (VkSurfaceCapabilitiesKHR*)(&forMarshaling->surfaceCapabilities), ptr);
 }
 
 void reservedmarshal_VkSurfaceFormat2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceFormat2KHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkSurfaceFormatKHR(vkStream, (VkSurfaceFormatKHR*)(&forMarshaling->surfaceFormat), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkSurfaceFormatKHR(vkStream, rootType, (VkSurfaceFormatKHR*)(&forMarshaling->surfaceFormat), ptr);
 }
 
 #endif
@@ -6553,49 +7975,73 @@
 #ifdef VK_KHR_get_display_properties2
 void reservedmarshal_VkDisplayProperties2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayProperties2KHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkDisplayPropertiesKHR(vkStream, (VkDisplayPropertiesKHR*)(&forMarshaling->displayProperties), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkDisplayPropertiesKHR(vkStream, rootType, (VkDisplayPropertiesKHR*)(&forMarshaling->displayProperties), ptr);
 }
 
 void reservedmarshal_VkDisplayPlaneProperties2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPlaneProperties2KHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkDisplayPlanePropertiesKHR(vkStream, (VkDisplayPlanePropertiesKHR*)(&forMarshaling->displayPlaneProperties), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkDisplayPlanePropertiesKHR(vkStream, rootType, (VkDisplayPlanePropertiesKHR*)(&forMarshaling->displayPlaneProperties), ptr);
 }
 
 void reservedmarshal_VkDisplayModeProperties2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayModeProperties2KHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkDisplayModePropertiesKHR(vkStream, (VkDisplayModePropertiesKHR*)(&forMarshaling->displayModeProperties), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkDisplayModePropertiesKHR(vkStream, rootType, (VkDisplayModePropertiesKHR*)(&forMarshaling->displayModeProperties), ptr);
 }
 
 void reservedmarshal_VkDisplayPlaneInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPlaneInfo2KHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkDisplayModeKHR((*&forMarshaling->mode));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -6606,14 +8052,20 @@
 
 void reservedmarshal_VkDisplayPlaneCapabilities2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPlaneCapabilities2KHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkDisplayPlaneCapabilitiesKHR(vkStream, (VkDisplayPlaneCapabilitiesKHR*)(&forMarshaling->capabilities), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkDisplayPlaneCapabilitiesKHR(vkStream, rootType, (VkDisplayPlaneCapabilitiesKHR*)(&forMarshaling->capabilities), ptr);
 }
 
 #endif
@@ -6634,13 +8086,19 @@
 #ifdef VK_KHR_portability_subset
 void reservedmarshal_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePortabilitySubsetFeaturesKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->constantAlphaColorBlendFactors, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->events, sizeof(VkBool32));
@@ -6675,13 +8133,19 @@
 
 void reservedmarshal_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePortabilitySubsetPropertiesKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->minVertexInputBindingStrideAlignment, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
@@ -6700,13 +8164,19 @@
 #ifdef VK_KHR_shader_clock
 void reservedmarshal_VkPhysicalDeviceShaderClockFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderClockFeaturesKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->shaderSubgroupClock, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->shaderDeviceClock, sizeof(VkBool32));
@@ -6729,13 +8199,19 @@
 #ifdef VK_KHR_shader_terminate_invocation
 void reservedmarshal_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->shaderTerminateInvocation, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -6744,40 +8220,58 @@
 #ifdef VK_KHR_fragment_shading_rate
 void reservedmarshal_VkFragmentShadingRateAttachmentInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFragmentShadingRateAttachmentInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkAttachmentReference2(vkStream, (const VkAttachmentReference2*)(forMarshaling->pFragmentShadingRateAttachment), ptr);
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->shadingRateAttachmentTexelSize), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkAttachmentReference2(vkStream, rootType, (const VkAttachmentReference2*)(forMarshaling->pFragmentShadingRateAttachment), ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->shadingRateAttachmentTexelSize), ptr);
 }
 
 void reservedmarshal_VkPipelineFragmentShadingRateStateCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineFragmentShadingRateStateCreateInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->fragmentSize), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->fragmentSize), ptr);
     memcpy(*ptr, (VkFragmentShadingRateCombinerOpKHR*)forMarshaling->combinerOps, 2 * sizeof(VkFragmentShadingRateCombinerOpKHR));
     *ptr += 2 * sizeof(VkFragmentShadingRateCombinerOpKHR);
 }
 
 void reservedmarshal_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateFeaturesKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->pipelineFragmentShadingRate, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->primitiveFragmentShadingRate, sizeof(VkBool32));
@@ -6788,15 +8282,21 @@
 
 void reservedmarshal_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRatePropertiesKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->minFragmentShadingRateAttachmentTexelSize), ptr);
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->maxFragmentShadingRateAttachmentTexelSize), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->minFragmentShadingRateAttachmentTexelSize), ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->maxFragmentShadingRateAttachmentTexelSize), ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxFragmentShadingRateAttachmentTexelSizeAspectRatio, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (VkBool32*)&forMarshaling->primitiveFragmentShadingRateWithMultipleViewports, sizeof(VkBool32));
@@ -6805,7 +8305,7 @@
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->fragmentShadingRateNonTrivialCombinerOps, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->maxFragmentSize), ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->maxFragmentSize), ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxFragmentSizeAspectRatio, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxFragmentShadingRateCoverageSamples, sizeof(uint32_t));
@@ -6830,16 +8330,22 @@
 
 void reservedmarshal_VkPhysicalDeviceFragmentShadingRateKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkSampleCountFlags*)&forMarshaling->sampleCounts, sizeof(VkSampleCountFlags));
     *ptr += sizeof(VkSampleCountFlags);
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->fragmentSize), ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->fragmentSize), ptr);
 }
 
 #endif
@@ -6848,13 +8354,19 @@
 #ifdef VK_KHR_surface_protected_capabilities
 void reservedmarshal_VkSurfaceProtectedCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceProtectedCapabilitiesKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->supportsProtected, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -6871,26 +8383,38 @@
 #ifdef VK_KHR_pipeline_executable_properties
 void reservedmarshal_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->pipelineExecutableInfo, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkPipelineInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkPipeline((*&forMarshaling->pipeline));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -6899,13 +8423,19 @@
 
 void reservedmarshal_VkPipelineExecutablePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineExecutablePropertiesKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkShaderStageFlags*)&forMarshaling->stages, sizeof(VkShaderStageFlags));
     *ptr += sizeof(VkShaderStageFlags);
     memcpy(*ptr, (char*)forMarshaling->name, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
@@ -6918,13 +8448,19 @@
 
 void reservedmarshal_VkPipelineExecutableInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineExecutableInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkPipeline((*&forMarshaling->pipeline));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -6935,41 +8471,55 @@
 
 void reservedmarshal_VkPipelineExecutableStatisticValueKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineExecutableStatisticValueKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkBool32*)&forMarshaling->b32, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkPipelineExecutableStatisticKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineExecutableStatisticKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (char*)forMarshaling->name, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
     *ptr += VK_MAX_DESCRIPTION_SIZE * sizeof(char);
     memcpy(*ptr, (char*)forMarshaling->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
     *ptr += VK_MAX_DESCRIPTION_SIZE * sizeof(char);
     memcpy(*ptr, (VkPipelineExecutableStatisticFormatKHR*)&forMarshaling->format, sizeof(VkPipelineExecutableStatisticFormatKHR));
     *ptr += sizeof(VkPipelineExecutableStatisticFormatKHR);
-    reservedmarshal_VkPipelineExecutableStatisticValueKHR(vkStream, (VkPipelineExecutableStatisticValueKHR*)(&forMarshaling->value), ptr);
+    reservedmarshal_VkPipelineExecutableStatisticValueKHR(vkStream, rootType, (VkPipelineExecutableStatisticValueKHR*)(&forMarshaling->value), ptr);
 }
 
 void reservedmarshal_VkPipelineExecutableInternalRepresentationKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineExecutableInternalRepresentationKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (char*)forMarshaling->name, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
     *ptr += VK_MAX_DESCRIPTION_SIZE * sizeof(char);
     memcpy(*ptr, (char*)forMarshaling->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
@@ -6996,13 +8546,19 @@
 #ifdef VK_KHR_pipeline_library
 void reservedmarshal_VkPipelineLibraryCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineLibraryCreateInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->libraryCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     if (forMarshaling->libraryCount)
@@ -7026,13 +8582,19 @@
 #ifdef VK_KHR_copy_commands2
 void reservedmarshal_VkBufferCopy2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferCopy2KHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->srcOffset, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->dstOffset, sizeof(VkDeviceSize));
@@ -7043,13 +8605,19 @@
 
 void reservedmarshal_VkCopyBufferInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyBufferInfo2KHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkBuffer((*&forMarshaling->srcBuffer));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -7062,35 +8630,47 @@
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->regionCount; ++i)
     {
-        reservedmarshal_VkBufferCopy2KHR(vkStream, (const VkBufferCopy2KHR*)(forMarshaling->pRegions + i), ptr);
+        reservedmarshal_VkBufferCopy2KHR(vkStream, rootType, (const VkBufferCopy2KHR*)(forMarshaling->pRegions + i), ptr);
     }
 }
 
 void reservedmarshal_VkImageCopy2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageCopy2KHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource), ptr);
-    reservedmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->srcOffset), ptr);
-    reservedmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource), ptr);
-    reservedmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->dstOffset), ptr);
-    reservedmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->extent), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource), ptr);
+    reservedmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->srcOffset), ptr);
+    reservedmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource), ptr);
+    reservedmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->dstOffset), ptr);
+    reservedmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->extent), ptr);
 }
 
 void reservedmarshal_VkCopyImageInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyImageInfo2KHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkImage((*&forMarshaling->srcImage));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -7107,39 +8687,51 @@
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->regionCount; ++i)
     {
-        reservedmarshal_VkImageCopy2KHR(vkStream, (const VkImageCopy2KHR*)(forMarshaling->pRegions + i), ptr);
+        reservedmarshal_VkImageCopy2KHR(vkStream, rootType, (const VkImageCopy2KHR*)(forMarshaling->pRegions + i), ptr);
     }
 }
 
 void reservedmarshal_VkBufferImageCopy2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferImageCopy2KHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->bufferOffset, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy(*ptr, (uint32_t*)&forMarshaling->bufferRowLength, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->bufferImageHeight, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    reservedmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->imageSubresource), ptr);
-    reservedmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->imageOffset), ptr);
-    reservedmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->imageExtent), ptr);
+    reservedmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->imageSubresource), ptr);
+    reservedmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->imageOffset), ptr);
+    reservedmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->imageExtent), ptr);
 }
 
 void reservedmarshal_VkCopyBufferToImageInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyBufferToImageInfo2KHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkBuffer((*&forMarshaling->srcBuffer));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -7154,19 +8746,25 @@
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->regionCount; ++i)
     {
-        reservedmarshal_VkBufferImageCopy2KHR(vkStream, (const VkBufferImageCopy2KHR*)(forMarshaling->pRegions + i), ptr);
+        reservedmarshal_VkBufferImageCopy2KHR(vkStream, rootType, (const VkBufferImageCopy2KHR*)(forMarshaling->pRegions + i), ptr);
     }
 }
 
 void reservedmarshal_VkCopyImageToBufferInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyImageToBufferInfo2KHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkImage((*&forMarshaling->srcImage));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -7181,40 +8779,52 @@
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->regionCount; ++i)
     {
-        reservedmarshal_VkBufferImageCopy2KHR(vkStream, (const VkBufferImageCopy2KHR*)(forMarshaling->pRegions + i), ptr);
+        reservedmarshal_VkBufferImageCopy2KHR(vkStream, rootType, (const VkBufferImageCopy2KHR*)(forMarshaling->pRegions + i), ptr);
     }
 }
 
 void reservedmarshal_VkImageBlit2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageBlit2KHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource), ptr);
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
     {
-        reservedmarshal_VkOffset3D(vkStream, (VkOffset3D*)(forMarshaling->srcOffsets + i), ptr);
+        rootType = forMarshaling->sType;
     }
-    reservedmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource), ptr);
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource), ptr);
     for (uint32_t i = 0; i < (uint32_t)2; ++i)
     {
-        reservedmarshal_VkOffset3D(vkStream, (VkOffset3D*)(forMarshaling->dstOffsets + i), ptr);
+        reservedmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(forMarshaling->srcOffsets + i), ptr);
+    }
+    reservedmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource), ptr);
+    for (uint32_t i = 0; i < (uint32_t)2; ++i)
+    {
+        reservedmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(forMarshaling->dstOffsets + i), ptr);
     }
 }
 
 void reservedmarshal_VkBlitImageInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBlitImageInfo2KHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkImage((*&forMarshaling->srcImage));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -7231,7 +8841,7 @@
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->regionCount; ++i)
     {
-        reservedmarshal_VkImageBlit2KHR(vkStream, (const VkImageBlit2KHR*)(forMarshaling->pRegions + i), ptr);
+        reservedmarshal_VkImageBlit2KHR(vkStream, rootType, (const VkImageBlit2KHR*)(forMarshaling->pRegions + i), ptr);
     }
     memcpy(*ptr, (VkFilter*)&forMarshaling->filter, sizeof(VkFilter));
     *ptr += sizeof(VkFilter);
@@ -7239,29 +8849,41 @@
 
 void reservedmarshal_VkImageResolve2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageResolve2KHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource), ptr);
-    reservedmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->srcOffset), ptr);
-    reservedmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource), ptr);
-    reservedmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->dstOffset), ptr);
-    reservedmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->extent), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource), ptr);
+    reservedmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->srcOffset), ptr);
+    reservedmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource), ptr);
+    reservedmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->dstOffset), ptr);
+    reservedmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->extent), ptr);
 }
 
 void reservedmarshal_VkResolveImageInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkResolveImageInfo2KHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkImage((*&forMarshaling->srcImage));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -7278,7 +8900,7 @@
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->regionCount; ++i)
     {
-        reservedmarshal_VkImageResolve2KHR(vkStream, (const VkImageResolve2KHR*)(forMarshaling->pRegions + i), ptr);
+        reservedmarshal_VkImageResolve2KHR(vkStream, rootType, (const VkImageResolve2KHR*)(forMarshaling->pRegions + i), ptr);
     }
 }
 
@@ -7286,13 +8908,19 @@
 #ifdef VK_ANDROID_native_buffer
 void reservedmarshal_VkNativeBufferANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkNativeBufferANDROID* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->handle;
     memcpy((*ptr), &cgen_var_0, 8);
@@ -7319,13 +8947,19 @@
 #ifdef VK_EXT_debug_report
 void reservedmarshal_VkDebugReportCallbackCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugReportCallbackCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDebugReportFlagsEXT*)&forMarshaling->flags, sizeof(VkDebugReportFlagsEXT));
     *ptr += sizeof(VkDebugReportFlagsEXT);
     uint64_t cgen_var_0 = (uint64_t)forMarshaling->pfnCallback;
@@ -7354,13 +8988,19 @@
 #ifdef VK_AMD_rasterization_order
 void reservedmarshal_VkPipelineRasterizationStateRasterizationOrderAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRasterizationStateRasterizationOrderAMD* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkRasterizationOrderAMD*)&forMarshaling->rasterizationOrder, sizeof(VkRasterizationOrderAMD));
     *ptr += sizeof(VkRasterizationOrderAMD);
 }
@@ -7373,13 +9013,19 @@
 #ifdef VK_EXT_debug_marker
 void reservedmarshal_VkDebugMarkerObjectNameInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugMarkerObjectNameInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDebugReportObjectTypeEXT*)&forMarshaling->objectType, sizeof(VkDebugReportObjectTypeEXT));
     *ptr += sizeof(VkDebugReportObjectTypeEXT);
     memcpy(*ptr, (uint64_t*)&forMarshaling->object, sizeof(uint64_t));
@@ -7396,13 +9042,19 @@
 
 void reservedmarshal_VkDebugMarkerObjectTagInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugMarkerObjectTagInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDebugReportObjectTypeEXT*)&forMarshaling->objectType, sizeof(VkDebugReportObjectTypeEXT));
     *ptr += sizeof(VkDebugReportObjectTypeEXT);
     memcpy(*ptr, (uint64_t*)&forMarshaling->object, sizeof(uint64_t));
@@ -7419,13 +9071,19 @@
 
 void reservedmarshal_VkDebugMarkerMarkerInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugMarkerMarkerInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     {
         uint32_t l = forMarshaling->pMarkerName ? strlen(forMarshaling->pMarkerName): 0;
         memcpy(*ptr, (uint32_t*)&l, sizeof(uint32_t));
@@ -7444,39 +9102,57 @@
 #ifdef VK_NV_dedicated_allocation
 void reservedmarshal_VkDedicatedAllocationImageCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDedicatedAllocationImageCreateInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->dedicatedAllocation, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkDedicatedAllocationBufferCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDedicatedAllocationBufferCreateInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->dedicatedAllocation, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkDedicatedAllocationMemoryAllocateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDedicatedAllocationMemoryAllocateInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkImage((*&forMarshaling->image));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -7491,13 +9167,19 @@
 #ifdef VK_EXT_transform_feedback
 void reservedmarshal_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTransformFeedbackFeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->transformFeedback, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->geometryStreams, sizeof(VkBool32));
@@ -7506,13 +9188,19 @@
 
 void reservedmarshal_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTransformFeedbackPropertiesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxTransformFeedbackStreams, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxTransformFeedbackBuffers, sizeof(uint32_t));
@@ -7537,13 +9225,19 @@
 
 void reservedmarshal_VkPipelineRasterizationStateStreamCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRasterizationStateStreamCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineRasterizationStateStreamCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkPipelineRasterizationStateStreamCreateFlagsEXT));
     *ptr += sizeof(VkPipelineRasterizationStateStreamCreateFlagsEXT);
     memcpy(*ptr, (uint32_t*)&forMarshaling->rasterizationStream, sizeof(uint32_t));
@@ -7554,13 +9248,19 @@
 #ifdef VK_NVX_image_view_handle
 void reservedmarshal_VkImageViewHandleInfoNVX(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageViewHandleInfoNVX* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkImageView((*&forMarshaling->imageView));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -7575,13 +9275,19 @@
 
 void reservedmarshal_VkImageViewAddressPropertiesNVX(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageViewAddressPropertiesNVX* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDeviceAddress*)&forMarshaling->deviceAddress, sizeof(VkDeviceAddress));
     *ptr += sizeof(VkDeviceAddress);
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
@@ -7600,13 +9306,19 @@
 #ifdef VK_AMD_texture_gather_bias_lod
 void reservedmarshal_VkTextureLODGatherFormatPropertiesAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkTextureLODGatherFormatPropertiesAMD* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->supportsTextureGatherLODBiasAMD, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -7615,10 +9327,12 @@
 #ifdef VK_AMD_shader_info
 void reservedmarshal_VkShaderResourceUsageAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkShaderResourceUsageAMD* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->numUsedVgprs, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->numUsedSgprs, sizeof(uint32_t));
@@ -7637,13 +9351,15 @@
 
 void reservedmarshal_VkShaderStatisticsInfoAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkShaderStatisticsInfoAMD* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkShaderStageFlags*)&forMarshaling->shaderStageMask, sizeof(VkShaderStageFlags));
     *ptr += sizeof(VkShaderStageFlags);
-    reservedmarshal_VkShaderResourceUsageAMD(vkStream, (VkShaderResourceUsageAMD*)(&forMarshaling->resourceUsage), ptr);
+    reservedmarshal_VkShaderResourceUsageAMD(vkStream, rootType, (VkShaderResourceUsageAMD*)(&forMarshaling->resourceUsage), ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->numPhysicalVgprs, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->numPhysicalSgprs, sizeof(uint32_t));
@@ -7662,13 +9378,19 @@
 #ifdef VK_GGP_stream_descriptor_surface
 void reservedmarshal_VkStreamDescriptorSurfaceCreateInfoGGP(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkStreamDescriptorSurfaceCreateInfoGGP* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkStreamDescriptorSurfaceCreateFlagsGGP*)&forMarshaling->flags, sizeof(VkStreamDescriptorSurfaceCreateFlagsGGP));
     *ptr += sizeof(VkStreamDescriptorSurfaceCreateFlagsGGP);
     memcpy(*ptr, (GgpStreamDescriptor*)&forMarshaling->streamDescriptor, sizeof(GgpStreamDescriptor));
@@ -7679,13 +9401,19 @@
 #ifdef VK_NV_corner_sampled_image
 void reservedmarshal_VkPhysicalDeviceCornerSampledImageFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCornerSampledImageFeaturesNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->cornerSampledImage, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -7696,11 +9424,13 @@
 #ifdef VK_NV_external_memory_capabilities
 void reservedmarshal_VkExternalImageFormatPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalImageFormatPropertiesNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
-    reservedmarshal_VkImageFormatProperties(vkStream, (VkImageFormatProperties*)(&forMarshaling->imageFormatProperties), ptr);
+    (void)rootType;
+    reservedmarshal_VkImageFormatProperties(vkStream, rootType, (VkImageFormatProperties*)(&forMarshaling->imageFormatProperties), ptr);
     memcpy(*ptr, (VkExternalMemoryFeatureFlagsNV*)&forMarshaling->externalMemoryFeatures, sizeof(VkExternalMemoryFeatureFlagsNV));
     *ptr += sizeof(VkExternalMemoryFeatureFlagsNV);
     memcpy(*ptr, (VkExternalMemoryHandleTypeFlagsNV*)&forMarshaling->exportFromImportedHandleTypes, sizeof(VkExternalMemoryHandleTypeFlagsNV));
@@ -7713,26 +9443,38 @@
 #ifdef VK_NV_external_memory
 void reservedmarshal_VkExternalMemoryImageCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalMemoryImageCreateInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkExternalMemoryHandleTypeFlagsNV*)&forMarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlagsNV));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlagsNV);
 }
 
 void reservedmarshal_VkExportMemoryAllocateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportMemoryAllocateInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkExternalMemoryHandleTypeFlagsNV*)&forMarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlagsNV));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlagsNV);
 }
@@ -7741,13 +9483,19 @@
 #ifdef VK_NV_external_memory_win32
 void reservedmarshal_VkImportMemoryWin32HandleInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportMemoryWin32HandleInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkExternalMemoryHandleTypeFlagsNV*)&forMarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagsNV));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlagsNV);
     memcpy(*ptr, (HANDLE*)&forMarshaling->handle, sizeof(HANDLE));
@@ -7756,13 +9504,19 @@
 
 void reservedmarshal_VkExportMemoryWin32HandleInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportMemoryWin32HandleInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pAttributes;
     memcpy((*ptr), &cgen_var_0, 8);
@@ -7781,13 +9535,19 @@
 #ifdef VK_NV_win32_keyed_mutex
 void reservedmarshal_VkWin32KeyedMutexAcquireReleaseInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWin32KeyedMutexAcquireReleaseInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->acquireCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     if (forMarshaling->acquireCount)
@@ -7830,13 +9590,19 @@
 #ifdef VK_EXT_validation_flags
 void reservedmarshal_VkValidationFlagsEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkValidationFlagsEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->disabledValidationCheckCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (const VkValidationCheckEXT*)forMarshaling->pDisabledValidationChecks, forMarshaling->disabledValidationCheckCount * sizeof(const VkValidationCheckEXT));
@@ -7847,13 +9613,19 @@
 #ifdef VK_NN_vi_surface
 void reservedmarshal_VkViSurfaceCreateInfoNN(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkViSurfaceCreateInfoNN* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkViSurfaceCreateFlagsNN*)&forMarshaling->flags, sizeof(VkViSurfaceCreateFlagsNN));
     *ptr += sizeof(VkViSurfaceCreateFlagsNN);
     // WARNING PTR CHECK
@@ -7876,13 +9648,19 @@
 #ifdef VK_EXT_texture_compression_astc_hdr
 void reservedmarshal_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->textureCompressionASTC_HDR, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -7891,26 +9669,38 @@
 #ifdef VK_EXT_astc_decode_mode
 void reservedmarshal_VkImageViewASTCDecodeModeEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageViewASTCDecodeModeEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkFormat*)&forMarshaling->decodeMode, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
 }
 
 void reservedmarshal_VkPhysicalDeviceASTCDecodeFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceASTCDecodeFeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->decodeModeSharedExponent, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -7919,13 +9709,19 @@
 #ifdef VK_EXT_conditional_rendering
 void reservedmarshal_VkConditionalRenderingBeginInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkConditionalRenderingBeginInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkBuffer((*&forMarshaling->buffer));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -7938,13 +9734,19 @@
 
 void reservedmarshal_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceConditionalRenderingFeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->conditionalRendering, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->inheritedConditionalRendering, sizeof(VkBool32));
@@ -7953,13 +9755,19 @@
 
 void reservedmarshal_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCommandBufferInheritanceConditionalRenderingInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->conditionalRenderingEnable, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -7968,10 +9776,12 @@
 #ifdef VK_NV_clip_space_w_scaling
 void reservedmarshal_VkViewportWScalingNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkViewportWScalingNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (float*)&forMarshaling->xcoeff, sizeof(float));
     *ptr += sizeof(float);
     memcpy(*ptr, (float*)&forMarshaling->ycoeff, sizeof(float));
@@ -7980,13 +9790,19 @@
 
 void reservedmarshal_VkPipelineViewportWScalingStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineViewportWScalingStateCreateInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->viewportWScalingEnable, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (uint32_t*)&forMarshaling->viewportCount, sizeof(uint32_t));
@@ -8000,7 +9816,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->viewportCount; ++i)
         {
-            reservedmarshal_VkViewportWScalingNV(vkStream, (const VkViewportWScalingNV*)(forMarshaling->pViewportWScalings + i), ptr);
+            reservedmarshal_VkViewportWScalingNV(vkStream, rootType, (const VkViewportWScalingNV*)(forMarshaling->pViewportWScalings + i), ptr);
         }
     }
 }
@@ -8013,20 +9829,26 @@
 #ifdef VK_EXT_display_surface_counter
 void reservedmarshal_VkSurfaceCapabilities2EXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceCapabilities2EXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->minImageCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxImageCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->currentExtent), ptr);
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->minImageExtent), ptr);
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->maxImageExtent), ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->currentExtent), ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->minImageExtent), ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->maxImageExtent), ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxImageArrayLayers, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (VkSurfaceTransformFlagsKHR*)&forMarshaling->supportedTransforms, sizeof(VkSurfaceTransformFlagsKHR));
@@ -8045,52 +9867,76 @@
 #ifdef VK_EXT_display_control
 void reservedmarshal_VkDisplayPowerInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPowerInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDisplayPowerStateEXT*)&forMarshaling->powerState, sizeof(VkDisplayPowerStateEXT));
     *ptr += sizeof(VkDisplayPowerStateEXT);
 }
 
 void reservedmarshal_VkDeviceEventInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceEventInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDeviceEventTypeEXT*)&forMarshaling->deviceEvent, sizeof(VkDeviceEventTypeEXT));
     *ptr += sizeof(VkDeviceEventTypeEXT);
 }
 
 void reservedmarshal_VkDisplayEventInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayEventInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDisplayEventTypeEXT*)&forMarshaling->displayEvent, sizeof(VkDisplayEventTypeEXT));
     *ptr += sizeof(VkDisplayEventTypeEXT);
 }
 
 void reservedmarshal_VkSwapchainCounterCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSwapchainCounterCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkSurfaceCounterFlagsEXT*)&forMarshaling->surfaceCounters, sizeof(VkSurfaceCounterFlagsEXT));
     *ptr += sizeof(VkSurfaceCounterFlagsEXT);
 }
@@ -8099,20 +9945,24 @@
 #ifdef VK_GOOGLE_display_timing
 void reservedmarshal_VkRefreshCycleDurationGOOGLE(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRefreshCycleDurationGOOGLE* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint64_t*)&forMarshaling->refreshDuration, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
 }
 
 void reservedmarshal_VkPastPresentationTimingGOOGLE(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPastPresentationTimingGOOGLE* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->presentID, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint64_t*)&forMarshaling->desiredPresentTime, sizeof(uint64_t));
@@ -8127,10 +9977,12 @@
 
 void reservedmarshal_VkPresentTimeGOOGLE(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPresentTimeGOOGLE* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->presentID, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint64_t*)&forMarshaling->desiredPresentTime, sizeof(uint64_t));
@@ -8139,13 +9991,19 @@
 
 void reservedmarshal_VkPresentTimesInfoGOOGLE(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPresentTimesInfoGOOGLE* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->swapchainCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     // WARNING PTR CHECK
@@ -8157,7 +10015,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->swapchainCount; ++i)
         {
-            reservedmarshal_VkPresentTimeGOOGLE(vkStream, (const VkPresentTimeGOOGLE*)(forMarshaling->pTimes + i), ptr);
+            reservedmarshal_VkPresentTimeGOOGLE(vkStream, rootType, (const VkPresentTimeGOOGLE*)(forMarshaling->pTimes + i), ptr);
         }
     }
 }
@@ -8172,13 +10030,19 @@
 #ifdef VK_NVX_multiview_per_view_attributes
 void reservedmarshal_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->perViewPositionAllComponents, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -8187,10 +10051,12 @@
 #ifdef VK_NV_viewport_swizzle
 void reservedmarshal_VkViewportSwizzleNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkViewportSwizzleNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkViewportCoordinateSwizzleNV*)&forMarshaling->x, sizeof(VkViewportCoordinateSwizzleNV));
     *ptr += sizeof(VkViewportCoordinateSwizzleNV);
     memcpy(*ptr, (VkViewportCoordinateSwizzleNV*)&forMarshaling->y, sizeof(VkViewportCoordinateSwizzleNV));
@@ -8203,13 +10069,19 @@
 
 void reservedmarshal_VkPipelineViewportSwizzleStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineViewportSwizzleStateCreateInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineViewportSwizzleStateCreateFlagsNV*)&forMarshaling->flags, sizeof(VkPipelineViewportSwizzleStateCreateFlagsNV));
     *ptr += sizeof(VkPipelineViewportSwizzleStateCreateFlagsNV);
     memcpy(*ptr, (uint32_t*)&forMarshaling->viewportCount, sizeof(uint32_t));
@@ -8223,7 +10095,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->viewportCount; ++i)
         {
-            reservedmarshal_VkViewportSwizzleNV(vkStream, (const VkViewportSwizzleNV*)(forMarshaling->pViewportSwizzles + i), ptr);
+            reservedmarshal_VkViewportSwizzleNV(vkStream, rootType, (const VkViewportSwizzleNV*)(forMarshaling->pViewportSwizzles + i), ptr);
         }
     }
 }
@@ -8232,26 +10104,38 @@
 #ifdef VK_EXT_discard_rectangles
 void reservedmarshal_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDiscardRectanglePropertiesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxDiscardRectangles, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedmarshal_VkPipelineDiscardRectangleStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineDiscardRectangleStateCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineDiscardRectangleStateCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkPipelineDiscardRectangleStateCreateFlagsEXT));
     *ptr += sizeof(VkPipelineDiscardRectangleStateCreateFlagsEXT);
     memcpy(*ptr, (VkDiscardRectangleModeEXT*)&forMarshaling->discardRectangleMode, sizeof(VkDiscardRectangleModeEXT));
@@ -8267,7 +10151,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->discardRectangleCount; ++i)
         {
-            reservedmarshal_VkRect2D(vkStream, (const VkRect2D*)(forMarshaling->pDiscardRectangles + i), ptr);
+            reservedmarshal_VkRect2D(vkStream, rootType, (const VkRect2D*)(forMarshaling->pDiscardRectangles + i), ptr);
         }
     }
 }
@@ -8276,13 +10160,19 @@
 #ifdef VK_EXT_conservative_rasterization
 void reservedmarshal_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceConservativeRasterizationPropertiesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (float*)&forMarshaling->primitiveOverestimationSize, sizeof(float));
     *ptr += sizeof(float);
     memcpy(*ptr, (float*)&forMarshaling->maxExtraPrimitiveOverestimationSize, sizeof(float));
@@ -8305,13 +10195,19 @@
 
 void reservedmarshal_VkPipelineRasterizationConservativeStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRasterizationConservativeStateCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineRasterizationConservativeStateCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkPipelineRasterizationConservativeStateCreateFlagsEXT));
     *ptr += sizeof(VkPipelineRasterizationConservativeStateCreateFlagsEXT);
     memcpy(*ptr, (VkConservativeRasterizationModeEXT*)&forMarshaling->conservativeRasterizationMode, sizeof(VkConservativeRasterizationModeEXT));
@@ -8324,26 +10220,38 @@
 #ifdef VK_EXT_depth_clip_enable
 void reservedmarshal_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDepthClipEnableFeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->depthClipEnable, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRasterizationDepthClipStateCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineRasterizationDepthClipStateCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkPipelineRasterizationDepthClipStateCreateFlagsEXT));
     *ptr += sizeof(VkPipelineRasterizationDepthClipStateCreateFlagsEXT);
     memcpy(*ptr, (VkBool32*)&forMarshaling->depthClipEnable, sizeof(VkBool32));
@@ -8356,10 +10264,12 @@
 #ifdef VK_EXT_hdr_metadata
 void reservedmarshal_VkXYColorEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkXYColorEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (float*)&forMarshaling->x, sizeof(float));
     *ptr += sizeof(float);
     memcpy(*ptr, (float*)&forMarshaling->y, sizeof(float));
@@ -8368,17 +10278,23 @@
 
 void reservedmarshal_VkHdrMetadataEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkHdrMetadataEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkXYColorEXT(vkStream, (VkXYColorEXT*)(&forMarshaling->displayPrimaryRed), ptr);
-    reservedmarshal_VkXYColorEXT(vkStream, (VkXYColorEXT*)(&forMarshaling->displayPrimaryGreen), ptr);
-    reservedmarshal_VkXYColorEXT(vkStream, (VkXYColorEXT*)(&forMarshaling->displayPrimaryBlue), ptr);
-    reservedmarshal_VkXYColorEXT(vkStream, (VkXYColorEXT*)(&forMarshaling->whitePoint), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkXYColorEXT(vkStream, rootType, (VkXYColorEXT*)(&forMarshaling->displayPrimaryRed), ptr);
+    reservedmarshal_VkXYColorEXT(vkStream, rootType, (VkXYColorEXT*)(&forMarshaling->displayPrimaryGreen), ptr);
+    reservedmarshal_VkXYColorEXT(vkStream, rootType, (VkXYColorEXT*)(&forMarshaling->displayPrimaryBlue), ptr);
+    reservedmarshal_VkXYColorEXT(vkStream, rootType, (VkXYColorEXT*)(&forMarshaling->whitePoint), ptr);
     memcpy(*ptr, (float*)&forMarshaling->maxLuminance, sizeof(float));
     *ptr += sizeof(float);
     memcpy(*ptr, (float*)&forMarshaling->minLuminance, sizeof(float));
@@ -8393,13 +10309,19 @@
 #ifdef VK_MVK_ios_surface
 void reservedmarshal_VkIOSSurfaceCreateInfoMVK(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkIOSSurfaceCreateInfoMVK* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkIOSSurfaceCreateFlagsMVK*)&forMarshaling->flags, sizeof(VkIOSSurfaceCreateFlagsMVK));
     *ptr += sizeof(VkIOSSurfaceCreateFlagsMVK);
     // WARNING PTR CHECK
@@ -8418,13 +10340,19 @@
 #ifdef VK_MVK_macos_surface
 void reservedmarshal_VkMacOSSurfaceCreateInfoMVK(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMacOSSurfaceCreateInfoMVK* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkMacOSSurfaceCreateFlagsMVK*)&forMarshaling->flags, sizeof(VkMacOSSurfaceCreateFlagsMVK));
     *ptr += sizeof(VkMacOSSurfaceCreateFlagsMVK);
     // WARNING PTR CHECK
@@ -8449,13 +10377,19 @@
 #ifdef VK_EXT_debug_utils
 void reservedmarshal_VkDebugUtilsLabelEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugUtilsLabelEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     {
         uint32_t l = forMarshaling->pLabelName ? strlen(forMarshaling->pLabelName): 0;
         memcpy(*ptr, (uint32_t*)&l, sizeof(uint32_t));
@@ -8470,13 +10404,19 @@
 
 void reservedmarshal_VkDebugUtilsObjectNameInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugUtilsObjectNameInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkObjectType*)&forMarshaling->objectType, sizeof(VkObjectType));
     *ptr += sizeof(VkObjectType);
     memcpy(*ptr, (uint64_t*)&forMarshaling->objectHandle, sizeof(uint64_t));
@@ -8515,13 +10455,19 @@
 
 void reservedmarshal_VkDebugUtilsMessengerCallbackDataEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugUtilsMessengerCallbackDataEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDebugUtilsMessengerCallbackDataFlagsEXT*)&forMarshaling->flags, sizeof(VkDebugUtilsMessengerCallbackDataFlagsEXT));
     *ptr += sizeof(VkDebugUtilsMessengerCallbackDataFlagsEXT);
     if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
@@ -8575,7 +10521,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->queueLabelCount; ++i)
         {
-            reservedmarshal_VkDebugUtilsLabelEXT(vkStream, (VkDebugUtilsLabelEXT*)(forMarshaling->pQueueLabels + i), ptr);
+            reservedmarshal_VkDebugUtilsLabelEXT(vkStream, rootType, (VkDebugUtilsLabelEXT*)(forMarshaling->pQueueLabels + i), ptr);
         }
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->cmdBufLabelCount, sizeof(uint32_t));
@@ -8589,7 +10535,7 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->cmdBufLabelCount; ++i)
         {
-            reservedmarshal_VkDebugUtilsLabelEXT(vkStream, (VkDebugUtilsLabelEXT*)(forMarshaling->pCmdBufLabels + i), ptr);
+            reservedmarshal_VkDebugUtilsLabelEXT(vkStream, rootType, (VkDebugUtilsLabelEXT*)(forMarshaling->pCmdBufLabels + i), ptr);
         }
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->objectCount, sizeof(uint32_t));
@@ -8603,20 +10549,26 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->objectCount; ++i)
         {
-            reservedmarshal_VkDebugUtilsObjectNameInfoEXT(vkStream, (VkDebugUtilsObjectNameInfoEXT*)(forMarshaling->pObjects + i), ptr);
+            reservedmarshal_VkDebugUtilsObjectNameInfoEXT(vkStream, rootType, (VkDebugUtilsObjectNameInfoEXT*)(forMarshaling->pObjects + i), ptr);
         }
     }
 }
 
 void reservedmarshal_VkDebugUtilsMessengerCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugUtilsMessengerCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDebugUtilsMessengerCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkDebugUtilsMessengerCreateFlagsEXT));
     *ptr += sizeof(VkDebugUtilsMessengerCreateFlagsEXT);
     memcpy(*ptr, (VkDebugUtilsMessageSeverityFlagsEXT*)&forMarshaling->messageSeverity, sizeof(VkDebugUtilsMessageSeverityFlagsEXT));
@@ -8641,13 +10593,19 @@
 
 void reservedmarshal_VkDebugUtilsObjectTagInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugUtilsObjectTagInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkObjectType*)&forMarshaling->objectType, sizeof(VkObjectType));
     *ptr += sizeof(VkObjectType);
     memcpy(*ptr, (uint64_t*)&forMarshaling->objectHandle, sizeof(uint64_t));
@@ -8666,26 +10624,38 @@
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
 void reservedmarshal_VkAndroidHardwareBufferUsageANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAndroidHardwareBufferUsageANDROID* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint64_t*)&forMarshaling->androidHardwareBufferUsage, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
 }
 
 void reservedmarshal_VkAndroidHardwareBufferPropertiesANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAndroidHardwareBufferPropertiesANDROID* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->allocationSize, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy(*ptr, (uint32_t*)&forMarshaling->memoryTypeBits, sizeof(uint32_t));
@@ -8694,20 +10664,26 @@
 
 void reservedmarshal_VkAndroidHardwareBufferFormatPropertiesANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAndroidHardwareBufferFormatPropertiesANDROID* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkFormat*)&forMarshaling->format, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
     memcpy(*ptr, (uint64_t*)&forMarshaling->externalFormat, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
     memcpy(*ptr, (VkFormatFeatureFlags*)&forMarshaling->formatFeatures, sizeof(VkFormatFeatureFlags));
     *ptr += sizeof(VkFormatFeatureFlags);
-    reservedmarshal_VkComponentMapping(vkStream, (VkComponentMapping*)(&forMarshaling->samplerYcbcrConversionComponents), ptr);
+    reservedmarshal_VkComponentMapping(vkStream, rootType, (VkComponentMapping*)(&forMarshaling->samplerYcbcrConversionComponents), ptr);
     memcpy(*ptr, (VkSamplerYcbcrModelConversion*)&forMarshaling->suggestedYcbcrModel, sizeof(VkSamplerYcbcrModelConversion));
     *ptr += sizeof(VkSamplerYcbcrModelConversion);
     memcpy(*ptr, (VkSamplerYcbcrRange*)&forMarshaling->suggestedYcbcrRange, sizeof(VkSamplerYcbcrRange));
@@ -8720,26 +10696,38 @@
 
 void reservedmarshal_VkImportAndroidHardwareBufferInfoANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportAndroidHardwareBufferInfoANDROID* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (AHardwareBuffer*)forMarshaling->buffer, sizeof(AHardwareBuffer));
     *ptr += sizeof(AHardwareBuffer);
 }
 
 void reservedmarshal_VkMemoryGetAndroidHardwareBufferInfoANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryGetAndroidHardwareBufferInfoANDROID* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkDeviceMemory((*&forMarshaling->memory));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -8748,13 +10736,19 @@
 
 void reservedmarshal_VkExternalFormatANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalFormatANDROID* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint64_t*)&forMarshaling->externalFormat, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
 }
@@ -8771,13 +10765,19 @@
 #ifdef VK_EXT_inline_uniform_block
 void reservedmarshal_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceInlineUniformBlockFeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->inlineUniformBlock, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->descriptorBindingInlineUniformBlockUpdateAfterBind, sizeof(VkBool32));
@@ -8786,13 +10786,19 @@
 
 void reservedmarshal_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceInlineUniformBlockPropertiesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxInlineUniformBlockSize, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxPerStageDescriptorInlineUniformBlocks, sizeof(uint32_t));
@@ -8807,13 +10813,19 @@
 
 void reservedmarshal_VkWriteDescriptorSetInlineUniformBlockEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWriteDescriptorSetInlineUniformBlockEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->dataSize, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (const void*)forMarshaling->pData, forMarshaling->dataSize * sizeof(const uint8_t));
@@ -8822,13 +10834,19 @@
 
 void reservedmarshal_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorPoolInlineUniformBlockCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxInlineUniformBlockBindings, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
@@ -8839,10 +10857,12 @@
 #ifdef VK_EXT_sample_locations
 void reservedmarshal_VkSampleLocationEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSampleLocationEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (float*)&forMarshaling->x, sizeof(float));
     *ptr += sizeof(float);
     memcpy(*ptr, (float*)&forMarshaling->y, sizeof(float));
@@ -8851,95 +10871,123 @@
 
 void reservedmarshal_VkSampleLocationsInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSampleLocationsInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkSampleCountFlagBits*)&forMarshaling->sampleLocationsPerPixel, sizeof(VkSampleCountFlagBits));
     *ptr += sizeof(VkSampleCountFlagBits);
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->sampleLocationGridSize), ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->sampleLocationGridSize), ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->sampleLocationsCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->sampleLocationsCount; ++i)
     {
-        reservedmarshal_VkSampleLocationEXT(vkStream, (const VkSampleLocationEXT*)(forMarshaling->pSampleLocations + i), ptr);
+        reservedmarshal_VkSampleLocationEXT(vkStream, rootType, (const VkSampleLocationEXT*)(forMarshaling->pSampleLocations + i), ptr);
     }
 }
 
 void reservedmarshal_VkAttachmentSampleLocationsEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentSampleLocationsEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->attachmentIndex, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    reservedmarshal_VkSampleLocationsInfoEXT(vkStream, (VkSampleLocationsInfoEXT*)(&forMarshaling->sampleLocationsInfo), ptr);
+    reservedmarshal_VkSampleLocationsInfoEXT(vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forMarshaling->sampleLocationsInfo), ptr);
 }
 
 void reservedmarshal_VkSubpassSampleLocationsEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassSampleLocationsEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->subpassIndex, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    reservedmarshal_VkSampleLocationsInfoEXT(vkStream, (VkSampleLocationsInfoEXT*)(&forMarshaling->sampleLocationsInfo), ptr);
+    reservedmarshal_VkSampleLocationsInfoEXT(vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forMarshaling->sampleLocationsInfo), ptr);
 }
 
 void reservedmarshal_VkRenderPassSampleLocationsBeginInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassSampleLocationsBeginInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->attachmentInitialSampleLocationsCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->attachmentInitialSampleLocationsCount; ++i)
     {
-        reservedmarshal_VkAttachmentSampleLocationsEXT(vkStream, (const VkAttachmentSampleLocationsEXT*)(forMarshaling->pAttachmentInitialSampleLocations + i), ptr);
+        reservedmarshal_VkAttachmentSampleLocationsEXT(vkStream, rootType, (const VkAttachmentSampleLocationsEXT*)(forMarshaling->pAttachmentInitialSampleLocations + i), ptr);
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->postSubpassSampleLocationsCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->postSubpassSampleLocationsCount; ++i)
     {
-        reservedmarshal_VkSubpassSampleLocationsEXT(vkStream, (const VkSubpassSampleLocationsEXT*)(forMarshaling->pPostSubpassSampleLocations + i), ptr);
+        reservedmarshal_VkSubpassSampleLocationsEXT(vkStream, rootType, (const VkSubpassSampleLocationsEXT*)(forMarshaling->pPostSubpassSampleLocations + i), ptr);
     }
 }
 
 void reservedmarshal_VkPipelineSampleLocationsStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineSampleLocationsStateCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->sampleLocationsEnable, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    reservedmarshal_VkSampleLocationsInfoEXT(vkStream, (VkSampleLocationsInfoEXT*)(&forMarshaling->sampleLocationsInfo), ptr);
+    reservedmarshal_VkSampleLocationsInfoEXT(vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forMarshaling->sampleLocationsInfo), ptr);
 }
 
 void reservedmarshal_VkPhysicalDeviceSampleLocationsPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSampleLocationsPropertiesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkSampleCountFlags*)&forMarshaling->sampleLocationSampleCounts, sizeof(VkSampleCountFlags));
     *ptr += sizeof(VkSampleCountFlags);
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->maxSampleLocationGridSize), ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->maxSampleLocationGridSize), ptr);
     memcpy(*ptr, (float*)forMarshaling->sampleLocationCoordinateRange, 2 * sizeof(float));
     *ptr += 2 * sizeof(float);
     memcpy(*ptr, (uint32_t*)&forMarshaling->sampleLocationSubPixelBits, sizeof(uint32_t));
@@ -8950,40 +10998,58 @@
 
 void reservedmarshal_VkMultisamplePropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMultisamplePropertiesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->maxSampleLocationGridSize), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->maxSampleLocationGridSize), ptr);
 }
 
 #endif
 #ifdef VK_EXT_blend_operation_advanced
 void reservedmarshal_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->advancedBlendCoherentOperations, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->advancedBlendMaxColorAttachments, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (VkBool32*)&forMarshaling->advancedBlendIndependentBlend, sizeof(VkBool32));
@@ -9000,13 +11066,19 @@
 
 void reservedmarshal_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineColorBlendAdvancedStateCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->srcPremultiplied, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->dstPremultiplied, sizeof(VkBool32));
@@ -9019,13 +11091,19 @@
 #ifdef VK_NV_fragment_coverage_to_color
 void reservedmarshal_VkPipelineCoverageToColorStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCoverageToColorStateCreateInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineCoverageToColorStateCreateFlagsNV*)&forMarshaling->flags, sizeof(VkPipelineCoverageToColorStateCreateFlagsNV));
     *ptr += sizeof(VkPipelineCoverageToColorStateCreateFlagsNV);
     memcpy(*ptr, (VkBool32*)&forMarshaling->coverageToColorEnable, sizeof(VkBool32));
@@ -9038,13 +11116,19 @@
 #ifdef VK_NV_framebuffer_mixed_samples
 void reservedmarshal_VkPipelineCoverageModulationStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCoverageModulationStateCreateInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineCoverageModulationStateCreateFlagsNV*)&forMarshaling->flags, sizeof(VkPipelineCoverageModulationStateCreateFlagsNV));
     *ptr += sizeof(VkPipelineCoverageModulationStateCreateFlagsNV);
     memcpy(*ptr, (VkCoverageModulationModeNV*)&forMarshaling->coverageModulationMode, sizeof(VkCoverageModulationModeNV));
@@ -9071,13 +11155,19 @@
 #ifdef VK_NV_shader_sm_builtins
 void reservedmarshal_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->shaderSMCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->shaderWarpsPerSM, sizeof(uint32_t));
@@ -9086,13 +11176,19 @@
 
 void reservedmarshal_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->shaderSMBuiltins, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -9103,10 +11199,12 @@
 #ifdef VK_EXT_image_drm_format_modifier
 void reservedmarshal_VkDrmFormatModifierPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDrmFormatModifierPropertiesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint64_t*)&forMarshaling->drmFormatModifier, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->drmFormatModifierPlaneCount, sizeof(uint32_t));
@@ -9117,13 +11215,19 @@
 
 void reservedmarshal_VkDrmFormatModifierPropertiesListEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDrmFormatModifierPropertiesListEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->drmFormatModifierCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     // WARNING PTR CHECK
@@ -9135,20 +11239,26 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->drmFormatModifierCount; ++i)
         {
-            reservedmarshal_VkDrmFormatModifierPropertiesEXT(vkStream, (VkDrmFormatModifierPropertiesEXT*)(forMarshaling->pDrmFormatModifierProperties + i), ptr);
+            reservedmarshal_VkDrmFormatModifierPropertiesEXT(vkStream, rootType, (VkDrmFormatModifierPropertiesEXT*)(forMarshaling->pDrmFormatModifierProperties + i), ptr);
         }
     }
 }
 
 void reservedmarshal_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageDrmFormatModifierInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint64_t*)&forMarshaling->drmFormatModifier, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
     memcpy(*ptr, (VkSharingMode*)&forMarshaling->sharingMode, sizeof(VkSharingMode));
@@ -9169,13 +11279,19 @@
 
 void reservedmarshal_VkImageDrmFormatModifierListCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageDrmFormatModifierListCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->drmFormatModifierCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (const uint64_t*)forMarshaling->pDrmFormatModifiers, forMarshaling->drmFormatModifierCount * sizeof(const uint64_t));
@@ -9184,32 +11300,44 @@
 
 void reservedmarshal_VkImageDrmFormatModifierExplicitCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageDrmFormatModifierExplicitCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint64_t*)&forMarshaling->drmFormatModifier, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->drmFormatModifierPlaneCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->drmFormatModifierPlaneCount; ++i)
     {
-        reservedmarshal_VkSubresourceLayout(vkStream, (const VkSubresourceLayout*)(forMarshaling->pPlaneLayouts + i), ptr);
+        reservedmarshal_VkSubresourceLayout(vkStream, rootType, (const VkSubresourceLayout*)(forMarshaling->pPlaneLayouts + i), ptr);
     }
 }
 
 void reservedmarshal_VkImageDrmFormatModifierPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageDrmFormatModifierPropertiesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint64_t*)&forMarshaling->drmFormatModifier, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
 }
@@ -9218,13 +11346,19 @@
 #ifdef VK_EXT_validation_cache
 void reservedmarshal_VkValidationCacheCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkValidationCacheCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkValidationCacheCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkValidationCacheCreateFlagsEXT));
     *ptr += sizeof(VkValidationCacheCreateFlagsEXT);
     uint64_t cgen_var_0 = (uint64_t)forMarshaling->initialDataSize;
@@ -9237,13 +11371,19 @@
 
 void reservedmarshal_VkShaderModuleValidationCacheCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkShaderModuleValidationCacheCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkValidationCacheEXT((*&forMarshaling->validationCache));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -9258,10 +11398,12 @@
 #ifdef VK_NV_shading_rate_image
 void reservedmarshal_VkShadingRatePaletteNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkShadingRatePaletteNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->shadingRatePaletteEntryCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (const VkShadingRatePaletteEntryNV*)forMarshaling->pShadingRatePaletteEntries, forMarshaling->shadingRatePaletteEntryCount * sizeof(const VkShadingRatePaletteEntryNV));
@@ -9270,13 +11412,19 @@
 
 void reservedmarshal_VkPipelineViewportShadingRateImageStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineViewportShadingRateImageStateCreateInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->shadingRateImageEnable, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (uint32_t*)&forMarshaling->viewportCount, sizeof(uint32_t));
@@ -9290,20 +11438,26 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->viewportCount; ++i)
         {
-            reservedmarshal_VkShadingRatePaletteNV(vkStream, (const VkShadingRatePaletteNV*)(forMarshaling->pShadingRatePalettes + i), ptr);
+            reservedmarshal_VkShadingRatePaletteNV(vkStream, rootType, (const VkShadingRatePaletteNV*)(forMarshaling->pShadingRatePalettes + i), ptr);
         }
     }
 }
 
 void reservedmarshal_VkPhysicalDeviceShadingRateImageFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShadingRateImageFeaturesNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->shadingRateImage, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->shadingRateCoarseSampleOrder, sizeof(VkBool32));
@@ -9312,14 +11466,20 @@
 
 void reservedmarshal_VkPhysicalDeviceShadingRateImagePropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShadingRateImagePropertiesNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->shadingRateTexelSize), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->shadingRateTexelSize), ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->shadingRatePaletteSize, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->shadingRateMaxCoarseSamples, sizeof(uint32_t));
@@ -9328,10 +11488,12 @@
 
 void reservedmarshal_VkCoarseSampleLocationNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCoarseSampleLocationNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->pixelX, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->pixelY, sizeof(uint32_t));
@@ -9342,10 +11504,12 @@
 
 void reservedmarshal_VkCoarseSampleOrderCustomNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCoarseSampleOrderCustomNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkShadingRatePaletteEntryNV*)&forMarshaling->shadingRate, sizeof(VkShadingRatePaletteEntryNV));
     *ptr += sizeof(VkShadingRatePaletteEntryNV);
     memcpy(*ptr, (uint32_t*)&forMarshaling->sampleCount, sizeof(uint32_t));
@@ -9354,26 +11518,32 @@
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->sampleLocationCount; ++i)
     {
-        reservedmarshal_VkCoarseSampleLocationNV(vkStream, (const VkCoarseSampleLocationNV*)(forMarshaling->pSampleLocations + i), ptr);
+        reservedmarshal_VkCoarseSampleLocationNV(vkStream, rootType, (const VkCoarseSampleLocationNV*)(forMarshaling->pSampleLocations + i), ptr);
     }
 }
 
 void reservedmarshal_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkCoarseSampleOrderTypeNV*)&forMarshaling->sampleOrderType, sizeof(VkCoarseSampleOrderTypeNV));
     *ptr += sizeof(VkCoarseSampleOrderTypeNV);
     memcpy(*ptr, (uint32_t*)&forMarshaling->customSampleOrderCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->customSampleOrderCount; ++i)
     {
-        reservedmarshal_VkCoarseSampleOrderCustomNV(vkStream, (const VkCoarseSampleOrderCustomNV*)(forMarshaling->pCustomSampleOrders + i), ptr);
+        reservedmarshal_VkCoarseSampleOrderCustomNV(vkStream, rootType, (const VkCoarseSampleOrderCustomNV*)(forMarshaling->pCustomSampleOrders + i), ptr);
     }
 }
 
@@ -9381,13 +11551,19 @@
 #ifdef VK_NV_ray_tracing
 void reservedmarshal_VkRayTracingShaderGroupCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRayTracingShaderGroupCreateInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkRayTracingShaderGroupTypeKHR*)&forMarshaling->type, sizeof(VkRayTracingShaderGroupTypeKHR));
     *ptr += sizeof(VkRayTracingShaderGroupTypeKHR);
     memcpy(*ptr, (uint32_t*)&forMarshaling->generalShader, sizeof(uint32_t));
@@ -9402,26 +11578,32 @@
 
 void reservedmarshal_VkRayTracingPipelineCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRayTracingPipelineCreateInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineCreateFlags));
     *ptr += sizeof(VkPipelineCreateFlags);
     memcpy(*ptr, (uint32_t*)&forMarshaling->stageCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->stageCount; ++i)
     {
-        reservedmarshal_VkPipelineShaderStageCreateInfo(vkStream, (const VkPipelineShaderStageCreateInfo*)(forMarshaling->pStages + i), ptr);
+        reservedmarshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (const VkPipelineShaderStageCreateInfo*)(forMarshaling->pStages + i), ptr);
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->groupCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->groupCount; ++i)
     {
-        reservedmarshal_VkRayTracingShaderGroupCreateInfoNV(vkStream, (const VkRayTracingShaderGroupCreateInfoNV*)(forMarshaling->pGroups + i), ptr);
+        reservedmarshal_VkRayTracingShaderGroupCreateInfoNV(vkStream, rootType, (const VkRayTracingShaderGroupCreateInfoNV*)(forMarshaling->pGroups + i), ptr);
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxRecursionDepth, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -9439,13 +11621,19 @@
 
 void reservedmarshal_VkGeometryTrianglesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGeometryTrianglesNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkBuffer((*&forMarshaling->vertexData));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -9478,13 +11666,19 @@
 
 void reservedmarshal_VkGeometryAABBNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGeometryAABBNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkBuffer((*&forMarshaling->aabbData));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -9499,39 +11693,53 @@
 
 void reservedmarshal_VkGeometryDataNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGeometryDataNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
-    reservedmarshal_VkGeometryTrianglesNV(vkStream, (VkGeometryTrianglesNV*)(&forMarshaling->triangles), ptr);
-    reservedmarshal_VkGeometryAABBNV(vkStream, (VkGeometryAABBNV*)(&forMarshaling->aabbs), ptr);
+    (void)rootType;
+    reservedmarshal_VkGeometryTrianglesNV(vkStream, rootType, (VkGeometryTrianglesNV*)(&forMarshaling->triangles), ptr);
+    reservedmarshal_VkGeometryAABBNV(vkStream, rootType, (VkGeometryAABBNV*)(&forMarshaling->aabbs), ptr);
 }
 
 void reservedmarshal_VkGeometryNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGeometryNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkGeometryTypeKHR*)&forMarshaling->geometryType, sizeof(VkGeometryTypeKHR));
     *ptr += sizeof(VkGeometryTypeKHR);
-    reservedmarshal_VkGeometryDataNV(vkStream, (VkGeometryDataNV*)(&forMarshaling->geometry), ptr);
+    reservedmarshal_VkGeometryDataNV(vkStream, rootType, (VkGeometryDataNV*)(&forMarshaling->geometry), ptr);
     memcpy(*ptr, (VkGeometryFlagsKHR*)&forMarshaling->flags, sizeof(VkGeometryFlagsKHR));
     *ptr += sizeof(VkGeometryFlagsKHR);
 }
 
 void reservedmarshal_VkAccelerationStructureInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkAccelerationStructureTypeNV*)&forMarshaling->type, sizeof(VkAccelerationStructureTypeNV));
     *ptr += sizeof(VkAccelerationStructureTypeNV);
     memcpy(*ptr, (VkBuildAccelerationStructureFlagsNV*)&forMarshaling->flags, sizeof(VkBuildAccelerationStructureFlagsNV));
@@ -9542,33 +11750,45 @@
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->geometryCount; ++i)
     {
-        reservedmarshal_VkGeometryNV(vkStream, (const VkGeometryNV*)(forMarshaling->pGeometries + i), ptr);
+        reservedmarshal_VkGeometryNV(vkStream, rootType, (const VkGeometryNV*)(forMarshaling->pGeometries + i), ptr);
     }
 }
 
 void reservedmarshal_VkAccelerationStructureCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureCreateInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->compactedSize, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
-    reservedmarshal_VkAccelerationStructureInfoNV(vkStream, (VkAccelerationStructureInfoNV*)(&forMarshaling->info), ptr);
+    reservedmarshal_VkAccelerationStructureInfoNV(vkStream, rootType, (VkAccelerationStructureInfoNV*)(&forMarshaling->info), ptr);
 }
 
 void reservedmarshal_VkBindAccelerationStructureMemoryInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindAccelerationStructureMemoryInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkAccelerationStructureNV((*&forMarshaling->accelerationStructure));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -9587,13 +11807,19 @@
 
 void reservedmarshal_VkWriteDescriptorSetAccelerationStructureNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWriteDescriptorSetAccelerationStructureNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->accelerationStructureCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     // WARNING PTR CHECK
@@ -9621,13 +11847,19 @@
 
 void reservedmarshal_VkAccelerationStructureMemoryRequirementsInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureMemoryRequirementsInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkAccelerationStructureMemoryRequirementsTypeNV*)&forMarshaling->type, sizeof(VkAccelerationStructureMemoryRequirementsTypeNV));
     *ptr += sizeof(VkAccelerationStructureMemoryRequirementsTypeNV);
     uint64_t cgen_var_0;
@@ -9638,13 +11870,19 @@
 
 void reservedmarshal_VkPhysicalDeviceRayTracingPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPropertiesNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->shaderGroupHandleSize, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxRecursionDepth, sizeof(uint32_t));
@@ -9665,20 +11903,24 @@
 
 void reservedmarshal_VkTransformMatrixKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkTransformMatrixKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (float*)forMarshaling->matrix, ((3)*(4)) * sizeof(float));
     *ptr += ((3)*(4)) * sizeof(float);
 }
 
 void reservedmarshal_VkAabbPositionsKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAabbPositionsKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (float*)&forMarshaling->minX, sizeof(float));
     *ptr += sizeof(float);
     memcpy(*ptr, (float*)&forMarshaling->minY, sizeof(float));
@@ -9695,6 +11937,7 @@
 
 void reservedmarshal_VkAccelerationStructureInstanceKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureInstanceKHR* forMarshaling,
     uint8_t** ptr)
 {
@@ -9707,7 +11950,7 @@
     
     (void)vkStream;
     const VkAccelerationStructureInstanceKHRWithoutBitFields* forMarshaling_new = (const VkAccelerationStructureInstanceKHRWithoutBitFields*)(forMarshaling);
-    reservedmarshal_VkTransformMatrixKHR(vkStream, (VkTransformMatrixKHR*)(&forMarshaling_new->transform), ptr);
+    reservedmarshal_VkTransformMatrixKHR(vkStream, rootType, (VkTransformMatrixKHR*)(&forMarshaling_new->transform), ptr);
     for (uint32_t i = 0; i < 2; i++) {
         memcpy(*ptr, (uint32_t*)&(forMarshaling_new->dwords[i]), sizeof(uint32_t));
         *ptr += sizeof(uint32_t);
@@ -9721,26 +11964,38 @@
 #ifdef VK_NV_representative_fragment_test
 void reservedmarshal_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->representativeFragmentTest, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRepresentativeFragmentTestStateCreateInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->representativeFragmentTestEnable, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -9749,26 +12004,38 @@
 #ifdef VK_EXT_filter_cubic
 void reservedmarshal_VkPhysicalDeviceImageViewImageFormatInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageViewImageFormatInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkImageViewType*)&forMarshaling->imageViewType, sizeof(VkImageViewType));
     *ptr += sizeof(VkImageViewType);
 }
 
 void reservedmarshal_VkFilterCubicImageViewImageFormatPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFilterCubicImageViewImageFormatPropertiesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->filterCubic, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->filterCubicMinmax, sizeof(VkBool32));
@@ -9781,13 +12048,19 @@
 #ifdef VK_EXT_global_priority
 void reservedmarshal_VkDeviceQueueGlobalPriorityCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceQueueGlobalPriorityCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkQueueGlobalPriorityEXT*)&forMarshaling->globalPriority, sizeof(VkQueueGlobalPriorityEXT));
     *ptr += sizeof(VkQueueGlobalPriorityEXT);
 }
@@ -9796,13 +12069,19 @@
 #ifdef VK_EXT_external_memory_host
 void reservedmarshal_VkImportMemoryHostPointerInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportMemoryHostPointerInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlagBits);
     // WARNING PTR CHECK
@@ -9819,26 +12098,38 @@
 
 void reservedmarshal_VkMemoryHostPointerPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryHostPointerPropertiesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->memoryTypeBits, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedmarshal_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalMemoryHostPropertiesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->minImportedHostPointerAlignment, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
 }
@@ -9849,13 +12140,19 @@
 #ifdef VK_AMD_pipeline_compiler_control
 void reservedmarshal_VkPipelineCompilerControlCreateInfoAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCompilerControlCreateInfoAMD* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineCompilerControlFlagsAMD*)&forMarshaling->compilerControlFlags, sizeof(VkPipelineCompilerControlFlagsAMD));
     *ptr += sizeof(VkPipelineCompilerControlFlagsAMD);
 }
@@ -9864,13 +12161,19 @@
 #ifdef VK_EXT_calibrated_timestamps
 void reservedmarshal_VkCalibratedTimestampInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCalibratedTimestampInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkTimeDomainEXT*)&forMarshaling->timeDomain, sizeof(VkTimeDomainEXT));
     *ptr += sizeof(VkTimeDomainEXT);
 }
@@ -9879,13 +12182,19 @@
 #ifdef VK_AMD_shader_core_properties
 void reservedmarshal_VkPhysicalDeviceShaderCorePropertiesAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderCorePropertiesAMD* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->shaderEngineCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->shaderArraysPerEngineCount, sizeof(uint32_t));
@@ -9920,13 +12229,19 @@
 #ifdef VK_AMD_memory_overallocation_behavior
 void reservedmarshal_VkDeviceMemoryOverallocationCreateInfoAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceMemoryOverallocationCreateInfoAMD* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkMemoryOverallocationBehaviorAMD*)&forMarshaling->overallocationBehavior, sizeof(VkMemoryOverallocationBehaviorAMD));
     *ptr += sizeof(VkMemoryOverallocationBehaviorAMD);
 }
@@ -9935,23 +12250,31 @@
 #ifdef VK_EXT_vertex_attribute_divisor
 void reservedmarshal_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxVertexAttribDivisor, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedmarshal_VkVertexInputBindingDivisorDescriptionEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkVertexInputBindingDivisorDescriptionEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->binding, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->divisor, sizeof(uint32_t));
@@ -9960,30 +12283,42 @@
 
 void reservedmarshal_VkPipelineVertexInputDivisorStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineVertexInputDivisorStateCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->vertexBindingDivisorCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->vertexBindingDivisorCount; ++i)
     {
-        reservedmarshal_VkVertexInputBindingDivisorDescriptionEXT(vkStream, (const VkVertexInputBindingDivisorDescriptionEXT*)(forMarshaling->pVertexBindingDivisors + i), ptr);
+        reservedmarshal_VkVertexInputBindingDivisorDescriptionEXT(vkStream, rootType, (const VkVertexInputBindingDivisorDescriptionEXT*)(forMarshaling->pVertexBindingDivisors + i), ptr);
     }
 }
 
 void reservedmarshal_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->vertexAttributeInstanceRateDivisor, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->vertexAttributeInstanceRateZeroDivisor, sizeof(VkBool32));
@@ -9994,13 +12329,19 @@
 #ifdef VK_GGP_frame_token
 void reservedmarshal_VkPresentFrameTokenGGP(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPresentFrameTokenGGP* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (GgpFrameToken*)&forMarshaling->frameToken, sizeof(GgpFrameToken));
     *ptr += sizeof(GgpFrameToken);
 }
@@ -10009,10 +12350,12 @@
 #ifdef VK_EXT_pipeline_creation_feedback
 void reservedmarshal_VkPipelineCreationFeedbackEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCreationFeedbackEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkPipelineCreationFeedbackFlagsEXT*)&forMarshaling->flags, sizeof(VkPipelineCreationFeedbackFlagsEXT));
     *ptr += sizeof(VkPipelineCreationFeedbackFlagsEXT);
     memcpy(*ptr, (uint64_t*)&forMarshaling->duration, sizeof(uint64_t));
@@ -10021,19 +12364,25 @@
 
 void reservedmarshal_VkPipelineCreationFeedbackCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCreationFeedbackCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkPipelineCreationFeedbackEXT(vkStream, (VkPipelineCreationFeedbackEXT*)(forMarshaling->pPipelineCreationFeedback), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkPipelineCreationFeedbackEXT(vkStream, rootType, (VkPipelineCreationFeedbackEXT*)(forMarshaling->pPipelineCreationFeedback), ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->pipelineStageCreationFeedbackCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->pipelineStageCreationFeedbackCount; ++i)
     {
-        reservedmarshal_VkPipelineCreationFeedbackEXT(vkStream, (VkPipelineCreationFeedbackEXT*)(forMarshaling->pPipelineStageCreationFeedbacks + i), ptr);
+        reservedmarshal_VkPipelineCreationFeedbackEXT(vkStream, rootType, (VkPipelineCreationFeedbackEXT*)(forMarshaling->pPipelineStageCreationFeedbacks + i), ptr);
     }
 }
 
@@ -10043,13 +12392,19 @@
 #ifdef VK_NV_compute_shader_derivatives
 void reservedmarshal_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->computeDerivativeGroupQuads, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->computeDerivativeGroupLinear, sizeof(VkBool32));
@@ -10060,13 +12415,19 @@
 #ifdef VK_NV_mesh_shader
 void reservedmarshal_VkPhysicalDeviceMeshShaderFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMeshShaderFeaturesNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->taskShader, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->meshShader, sizeof(VkBool32));
@@ -10075,13 +12436,19 @@
 
 void reservedmarshal_VkPhysicalDeviceMeshShaderPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMeshShaderPropertiesNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxDrawMeshTasksCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxTaskWorkGroupInvocations, sizeof(uint32_t));
@@ -10112,10 +12479,12 @@
 
 void reservedmarshal_VkDrawMeshTasksIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDrawMeshTasksIndirectCommandNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->taskCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->firstTask, sizeof(uint32_t));
@@ -10126,13 +12495,19 @@
 #ifdef VK_NV_fragment_shader_barycentric
 void reservedmarshal_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->fragmentShaderBarycentric, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -10141,13 +12516,19 @@
 #ifdef VK_NV_shader_image_footprint
 void reservedmarshal_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderImageFootprintFeaturesNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->imageFootprint, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -10156,13 +12537,19 @@
 #ifdef VK_NV_scissor_exclusive
 void reservedmarshal_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineViewportExclusiveScissorStateCreateInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->exclusiveScissorCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     // WARNING PTR CHECK
@@ -10174,20 +12561,26 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->exclusiveScissorCount; ++i)
         {
-            reservedmarshal_VkRect2D(vkStream, (const VkRect2D*)(forMarshaling->pExclusiveScissors + i), ptr);
+            reservedmarshal_VkRect2D(vkStream, rootType, (const VkRect2D*)(forMarshaling->pExclusiveScissors + i), ptr);
         }
     }
 }
 
 void reservedmarshal_VkPhysicalDeviceExclusiveScissorFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExclusiveScissorFeaturesNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->exclusiveScissor, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -10196,26 +12589,38 @@
 #ifdef VK_NV_device_diagnostic_checkpoints
 void reservedmarshal_VkQueueFamilyCheckpointPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkQueueFamilyCheckpointPropertiesNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineStageFlags*)&forMarshaling->checkpointExecutionStageMask, sizeof(VkPipelineStageFlags));
     *ptr += sizeof(VkPipelineStageFlags);
 }
 
 void reservedmarshal_VkCheckpointDataNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCheckpointDataNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineStageFlagBits*)&forMarshaling->stage, sizeof(VkPipelineStageFlagBits));
     *ptr += sizeof(VkPipelineStageFlagBits);
     // WARNING PTR CHECK
@@ -10234,13 +12639,19 @@
 #ifdef VK_INTEL_shader_integer_functions2
 void reservedmarshal_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->shaderIntegerFunctions2, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -10249,34 +12660,44 @@
 #ifdef VK_INTEL_performance_query
 void reservedmarshal_VkPerformanceValueDataINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceValueDataINTEL* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->value32, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedmarshal_VkPerformanceValueINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceValueINTEL* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkPerformanceValueTypeINTEL*)&forMarshaling->type, sizeof(VkPerformanceValueTypeINTEL));
     *ptr += sizeof(VkPerformanceValueTypeINTEL);
-    reservedmarshal_VkPerformanceValueDataINTEL(vkStream, (VkPerformanceValueDataINTEL*)(&forMarshaling->data), ptr);
+    reservedmarshal_VkPerformanceValueDataINTEL(vkStream, rootType, (VkPerformanceValueDataINTEL*)(&forMarshaling->data), ptr);
 }
 
 void reservedmarshal_VkInitializePerformanceApiInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkInitializePerformanceApiInfoINTEL* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pUserData;
     memcpy((*ptr), &cgen_var_0, 8);
@@ -10291,52 +12712,76 @@
 
 void reservedmarshal_VkQueryPoolPerformanceQueryCreateInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkQueryPoolPerformanceQueryCreateInfoINTEL* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkQueryPoolSamplingModeINTEL*)&forMarshaling->performanceCountersSampling, sizeof(VkQueryPoolSamplingModeINTEL));
     *ptr += sizeof(VkQueryPoolSamplingModeINTEL);
 }
 
 void reservedmarshal_VkPerformanceMarkerInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceMarkerInfoINTEL* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint64_t*)&forMarshaling->marker, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
 }
 
 void reservedmarshal_VkPerformanceStreamMarkerInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceStreamMarkerInfoINTEL* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->marker, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedmarshal_VkPerformanceOverrideInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceOverrideInfoINTEL* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPerformanceOverrideTypeINTEL*)&forMarshaling->type, sizeof(VkPerformanceOverrideTypeINTEL));
     *ptr += sizeof(VkPerformanceOverrideTypeINTEL);
     memcpy(*ptr, (VkBool32*)&forMarshaling->enable, sizeof(VkBool32));
@@ -10347,13 +12792,19 @@
 
 void reservedmarshal_VkPerformanceConfigurationAcquireInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceConfigurationAcquireInfoINTEL* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPerformanceConfigurationTypeINTEL*)&forMarshaling->type, sizeof(VkPerformanceConfigurationTypeINTEL));
     *ptr += sizeof(VkPerformanceConfigurationTypeINTEL);
 }
@@ -10362,13 +12813,19 @@
 #ifdef VK_EXT_pci_bus_info
 void reservedmarshal_VkPhysicalDevicePCIBusInfoPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePCIBusInfoPropertiesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->pciDomain, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->pciBus, sizeof(uint32_t));
@@ -10383,26 +12840,38 @@
 #ifdef VK_AMD_display_native_hdr
 void reservedmarshal_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayNativeHdrSurfaceCapabilitiesAMD* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->localDimmingSupport, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkSwapchainDisplayNativeHdrCreateInfoAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSwapchainDisplayNativeHdrCreateInfoAMD* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->localDimmingEnable, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -10411,13 +12880,19 @@
 #ifdef VK_FUCHSIA_imagepipe_surface
 void reservedmarshal_VkImagePipeSurfaceCreateInfoFUCHSIA(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImagePipeSurfaceCreateInfoFUCHSIA* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkImagePipeSurfaceCreateFlagsFUCHSIA*)&forMarshaling->flags, sizeof(VkImagePipeSurfaceCreateFlagsFUCHSIA));
     *ptr += sizeof(VkImagePipeSurfaceCreateFlagsFUCHSIA);
     memcpy(*ptr, (zx_handle_t*)&forMarshaling->imagePipeHandle, sizeof(zx_handle_t));
@@ -10428,13 +12903,19 @@
 #ifdef VK_EXT_metal_surface
 void reservedmarshal_VkMetalSurfaceCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMetalSurfaceCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkMetalSurfaceCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkMetalSurfaceCreateFlagsEXT));
     *ptr += sizeof(VkMetalSurfaceCreateFlagsEXT);
     // WARNING PTR CHECK
@@ -10450,52 +12931,67 @@
 }
 
 #endif
-#ifdef VK_GOOGLE_color_buffer
-void reservedmarshal_VkImportColorBufferGOOGLE(
+#ifdef VK_EXT_fragment_density_map
+void reservedmarshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
     VulkanStreamGuest* vkStream,
-    const VkImportColorBufferGOOGLE* forMarshaling,
+    VkStructureType rootType,
+    const VkPhysicalDeviceFragmentDensityMapFeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    memcpy(*ptr, (uint32_t*)&forMarshaling->colorBuffer, sizeof(uint32_t));
-    *ptr += sizeof(uint32_t);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->fragmentDensityMap, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->fragmentDensityMapDynamic, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->fragmentDensityMapNonSubsampledImages, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
 }
 
-void reservedmarshal_VkImportBufferGOOGLE(
+void reservedmarshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
     VulkanStreamGuest* vkStream,
-    const VkImportBufferGOOGLE* forMarshaling,
+    VkStructureType rootType,
+    const VkPhysicalDeviceFragmentDensityMapPropertiesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    memcpy(*ptr, (uint32_t*)&forMarshaling->buffer, sizeof(uint32_t));
-    *ptr += sizeof(uint32_t);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->minFragmentDensityTexelSize), ptr);
+    reservedmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->maxFragmentDensityTexelSize), ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->fragmentDensityInvocations, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
 }
 
-void reservedmarshal_VkImportPhysicalAddressGOOGLE(
+void reservedmarshal_VkRenderPassFragmentDensityMapCreateInfoEXT(
     VulkanStreamGuest* vkStream,
-    const VkImportPhysicalAddressGOOGLE* forMarshaling,
+    VkStructureType rootType,
+    const VkRenderPassFragmentDensityMapCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    memcpy(*ptr, (uint64_t*)&forMarshaling->physicalAddress, sizeof(uint64_t));
-    *ptr += sizeof(uint64_t);
-    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
-    *ptr += sizeof(VkDeviceSize);
-    memcpy(*ptr, (VkFormat*)&forMarshaling->format, sizeof(VkFormat));
-    *ptr += sizeof(VkFormat);
-    memcpy(*ptr, (VkImageTiling*)&forMarshaling->tiling, sizeof(VkImageTiling));
-    *ptr += sizeof(VkImageTiling);
-    memcpy(*ptr, (uint32_t*)&forMarshaling->tilingParameter, sizeof(uint32_t));
-    *ptr += sizeof(uint32_t);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkAttachmentReference(vkStream, rootType, (VkAttachmentReference*)(&forMarshaling->fragmentDensityMapAttachment), ptr);
 }
 
 #endif
@@ -10508,13 +13004,19 @@
 #ifdef VK_EXT_subgroup_size_control
 void reservedmarshal_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->subgroupSizeControl, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->computeFullSubgroups, sizeof(VkBool32));
@@ -10523,13 +13025,19 @@
 
 void reservedmarshal_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->minSubgroupSize, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxSubgroupSize, sizeof(uint32_t));
@@ -10542,13 +13050,19 @@
 
 void reservedmarshal_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->requiredSubgroupSize, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
@@ -10557,13 +13071,19 @@
 #ifdef VK_AMD_shader_core_properties2
 void reservedmarshal_VkPhysicalDeviceShaderCoreProperties2AMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderCoreProperties2AMD* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkShaderCorePropertiesFlagsAMD*)&forMarshaling->shaderCoreFeatures, sizeof(VkShaderCorePropertiesFlagsAMD));
     *ptr += sizeof(VkShaderCorePropertiesFlagsAMD);
     memcpy(*ptr, (uint32_t*)&forMarshaling->activeComputeUnitCount, sizeof(uint32_t));
@@ -10574,13 +13094,19 @@
 #ifdef VK_AMD_device_coherent_memory
 void reservedmarshal_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCoherentMemoryFeaturesAMD* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->deviceCoherentMemory, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -10589,13 +13115,19 @@
 #ifdef VK_EXT_shader_image_atomic_int64
 void reservedmarshal_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->shaderImageInt64Atomics, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->sparseImageInt64Atomics, sizeof(VkBool32));
@@ -10606,13 +13138,19 @@
 #ifdef VK_EXT_memory_budget
 void reservedmarshal_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryBudgetPropertiesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDeviceSize*)forMarshaling->heapBudget, VK_MAX_MEMORY_HEAPS * sizeof(VkDeviceSize));
     *ptr += VK_MAX_MEMORY_HEAPS * sizeof(VkDeviceSize);
     memcpy(*ptr, (VkDeviceSize*)forMarshaling->heapUsage, VK_MAX_MEMORY_HEAPS * sizeof(VkDeviceSize));
@@ -10623,26 +13161,38 @@
 #ifdef VK_EXT_memory_priority
 void reservedmarshal_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryPriorityFeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->memoryPriority, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkMemoryPriorityAllocateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryPriorityAllocateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (float*)&forMarshaling->priority, sizeof(float));
     *ptr += sizeof(float);
 }
@@ -10651,13 +13201,19 @@
 #ifdef VK_NV_dedicated_allocation_image_aliasing
 void reservedmarshal_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->dedicatedAllocationImageAliasing, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -10666,13 +13222,19 @@
 #ifdef VK_EXT_buffer_device_address
 void reservedmarshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->bufferDeviceAddress, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->bufferDeviceAddressCaptureReplay, sizeof(VkBool32));
@@ -10683,13 +13245,19 @@
 
 void reservedmarshal_VkBufferDeviceAddressCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferDeviceAddressCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDeviceAddress*)&forMarshaling->deviceAddress, sizeof(VkDeviceAddress));
     *ptr += sizeof(VkDeviceAddress);
 }
@@ -10698,13 +13266,19 @@
 #ifdef VK_EXT_tooling_info
 void reservedmarshal_VkPhysicalDeviceToolPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceToolPropertiesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (char*)forMarshaling->name, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char));
     *ptr += VK_MAX_EXTENSION_NAME_SIZE * sizeof(char);
     memcpy(*ptr, (char*)forMarshaling->version, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char));
@@ -10723,13 +13297,19 @@
 #ifdef VK_EXT_validation_features
 void reservedmarshal_VkValidationFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkValidationFeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->enabledValidationFeatureCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (const VkValidationFeatureEnableEXT*)forMarshaling->pEnabledValidationFeatures, forMarshaling->enabledValidationFeatureCount * sizeof(const VkValidationFeatureEnableEXT));
@@ -10744,13 +13324,19 @@
 #ifdef VK_NV_cooperative_matrix
 void reservedmarshal_VkCooperativeMatrixPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCooperativeMatrixPropertiesNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->MSize, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->NSize, sizeof(uint32_t));
@@ -10771,13 +13357,19 @@
 
 void reservedmarshal_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCooperativeMatrixFeaturesNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->cooperativeMatrix, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->cooperativeMatrixRobustBufferAccess, sizeof(VkBool32));
@@ -10786,13 +13378,19 @@
 
 void reservedmarshal_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCooperativeMatrixPropertiesNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkShaderStageFlags*)&forMarshaling->cooperativeMatrixSupportedStages, sizeof(VkShaderStageFlags));
     *ptr += sizeof(VkShaderStageFlags);
 }
@@ -10801,26 +13399,38 @@
 #ifdef VK_NV_coverage_reduction_mode
 void reservedmarshal_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCoverageReductionModeFeaturesNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->coverageReductionMode, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkPipelineCoverageReductionStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCoverageReductionStateCreateInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineCoverageReductionStateCreateFlagsNV*)&forMarshaling->flags, sizeof(VkPipelineCoverageReductionStateCreateFlagsNV));
     *ptr += sizeof(VkPipelineCoverageReductionStateCreateFlagsNV);
     memcpy(*ptr, (VkCoverageReductionModeNV*)&forMarshaling->coverageReductionMode, sizeof(VkCoverageReductionModeNV));
@@ -10829,13 +13439,19 @@
 
 void reservedmarshal_VkFramebufferMixedSamplesCombinationNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFramebufferMixedSamplesCombinationNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkCoverageReductionModeNV*)&forMarshaling->coverageReductionMode, sizeof(VkCoverageReductionModeNV));
     *ptr += sizeof(VkCoverageReductionModeNV);
     memcpy(*ptr, (VkSampleCountFlagBits*)&forMarshaling->rasterizationSamples, sizeof(VkSampleCountFlagBits));
@@ -10850,13 +13466,19 @@
 #ifdef VK_EXT_fragment_shader_interlock
 void reservedmarshal_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->fragmentShaderSampleInterlock, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->fragmentShaderPixelInterlock, sizeof(VkBool32));
@@ -10869,13 +13491,19 @@
 #ifdef VK_EXT_ycbcr_image_arrays
 void reservedmarshal_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->ycbcrImageArrays, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -10884,39 +13512,57 @@
 #ifdef VK_EXT_full_screen_exclusive
 void reservedmarshal_VkSurfaceFullScreenExclusiveInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceFullScreenExclusiveInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkFullScreenExclusiveEXT*)&forMarshaling->fullScreenExclusive, sizeof(VkFullScreenExclusiveEXT));
     *ptr += sizeof(VkFullScreenExclusiveEXT);
 }
 
 void reservedmarshal_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceCapabilitiesFullScreenExclusiveEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->fullScreenExclusiveSupported, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkSurfaceFullScreenExclusiveWin32InfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceFullScreenExclusiveWin32InfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (HMONITOR*)&forMarshaling->hmonitor, sizeof(HMONITOR));
     *ptr += sizeof(HMONITOR);
 }
@@ -10925,13 +13571,19 @@
 #ifdef VK_EXT_headless_surface
 void reservedmarshal_VkHeadlessSurfaceCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkHeadlessSurfaceCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkHeadlessSurfaceCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkHeadlessSurfaceCreateFlagsEXT));
     *ptr += sizeof(VkHeadlessSurfaceCreateFlagsEXT);
 }
@@ -10940,13 +13592,19 @@
 #ifdef VK_EXT_line_rasterization
 void reservedmarshal_VkPhysicalDeviceLineRasterizationFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceLineRasterizationFeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->rectangularLines, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->bresenhamLines, sizeof(VkBool32));
@@ -10963,26 +13621,38 @@
 
 void reservedmarshal_VkPhysicalDeviceLineRasterizationPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceLineRasterizationPropertiesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->lineSubPixelPrecisionBits, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedmarshal_VkPipelineRasterizationLineStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRasterizationLineStateCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkLineRasterizationModeEXT*)&forMarshaling->lineRasterizationMode, sizeof(VkLineRasterizationModeEXT));
     *ptr += sizeof(VkLineRasterizationModeEXT);
     memcpy(*ptr, (VkBool32*)&forMarshaling->stippledLineEnable, sizeof(VkBool32));
@@ -10997,13 +13667,19 @@
 #ifdef VK_EXT_shader_atomic_float
 void reservedmarshal_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->shaderBufferFloat32Atomics, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->shaderBufferFloat32AtomicAdd, sizeof(VkBool32));
@@ -11036,13 +13712,19 @@
 #ifdef VK_EXT_index_type_uint8
 void reservedmarshal_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceIndexTypeUint8FeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->indexTypeUint8, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -11051,13 +13733,19 @@
 #ifdef VK_EXT_extended_dynamic_state
 void reservedmarshal_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->extendedDynamicState, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -11066,13 +13754,19 @@
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 void reservedmarshal_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->shaderDemoteToHelperInvocation, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -11081,13 +13775,19 @@
 #ifdef VK_NV_device_generated_commands
 void reservedmarshal_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxGraphicsShaderGroupCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxIndirectSequenceCount, sizeof(uint32_t));
@@ -11110,31 +13810,43 @@
 
 void reservedmarshal_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->deviceGeneratedCommands, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkGraphicsShaderGroupCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGraphicsShaderGroupCreateInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->stageCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->stageCount; ++i)
     {
-        reservedmarshal_VkPipelineShaderStageCreateInfo(vkStream, (const VkPipelineShaderStageCreateInfo*)(forMarshaling->pStages + i), ptr);
+        reservedmarshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (const VkPipelineShaderStageCreateInfo*)(forMarshaling->pStages + i), ptr);
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pVertexInputState;
@@ -11143,7 +13855,7 @@
     *ptr += 8;
     if (forMarshaling->pVertexInputState)
     {
-        reservedmarshal_VkPipelineVertexInputStateCreateInfo(vkStream, (const VkPipelineVertexInputStateCreateInfo*)(forMarshaling->pVertexInputState), ptr);
+        reservedmarshal_VkPipelineVertexInputStateCreateInfo(vkStream, rootType, (const VkPipelineVertexInputStateCreateInfo*)(forMarshaling->pVertexInputState), ptr);
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pTessellationState;
@@ -11152,24 +13864,30 @@
     *ptr += 8;
     if (forMarshaling->pTessellationState)
     {
-        reservedmarshal_VkPipelineTessellationStateCreateInfo(vkStream, (const VkPipelineTessellationStateCreateInfo*)(forMarshaling->pTessellationState), ptr);
+        reservedmarshal_VkPipelineTessellationStateCreateInfo(vkStream, rootType, (const VkPipelineTessellationStateCreateInfo*)(forMarshaling->pTessellationState), ptr);
     }
 }
 
 void reservedmarshal_VkGraphicsPipelineShaderGroupsCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGraphicsPipelineShaderGroupsCreateInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->groupCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->groupCount; ++i)
     {
-        reservedmarshal_VkGraphicsShaderGroupCreateInfoNV(vkStream, (const VkGraphicsShaderGroupCreateInfoNV*)(forMarshaling->pGroups + i), ptr);
+        reservedmarshal_VkGraphicsShaderGroupCreateInfoNV(vkStream, rootType, (const VkGraphicsShaderGroupCreateInfoNV*)(forMarshaling->pGroups + i), ptr);
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->pipelineCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -11190,20 +13908,24 @@
 
 void reservedmarshal_VkBindShaderGroupIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindShaderGroupIndirectCommandNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->groupIndex, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedmarshal_VkBindIndexBufferIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindIndexBufferIndirectCommandNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkDeviceAddress*)&forMarshaling->bufferAddress, sizeof(VkDeviceAddress));
     *ptr += sizeof(VkDeviceAddress);
     memcpy(*ptr, (uint32_t*)&forMarshaling->size, sizeof(uint32_t));
@@ -11214,10 +13936,12 @@
 
 void reservedmarshal_VkBindVertexBufferIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindVertexBufferIndirectCommandNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkDeviceAddress*)&forMarshaling->bufferAddress, sizeof(VkDeviceAddress));
     *ptr += sizeof(VkDeviceAddress);
     memcpy(*ptr, (uint32_t*)&forMarshaling->size, sizeof(uint32_t));
@@ -11228,20 +13952,24 @@
 
 void reservedmarshal_VkSetStateFlagsIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSetStateFlagsIndirectCommandNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->data, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedmarshal_VkIndirectCommandsStreamNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkIndirectCommandsStreamNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkBuffer((*&forMarshaling->buffer));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -11252,13 +13980,19 @@
 
 void reservedmarshal_VkIndirectCommandsLayoutTokenNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkIndirectCommandsLayoutTokenNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkIndirectCommandsTokenTypeNV*)&forMarshaling->tokenType, sizeof(VkIndirectCommandsTokenTypeNV));
     *ptr += sizeof(VkIndirectCommandsTokenTypeNV);
     memcpy(*ptr, (uint32_t*)&forMarshaling->stream, sizeof(uint32_t));
@@ -11291,13 +14025,19 @@
 
 void reservedmarshal_VkIndirectCommandsLayoutCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkIndirectCommandsLayoutCreateInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkIndirectCommandsLayoutUsageFlagsNV*)&forMarshaling->flags, sizeof(VkIndirectCommandsLayoutUsageFlagsNV));
     *ptr += sizeof(VkIndirectCommandsLayoutUsageFlagsNV);
     memcpy(*ptr, (VkPipelineBindPoint*)&forMarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
@@ -11306,7 +14046,7 @@
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->tokenCount; ++i)
     {
-        reservedmarshal_VkIndirectCommandsLayoutTokenNV(vkStream, (const VkIndirectCommandsLayoutTokenNV*)(forMarshaling->pTokens + i), ptr);
+        reservedmarshal_VkIndirectCommandsLayoutTokenNV(vkStream, rootType, (const VkIndirectCommandsLayoutTokenNV*)(forMarshaling->pTokens + i), ptr);
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->streamCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -11316,13 +14056,19 @@
 
 void reservedmarshal_VkGeneratedCommandsInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGeneratedCommandsInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineBindPoint*)&forMarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
     *ptr += sizeof(VkPipelineBindPoint);
     uint64_t cgen_var_0;
@@ -11337,7 +14083,7 @@
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->streamCount; ++i)
     {
-        reservedmarshal_VkIndirectCommandsStreamNV(vkStream, (const VkIndirectCommandsStreamNV*)(forMarshaling->pStreams + i), ptr);
+        reservedmarshal_VkIndirectCommandsStreamNV(vkStream, rootType, (const VkIndirectCommandsStreamNV*)(forMarshaling->pStreams + i), ptr);
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->sequencesCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -11365,13 +14111,19 @@
 
 void reservedmarshal_VkGeneratedCommandsMemoryRequirementsInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGeneratedCommandsMemoryRequirementsInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineBindPoint*)&forMarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
     *ptr += sizeof(VkPipelineBindPoint);
     uint64_t cgen_var_0;
@@ -11390,26 +14142,38 @@
 #ifdef VK_EXT_texel_buffer_alignment
 void reservedmarshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->texelBufferAlignment, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->storageTexelBufferOffsetAlignmentBytes, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy(*ptr, (VkBool32*)&forMarshaling->storageTexelBufferOffsetSingleTexelAlignment, sizeof(VkBool32));
@@ -11424,55 +14188,79 @@
 #ifdef VK_QCOM_render_pass_transform
 void reservedmarshal_VkRenderPassTransformBeginInfoQCOM(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassTransformBeginInfoQCOM* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkSurfaceTransformFlagBitsKHR*)&forMarshaling->transform, sizeof(VkSurfaceTransformFlagBitsKHR));
     *ptr += sizeof(VkSurfaceTransformFlagBitsKHR);
 }
 
 void reservedmarshal_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCommandBufferInheritanceRenderPassTransformInfoQCOM* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkSurfaceTransformFlagBitsKHR*)&forMarshaling->transform, sizeof(VkSurfaceTransformFlagBitsKHR));
     *ptr += sizeof(VkSurfaceTransformFlagBitsKHR);
-    reservedmarshal_VkRect2D(vkStream, (VkRect2D*)(&forMarshaling->renderArea), ptr);
+    reservedmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(&forMarshaling->renderArea), ptr);
 }
 
 #endif
 #ifdef VK_EXT_device_memory_report
 void reservedmarshal_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->deviceMemoryReport, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkDeviceMemoryReportCallbackDataEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceMemoryReportCallbackDataEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDeviceMemoryReportFlagsEXT*)&forMarshaling->flags, sizeof(VkDeviceMemoryReportFlagsEXT));
     *ptr += sizeof(VkDeviceMemoryReportFlagsEXT);
     memcpy(*ptr, (VkDeviceMemoryReportEventTypeEXT*)&forMarshaling->type, sizeof(VkDeviceMemoryReportEventTypeEXT));
@@ -11491,13 +14279,19 @@
 
 void reservedmarshal_VkDeviceDeviceMemoryReportCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceDeviceMemoryReportCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDeviceMemoryReportFlagsEXT*)&forMarshaling->flags, sizeof(VkDeviceMemoryReportFlagsEXT));
     *ptr += sizeof(VkDeviceMemoryReportFlagsEXT);
     uint64_t cgen_var_0 = (uint64_t)forMarshaling->pfnUserCallback;
@@ -11512,13 +14306,19 @@
 #ifdef VK_EXT_robustness2
 void reservedmarshal_VkPhysicalDeviceRobustness2FeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRobustness2FeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->robustBufferAccess2, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->robustImageAccess2, sizeof(VkBool32));
@@ -11529,13 +14329,19 @@
 
 void reservedmarshal_VkPhysicalDeviceRobustness2PropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRobustness2PropertiesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->robustStorageBufferAccessSizeAlignment, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->robustUniformBufferAccessSizeAlignment, sizeof(VkDeviceSize));
@@ -11546,40 +14352,58 @@
 #ifdef VK_EXT_custom_border_color
 void reservedmarshal_VkSamplerCustomBorderColorCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSamplerCustomBorderColorCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkClearColorValue(vkStream, (VkClearColorValue*)(&forMarshaling->customBorderColor), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkClearColorValue(vkStream, rootType, (VkClearColorValue*)(&forMarshaling->customBorderColor), ptr);
     memcpy(*ptr, (VkFormat*)&forMarshaling->format, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
 }
 
 void reservedmarshal_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCustomBorderColorPropertiesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxCustomBorderColorSamplers, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedmarshal_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCustomBorderColorFeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->customBorderColors, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->customBorderColorWithoutFormat, sizeof(VkBool32));
@@ -11592,39 +14416,57 @@
 #ifdef VK_EXT_private_data
 void reservedmarshal_VkPhysicalDevicePrivateDataFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePrivateDataFeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->privateData, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkDevicePrivateDataCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDevicePrivateDataCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->privateDataSlotRequestCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedmarshal_VkPrivateDataSlotCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPrivateDataSlotCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPrivateDataSlotCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkPrivateDataSlotCreateFlagsEXT));
     *ptr += sizeof(VkPrivateDataSlotCreateFlagsEXT);
 }
@@ -11633,13 +14475,19 @@
 #ifdef VK_EXT_pipeline_creation_cache_control
 void reservedmarshal_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->pipelineCreationCacheControl, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -11648,26 +14496,38 @@
 #ifdef VK_NV_device_diagnostics_config
 void reservedmarshal_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDiagnosticsConfigFeaturesNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->diagnosticsConfig, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkDeviceDiagnosticsConfigCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceDiagnosticsConfigCreateInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDeviceDiagnosticsConfigFlagsNV*)&forMarshaling->flags, sizeof(VkDeviceDiagnosticsConfigFlagsNV));
     *ptr += sizeof(VkDeviceDiagnosticsConfigFlagsNV);
 }
@@ -11678,13 +14538,19 @@
 #ifdef VK_NV_fragment_shading_rate_enums
 void reservedmarshal_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->fragmentShadingRateEnums, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->supersampleFragmentShadingRates, sizeof(VkBool32));
@@ -11695,26 +14561,38 @@
 
 void reservedmarshal_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkSampleCountFlagBits*)&forMarshaling->maxFragmentShadingRateInvocationCount, sizeof(VkSampleCountFlagBits));
     *ptr += sizeof(VkSampleCountFlagBits);
 }
 
 void reservedmarshal_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineFragmentShadingRateEnumStateCreateInfoNV* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkFragmentShadingRateTypeNV*)&forMarshaling->shadingRateType, sizeof(VkFragmentShadingRateTypeNV));
     *ptr += sizeof(VkFragmentShadingRateTypeNV);
     memcpy(*ptr, (VkFragmentShadingRateNV*)&forMarshaling->shadingRate, sizeof(VkFragmentShadingRateNV));
@@ -11727,26 +14605,38 @@
 #ifdef VK_EXT_fragment_density_map2
 void reservedmarshal_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->fragmentDensityMapDeferred, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedmarshal_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->subsampledLoads, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->subsampledCoarseReconstructionEarlyAccess, sizeof(VkBool32));
@@ -11761,13 +14651,19 @@
 #ifdef VK_QCOM_rotated_copy_commands
 void reservedmarshal_VkCopyCommandTransformInfoQCOM(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyCommandTransformInfoQCOM* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkSurfaceTransformFlagBitsKHR*)&forMarshaling->transform, sizeof(VkSurfaceTransformFlagBitsKHR));
     *ptr += sizeof(VkSurfaceTransformFlagBitsKHR);
 }
@@ -11776,13 +14672,19 @@
 #ifdef VK_EXT_image_robustness
 void reservedmarshal_VkPhysicalDeviceImageRobustnessFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageRobustnessFeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->robustImageAccess, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -11791,13 +14693,19 @@
 #ifdef VK_EXT_4444_formats
 void reservedmarshal_VkPhysicalDevice4444FormatsFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevice4444FormatsFeaturesEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->formatA4R4G4B4, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->formatA4B4G4R4, sizeof(VkBool32));
@@ -11808,13 +14716,19 @@
 #ifdef VK_EXT_directfb_surface
 void reservedmarshal_VkDirectFBSurfaceCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDirectFBSurfaceCreateInfoEXT* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDirectFBSurfaceCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkDirectFBSurfaceCreateFlagsEXT));
     *ptr += sizeof(VkDirectFBSurfaceCreateFlagsEXT);
     // WARNING PTR CHECK
@@ -11841,34 +14755,105 @@
 
 #endif
 #ifdef VK_GOOGLE_gfxstream
+void reservedmarshal_VkImportColorBufferGOOGLE(
+    VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
+    const VkImportColorBufferGOOGLE* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    (void)rootType;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->colorBuffer, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkImportBufferGOOGLE(
+    VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
+    const VkImportBufferGOOGLE* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    (void)rootType;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->buffer, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkImportPhysicalAddressGOOGLE(
+    VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
+    const VkImportPhysicalAddressGOOGLE* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    (void)rootType;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint64_t*)&forMarshaling->physicalAddress, sizeof(uint64_t));
+    *ptr += sizeof(uint64_t);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (VkFormat*)&forMarshaling->format, sizeof(VkFormat));
+    *ptr += sizeof(VkFormat);
+    memcpy(*ptr, (VkImageTiling*)&forMarshaling->tiling, sizeof(VkImageTiling));
+    *ptr += sizeof(VkImageTiling);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->tilingParameter, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
 #endif
 #ifdef VK_KHR_acceleration_structure
 void reservedmarshal_VkDeviceOrHostAddressKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceOrHostAddressKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkDeviceAddress*)&forMarshaling->deviceAddress, sizeof(VkDeviceAddress));
     *ptr += sizeof(VkDeviceAddress);
 }
 
 void reservedmarshal_VkDeviceOrHostAddressConstKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceOrHostAddressConstKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkDeviceAddress*)&forMarshaling->deviceAddress, sizeof(VkDeviceAddress));
     *ptr += sizeof(VkDeviceAddress);
 }
 
 void reservedmarshal_VkAccelerationStructureBuildRangeInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureBuildRangeInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->primitiveCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->primitiveOffset, sizeof(uint32_t));
@@ -11881,88 +14866,120 @@
 
 void reservedmarshal_VkAccelerationStructureGeometryTrianglesDataKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryTrianglesDataKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkFormat*)&forMarshaling->vertexFormat, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
-    reservedmarshal_VkDeviceOrHostAddressConstKHR(vkStream, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->vertexData), ptr);
+    reservedmarshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->vertexData), ptr);
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->vertexStride, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxVertex, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (VkIndexType*)&forMarshaling->indexType, sizeof(VkIndexType));
     *ptr += sizeof(VkIndexType);
-    reservedmarshal_VkDeviceOrHostAddressConstKHR(vkStream, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->indexData), ptr);
-    reservedmarshal_VkDeviceOrHostAddressConstKHR(vkStream, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->transformData), ptr);
+    reservedmarshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->indexData), ptr);
+    reservedmarshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->transformData), ptr);
 }
 
 void reservedmarshal_VkAccelerationStructureGeometryAabbsDataKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryAabbsDataKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkDeviceOrHostAddressConstKHR(vkStream, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->data), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->data), ptr);
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->stride, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
 }
 
 void reservedmarshal_VkAccelerationStructureGeometryInstancesDataKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryInstancesDataKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->arrayOfPointers, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    reservedmarshal_VkDeviceOrHostAddressConstKHR(vkStream, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->data), ptr);
+    reservedmarshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->data), ptr);
 }
 
 void reservedmarshal_VkAccelerationStructureGeometryDataKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryDataKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
-    reservedmarshal_VkAccelerationStructureGeometryTrianglesDataKHR(vkStream, (VkAccelerationStructureGeometryTrianglesDataKHR*)(&forMarshaling->triangles), ptr);
+    (void)rootType;
+    reservedmarshal_VkAccelerationStructureGeometryTrianglesDataKHR(vkStream, rootType, (VkAccelerationStructureGeometryTrianglesDataKHR*)(&forMarshaling->triangles), ptr);
 }
 
 void reservedmarshal_VkAccelerationStructureGeometryKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkGeometryTypeKHR*)&forMarshaling->geometryType, sizeof(VkGeometryTypeKHR));
     *ptr += sizeof(VkGeometryTypeKHR);
-    reservedmarshal_VkAccelerationStructureGeometryDataKHR(vkStream, (VkAccelerationStructureGeometryDataKHR*)(&forMarshaling->geometry), ptr);
+    reservedmarshal_VkAccelerationStructureGeometryDataKHR(vkStream, rootType, (VkAccelerationStructureGeometryDataKHR*)(&forMarshaling->geometry), ptr);
     memcpy(*ptr, (VkGeometryFlagsKHR*)&forMarshaling->flags, sizeof(VkGeometryFlagsKHR));
     *ptr += sizeof(VkGeometryFlagsKHR);
 }
 
 void reservedmarshal_VkAccelerationStructureBuildGeometryInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureBuildGeometryInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkAccelerationStructureTypeKHR*)&forMarshaling->type, sizeof(VkAccelerationStructureTypeKHR));
     *ptr += sizeof(VkAccelerationStructureTypeKHR);
     memcpy(*ptr, (VkBuildAccelerationStructureFlagsKHR*)&forMarshaling->flags, sizeof(VkBuildAccelerationStructureFlagsKHR));
@@ -11988,21 +15005,27 @@
     {
         for (uint32_t i = 0; i < (uint32_t)forMarshaling->geometryCount; ++i)
         {
-            reservedmarshal_VkAccelerationStructureGeometryKHR(vkStream, (const VkAccelerationStructureGeometryKHR*)(forMarshaling->pGeometries + i), ptr);
+            reservedmarshal_VkAccelerationStructureGeometryKHR(vkStream, rootType, (const VkAccelerationStructureGeometryKHR*)(forMarshaling->pGeometries + i), ptr);
         }
     }
-    reservedmarshal_VkDeviceOrHostAddressKHR(vkStream, (VkDeviceOrHostAddressKHR*)(&forMarshaling->scratchData), ptr);
+    reservedmarshal_VkDeviceOrHostAddressKHR(vkStream, rootType, (VkDeviceOrHostAddressKHR*)(&forMarshaling->scratchData), ptr);
 }
 
 void reservedmarshal_VkAccelerationStructureCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureCreateInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkAccelerationStructureCreateFlagsKHR*)&forMarshaling->createFlags, sizeof(VkAccelerationStructureCreateFlagsKHR));
     *ptr += sizeof(VkAccelerationStructureCreateFlagsKHR);
     uint64_t cgen_var_0;
@@ -12021,13 +15044,19 @@
 
 void reservedmarshal_VkWriteDescriptorSetAccelerationStructureKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWriteDescriptorSetAccelerationStructureKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->accelerationStructureCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     // WARNING PTR CHECK
@@ -12055,13 +15084,19 @@
 
 void reservedmarshal_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceAccelerationStructureFeaturesKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->accelerationStructure, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->accelerationStructureCaptureReplay, sizeof(VkBool32));
@@ -12076,13 +15111,19 @@
 
 void reservedmarshal_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceAccelerationStructurePropertiesKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint64_t*)&forMarshaling->maxGeometryCount, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
     memcpy(*ptr, (uint64_t*)&forMarshaling->maxInstanceCount, sizeof(uint64_t));
@@ -12103,13 +15144,19 @@
 
 void reservedmarshal_VkAccelerationStructureDeviceAddressInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureDeviceAddressInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkAccelerationStructureKHR((*&forMarshaling->accelerationStructure));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -12118,45 +15165,63 @@
 
 void reservedmarshal_VkAccelerationStructureVersionInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureVersionInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (const uint8_t*)forMarshaling->pVersionData, 2*VK_UUID_SIZE * sizeof(const uint8_t));
     *ptr += 2*VK_UUID_SIZE * sizeof(const uint8_t);
 }
 
 void reservedmarshal_VkCopyAccelerationStructureToMemoryInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyAccelerationStructureToMemoryInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkAccelerationStructureKHR((*&forMarshaling->src));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
     *ptr += 1 * 8;
-    reservedmarshal_VkDeviceOrHostAddressKHR(vkStream, (VkDeviceOrHostAddressKHR*)(&forMarshaling->dst), ptr);
+    reservedmarshal_VkDeviceOrHostAddressKHR(vkStream, rootType, (VkDeviceOrHostAddressKHR*)(&forMarshaling->dst), ptr);
     memcpy(*ptr, (VkCopyAccelerationStructureModeKHR*)&forMarshaling->mode, sizeof(VkCopyAccelerationStructureModeKHR));
     *ptr += sizeof(VkCopyAccelerationStructureModeKHR);
 }
 
 void reservedmarshal_VkCopyMemoryToAccelerationStructureInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyMemoryToAccelerationStructureInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
-    reservedmarshal_VkDeviceOrHostAddressConstKHR(vkStream, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->src), ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
+    reservedmarshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->src), ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkAccelerationStructureKHR((*&forMarshaling->dst));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -12167,13 +15232,19 @@
 
 void reservedmarshal_VkCopyAccelerationStructureInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyAccelerationStructureInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     uint64_t cgen_var_0;
     *&cgen_var_0 = get_host_u64_VkAccelerationStructureKHR((*&forMarshaling->src));
     memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
@@ -12188,13 +15259,19 @@
 
 void reservedmarshal_VkAccelerationStructureBuildSizesInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureBuildSizesInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->accelerationStructureSize, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->updateScratchSize, sizeof(VkDeviceSize));
@@ -12207,13 +15284,19 @@
 #ifdef VK_KHR_ray_tracing_pipeline
 void reservedmarshal_VkRayTracingShaderGroupCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRayTracingShaderGroupCreateInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkRayTracingShaderGroupTypeKHR*)&forMarshaling->type, sizeof(VkRayTracingShaderGroupTypeKHR));
     *ptr += sizeof(VkRayTracingShaderGroupTypeKHR);
     memcpy(*ptr, (uint32_t*)&forMarshaling->generalShader, sizeof(uint32_t));
@@ -12238,13 +15321,19 @@
 
 void reservedmarshal_VkRayTracingPipelineInterfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRayTracingPipelineInterfaceCreateInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxPipelineRayPayloadSize, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxPipelineRayHitAttributeSize, sizeof(uint32_t));
@@ -12253,26 +15342,32 @@
 
 void reservedmarshal_VkRayTracingPipelineCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRayTracingPipelineCreateInfoKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkPipelineCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineCreateFlags));
     *ptr += sizeof(VkPipelineCreateFlags);
     memcpy(*ptr, (uint32_t*)&forMarshaling->stageCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->stageCount; ++i)
     {
-        reservedmarshal_VkPipelineShaderStageCreateInfo(vkStream, (const VkPipelineShaderStageCreateInfo*)(forMarshaling->pStages + i), ptr);
+        reservedmarshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (const VkPipelineShaderStageCreateInfo*)(forMarshaling->pStages + i), ptr);
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->groupCount, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)forMarshaling->groupCount; ++i)
     {
-        reservedmarshal_VkRayTracingShaderGroupCreateInfoKHR(vkStream, (const VkRayTracingShaderGroupCreateInfoKHR*)(forMarshaling->pGroups + i), ptr);
+        reservedmarshal_VkRayTracingShaderGroupCreateInfoKHR(vkStream, rootType, (const VkRayTracingShaderGroupCreateInfoKHR*)(forMarshaling->pGroups + i), ptr);
     }
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxPipelineRayRecursionDepth, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -12283,7 +15378,7 @@
     *ptr += 8;
     if (forMarshaling->pLibraryInfo)
     {
-        reservedmarshal_VkPipelineLibraryCreateInfoKHR(vkStream, (const VkPipelineLibraryCreateInfoKHR*)(forMarshaling->pLibraryInfo), ptr);
+        reservedmarshal_VkPipelineLibraryCreateInfoKHR(vkStream, rootType, (const VkPipelineLibraryCreateInfoKHR*)(forMarshaling->pLibraryInfo), ptr);
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pLibraryInterface;
@@ -12292,7 +15387,7 @@
     *ptr += 8;
     if (forMarshaling->pLibraryInterface)
     {
-        reservedmarshal_VkRayTracingPipelineInterfaceCreateInfoKHR(vkStream, (const VkRayTracingPipelineInterfaceCreateInfoKHR*)(forMarshaling->pLibraryInterface), ptr);
+        reservedmarshal_VkRayTracingPipelineInterfaceCreateInfoKHR(vkStream, rootType, (const VkRayTracingPipelineInterfaceCreateInfoKHR*)(forMarshaling->pLibraryInterface), ptr);
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)forMarshaling->pDynamicState;
@@ -12301,7 +15396,7 @@
     *ptr += 8;
     if (forMarshaling->pDynamicState)
     {
-        reservedmarshal_VkPipelineDynamicStateCreateInfo(vkStream, (const VkPipelineDynamicStateCreateInfo*)(forMarshaling->pDynamicState), ptr);
+        reservedmarshal_VkPipelineDynamicStateCreateInfo(vkStream, rootType, (const VkPipelineDynamicStateCreateInfo*)(forMarshaling->pDynamicState), ptr);
     }
     uint64_t cgen_var_3;
     *&cgen_var_3 = get_host_u64_VkPipelineLayout((*&forMarshaling->layout));
@@ -12317,13 +15412,19 @@
 
 void reservedmarshal_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPipelineFeaturesKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->rayTracingPipeline, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy(*ptr, (VkBool32*)&forMarshaling->rayTracingPipelineShaderGroupHandleCaptureReplay, sizeof(VkBool32));
@@ -12338,13 +15439,19 @@
 
 void reservedmarshal_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPipelinePropertiesKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (uint32_t*)&forMarshaling->shaderGroupHandleSize, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->maxRayRecursionDepth, sizeof(uint32_t));
@@ -12365,10 +15472,12 @@
 
 void reservedmarshal_VkStridedDeviceAddressRegionKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkStridedDeviceAddressRegionKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkDeviceAddress*)&forMarshaling->deviceAddress, sizeof(VkDeviceAddress));
     *ptr += sizeof(VkDeviceAddress);
     memcpy(*ptr, (VkDeviceSize*)&forMarshaling->stride, sizeof(VkDeviceSize));
@@ -12379,10 +15488,12 @@
 
 void reservedmarshal_VkTraceRaysIndirectCommandKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkTraceRaysIndirectCommandKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (uint32_t*)&forMarshaling->width, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy(*ptr, (uint32_t*)&forMarshaling->height, sizeof(uint32_t));
@@ -12395,13 +15506,19 @@
 #ifdef VK_KHR_ray_query
 void reservedmarshal_VkPhysicalDeviceRayQueryFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayQueryFeaturesKHR* forMarshaling,
     uint8_t** ptr)
 {
     (void)vkStream;
+    (void)rootType;
     memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
+    {
+        rootType = forMarshaling->sType;
+    }
+    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
     memcpy(*ptr, (VkBool32*)&forMarshaling->rayQuery, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -12409,15 +15526,16 @@
 #endif
 void reservedmarshal_extension_struct(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const void* structExtension,
     uint8_t** ptr)
 {
     VkInstanceCreateInfo* structAccess = (VkInstanceCreateInfo*)(structExtension);
-    uint32_t currExtSize = goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), structExtension);
+    uint32_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
-        reservedmarshal_extension_struct(vkStream, (void*)structAccess->pNext, ptr);
+        reservedmarshal_extension_struct(vkStream, rootType, (void*)structAccess->pNext, ptr);
         return;
     }
     else
@@ -12442,1535 +15560,1613 @@
 #ifdef VK_VERSION_1_1
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES:
         {
-            reservedmarshal_VkPhysicalDeviceSubgroupProperties(vkStream, reinterpret_cast<const VkPhysicalDeviceSubgroupProperties*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceSubgroupProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceSubgroupProperties*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES:
         {
-            reservedmarshal_VkPhysicalDevice16BitStorageFeatures(vkStream, reinterpret_cast<const VkPhysicalDevice16BitStorageFeatures*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDevice16BitStorageFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDevice16BitStorageFeatures*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS:
         {
-            reservedmarshal_VkMemoryDedicatedRequirements(vkStream, reinterpret_cast<const VkMemoryDedicatedRequirements*>(structExtension), ptr);
+            reservedmarshal_VkMemoryDedicatedRequirements(vkStream, rootType, reinterpret_cast<const VkMemoryDedicatedRequirements*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO:
         {
-            reservedmarshal_VkMemoryDedicatedAllocateInfo(vkStream, reinterpret_cast<const VkMemoryDedicatedAllocateInfo*>(structExtension), ptr);
+            reservedmarshal_VkMemoryDedicatedAllocateInfo(vkStream, rootType, reinterpret_cast<const VkMemoryDedicatedAllocateInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO:
         {
-            reservedmarshal_VkMemoryAllocateFlagsInfo(vkStream, reinterpret_cast<const VkMemoryAllocateFlagsInfo*>(structExtension), ptr);
+            reservedmarshal_VkMemoryAllocateFlagsInfo(vkStream, rootType, reinterpret_cast<const VkMemoryAllocateFlagsInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO:
         {
-            reservedmarshal_VkDeviceGroupRenderPassBeginInfo(vkStream, reinterpret_cast<const VkDeviceGroupRenderPassBeginInfo*>(structExtension), ptr);
+            reservedmarshal_VkDeviceGroupRenderPassBeginInfo(vkStream, rootType, reinterpret_cast<const VkDeviceGroupRenderPassBeginInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO:
         {
-            reservedmarshal_VkDeviceGroupCommandBufferBeginInfo(vkStream, reinterpret_cast<const VkDeviceGroupCommandBufferBeginInfo*>(structExtension), ptr);
+            reservedmarshal_VkDeviceGroupCommandBufferBeginInfo(vkStream, rootType, reinterpret_cast<const VkDeviceGroupCommandBufferBeginInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO:
         {
-            reservedmarshal_VkDeviceGroupSubmitInfo(vkStream, reinterpret_cast<const VkDeviceGroupSubmitInfo*>(structExtension), ptr);
+            reservedmarshal_VkDeviceGroupSubmitInfo(vkStream, rootType, reinterpret_cast<const VkDeviceGroupSubmitInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO:
         {
-            reservedmarshal_VkDeviceGroupBindSparseInfo(vkStream, reinterpret_cast<const VkDeviceGroupBindSparseInfo*>(structExtension), ptr);
+            reservedmarshal_VkDeviceGroupBindSparseInfo(vkStream, rootType, reinterpret_cast<const VkDeviceGroupBindSparseInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO:
         {
-            reservedmarshal_VkBindBufferMemoryDeviceGroupInfo(vkStream, reinterpret_cast<const VkBindBufferMemoryDeviceGroupInfo*>(structExtension), ptr);
+            reservedmarshal_VkBindBufferMemoryDeviceGroupInfo(vkStream, rootType, reinterpret_cast<const VkBindBufferMemoryDeviceGroupInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO:
         {
-            reservedmarshal_VkBindImageMemoryDeviceGroupInfo(vkStream, reinterpret_cast<const VkBindImageMemoryDeviceGroupInfo*>(structExtension), ptr);
+            reservedmarshal_VkBindImageMemoryDeviceGroupInfo(vkStream, rootType, reinterpret_cast<const VkBindImageMemoryDeviceGroupInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO:
         {
-            reservedmarshal_VkDeviceGroupDeviceCreateInfo(vkStream, reinterpret_cast<const VkDeviceGroupDeviceCreateInfo*>(structExtension), ptr);
+            reservedmarshal_VkDeviceGroupDeviceCreateInfo(vkStream, rootType, reinterpret_cast<const VkDeviceGroupDeviceCreateInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
         {
-            reservedmarshal_VkPhysicalDeviceFeatures2(vkStream, reinterpret_cast<const VkPhysicalDeviceFeatures2*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceFeatures2(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFeatures2*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES:
         {
-            reservedmarshal_VkPhysicalDevicePointClippingProperties(vkStream, reinterpret_cast<const VkPhysicalDevicePointClippingProperties*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDevicePointClippingProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePointClippingProperties*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO:
         {
-            reservedmarshal_VkRenderPassInputAttachmentAspectCreateInfo(vkStream, reinterpret_cast<const VkRenderPassInputAttachmentAspectCreateInfo*>(structExtension), ptr);
+            reservedmarshal_VkRenderPassInputAttachmentAspectCreateInfo(vkStream, rootType, reinterpret_cast<const VkRenderPassInputAttachmentAspectCreateInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO:
         {
-            reservedmarshal_VkImageViewUsageCreateInfo(vkStream, reinterpret_cast<const VkImageViewUsageCreateInfo*>(structExtension), ptr);
+            reservedmarshal_VkImageViewUsageCreateInfo(vkStream, rootType, reinterpret_cast<const VkImageViewUsageCreateInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO:
         {
-            reservedmarshal_VkPipelineTessellationDomainOriginStateCreateInfo(vkStream, reinterpret_cast<const VkPipelineTessellationDomainOriginStateCreateInfo*>(structExtension), ptr);
+            reservedmarshal_VkPipelineTessellationDomainOriginStateCreateInfo(vkStream, rootType, reinterpret_cast<const VkPipelineTessellationDomainOriginStateCreateInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO:
         {
-            reservedmarshal_VkRenderPassMultiviewCreateInfo(vkStream, reinterpret_cast<const VkRenderPassMultiviewCreateInfo*>(structExtension), ptr);
+            reservedmarshal_VkRenderPassMultiviewCreateInfo(vkStream, rootType, reinterpret_cast<const VkRenderPassMultiviewCreateInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES:
         {
-            reservedmarshal_VkPhysicalDeviceMultiviewFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceMultiviewFeatures*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceMultiviewFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceMultiviewFeatures*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES:
         {
-            reservedmarshal_VkPhysicalDeviceMultiviewProperties(vkStream, reinterpret_cast<const VkPhysicalDeviceMultiviewProperties*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceMultiviewProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceMultiviewProperties*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES:
         {
-            reservedmarshal_VkPhysicalDeviceVariablePointersFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceVariablePointersFeatures*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceVariablePointersFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceVariablePointersFeatures*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES:
         {
-            reservedmarshal_VkPhysicalDeviceProtectedMemoryFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceProtectedMemoryFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES:
         {
-            reservedmarshal_VkPhysicalDeviceProtectedMemoryProperties(vkStream, reinterpret_cast<const VkPhysicalDeviceProtectedMemoryProperties*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceProtectedMemoryProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceProtectedMemoryProperties*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO:
         {
-            reservedmarshal_VkProtectedSubmitInfo(vkStream, reinterpret_cast<const VkProtectedSubmitInfo*>(structExtension), ptr);
+            reservedmarshal_VkProtectedSubmitInfo(vkStream, rootType, reinterpret_cast<const VkProtectedSubmitInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO:
         {
-            reservedmarshal_VkSamplerYcbcrConversionInfo(vkStream, reinterpret_cast<const VkSamplerYcbcrConversionInfo*>(structExtension), ptr);
+            reservedmarshal_VkSamplerYcbcrConversionInfo(vkStream, rootType, reinterpret_cast<const VkSamplerYcbcrConversionInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO:
         {
-            reservedmarshal_VkBindImagePlaneMemoryInfo(vkStream, reinterpret_cast<const VkBindImagePlaneMemoryInfo*>(structExtension), ptr);
+            reservedmarshal_VkBindImagePlaneMemoryInfo(vkStream, rootType, reinterpret_cast<const VkBindImagePlaneMemoryInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO:
         {
-            reservedmarshal_VkImagePlaneMemoryRequirementsInfo(vkStream, reinterpret_cast<const VkImagePlaneMemoryRequirementsInfo*>(structExtension), ptr);
+            reservedmarshal_VkImagePlaneMemoryRequirementsInfo(vkStream, rootType, reinterpret_cast<const VkImagePlaneMemoryRequirementsInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES:
         {
-            reservedmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES:
         {
-            reservedmarshal_VkSamplerYcbcrConversionImageFormatProperties(vkStream, reinterpret_cast<const VkSamplerYcbcrConversionImageFormatProperties*>(structExtension), ptr);
+            reservedmarshal_VkSamplerYcbcrConversionImageFormatProperties(vkStream, rootType, reinterpret_cast<const VkSamplerYcbcrConversionImageFormatProperties*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO:
         {
-            reservedmarshal_VkPhysicalDeviceExternalImageFormatInfo(vkStream, reinterpret_cast<const VkPhysicalDeviceExternalImageFormatInfo*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceExternalImageFormatInfo(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceExternalImageFormatInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES:
         {
-            reservedmarshal_VkExternalImageFormatProperties(vkStream, reinterpret_cast<const VkExternalImageFormatProperties*>(structExtension), ptr);
+            reservedmarshal_VkExternalImageFormatProperties(vkStream, rootType, reinterpret_cast<const VkExternalImageFormatProperties*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES:
         {
-            reservedmarshal_VkPhysicalDeviceIDProperties(vkStream, reinterpret_cast<const VkPhysicalDeviceIDProperties*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceIDProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceIDProperties*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO:
         {
-            reservedmarshal_VkExternalMemoryImageCreateInfo(vkStream, reinterpret_cast<const VkExternalMemoryImageCreateInfo*>(structExtension), ptr);
+            reservedmarshal_VkExternalMemoryImageCreateInfo(vkStream, rootType, reinterpret_cast<const VkExternalMemoryImageCreateInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO:
         {
-            reservedmarshal_VkExternalMemoryBufferCreateInfo(vkStream, reinterpret_cast<const VkExternalMemoryBufferCreateInfo*>(structExtension), ptr);
+            reservedmarshal_VkExternalMemoryBufferCreateInfo(vkStream, rootType, reinterpret_cast<const VkExternalMemoryBufferCreateInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO:
         {
-            reservedmarshal_VkExportMemoryAllocateInfo(vkStream, reinterpret_cast<const VkExportMemoryAllocateInfo*>(structExtension), ptr);
+            reservedmarshal_VkExportMemoryAllocateInfo(vkStream, rootType, reinterpret_cast<const VkExportMemoryAllocateInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO:
         {
-            reservedmarshal_VkExportFenceCreateInfo(vkStream, reinterpret_cast<const VkExportFenceCreateInfo*>(structExtension), ptr);
+            reservedmarshal_VkExportFenceCreateInfo(vkStream, rootType, reinterpret_cast<const VkExportFenceCreateInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO:
         {
-            reservedmarshal_VkExportSemaphoreCreateInfo(vkStream, reinterpret_cast<const VkExportSemaphoreCreateInfo*>(structExtension), ptr);
+            reservedmarshal_VkExportSemaphoreCreateInfo(vkStream, rootType, reinterpret_cast<const VkExportSemaphoreCreateInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES:
         {
-            reservedmarshal_VkPhysicalDeviceMaintenance3Properties(vkStream, reinterpret_cast<const VkPhysicalDeviceMaintenance3Properties*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceMaintenance3Properties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceMaintenance3Properties*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES:
         {
-            reservedmarshal_VkPhysicalDeviceShaderDrawParametersFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceShaderDrawParametersFeatures*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceShaderDrawParametersFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderDrawParametersFeatures*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_VERSION_1_2
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES:
         {
-            reservedmarshal_VkPhysicalDeviceVulkan11Features(vkStream, reinterpret_cast<const VkPhysicalDeviceVulkan11Features*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceVulkan11Features(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceVulkan11Features*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES:
         {
-            reservedmarshal_VkPhysicalDeviceVulkan11Properties(vkStream, reinterpret_cast<const VkPhysicalDeviceVulkan11Properties*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceVulkan11Properties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceVulkan11Properties*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES:
         {
-            reservedmarshal_VkPhysicalDeviceVulkan12Features(vkStream, reinterpret_cast<const VkPhysicalDeviceVulkan12Features*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceVulkan12Features(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceVulkan12Features*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES:
         {
-            reservedmarshal_VkPhysicalDeviceVulkan12Properties(vkStream, reinterpret_cast<const VkPhysicalDeviceVulkan12Properties*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceVulkan12Properties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceVulkan12Properties*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO:
         {
-            reservedmarshal_VkImageFormatListCreateInfo(vkStream, reinterpret_cast<const VkImageFormatListCreateInfo*>(structExtension), ptr);
+            reservedmarshal_VkImageFormatListCreateInfo(vkStream, rootType, reinterpret_cast<const VkImageFormatListCreateInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES:
         {
-            reservedmarshal_VkPhysicalDevice8BitStorageFeatures(vkStream, reinterpret_cast<const VkPhysicalDevice8BitStorageFeatures*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDevice8BitStorageFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDevice8BitStorageFeatures*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES:
         {
-            reservedmarshal_VkPhysicalDeviceDriverProperties(vkStream, reinterpret_cast<const VkPhysicalDeviceDriverProperties*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceDriverProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDriverProperties*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES:
         {
-            reservedmarshal_VkPhysicalDeviceShaderAtomicInt64Features(vkStream, reinterpret_cast<const VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceShaderAtomicInt64Features(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES:
         {
-            reservedmarshal_VkPhysicalDeviceShaderFloat16Int8Features(vkStream, reinterpret_cast<const VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceShaderFloat16Int8Features(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES:
         {
-            reservedmarshal_VkPhysicalDeviceFloatControlsProperties(vkStream, reinterpret_cast<const VkPhysicalDeviceFloatControlsProperties*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceFloatControlsProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFloatControlsProperties*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO:
         {
-            reservedmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfo(vkStream, reinterpret_cast<const VkDescriptorSetLayoutBindingFlagsCreateInfo*>(structExtension), ptr);
+            reservedmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfo(vkStream, rootType, reinterpret_cast<const VkDescriptorSetLayoutBindingFlagsCreateInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES:
         {
-            reservedmarshal_VkPhysicalDeviceDescriptorIndexingFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceDescriptorIndexingFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES:
         {
-            reservedmarshal_VkPhysicalDeviceDescriptorIndexingProperties(vkStream, reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingProperties*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceDescriptorIndexingProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingProperties*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO:
         {
-            reservedmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfo(vkStream, reinterpret_cast<const VkDescriptorSetVariableDescriptorCountAllocateInfo*>(structExtension), ptr);
+            reservedmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfo(vkStream, rootType, reinterpret_cast<const VkDescriptorSetVariableDescriptorCountAllocateInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT:
         {
-            reservedmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupport(vkStream, reinterpret_cast<const VkDescriptorSetVariableDescriptorCountLayoutSupport*>(structExtension), ptr);
+            reservedmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupport(vkStream, rootType, reinterpret_cast<const VkDescriptorSetVariableDescriptorCountLayoutSupport*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE:
         {
-            reservedmarshal_VkSubpassDescriptionDepthStencilResolve(vkStream, reinterpret_cast<const VkSubpassDescriptionDepthStencilResolve*>(structExtension), ptr);
+            reservedmarshal_VkSubpassDescriptionDepthStencilResolve(vkStream, rootType, reinterpret_cast<const VkSubpassDescriptionDepthStencilResolve*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES:
         {
-            reservedmarshal_VkPhysicalDeviceDepthStencilResolveProperties(vkStream, reinterpret_cast<const VkPhysicalDeviceDepthStencilResolveProperties*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceDepthStencilResolveProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDepthStencilResolveProperties*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES:
         {
-            reservedmarshal_VkPhysicalDeviceScalarBlockLayoutFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceScalarBlockLayoutFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO:
         {
-            reservedmarshal_VkImageStencilUsageCreateInfo(vkStream, reinterpret_cast<const VkImageStencilUsageCreateInfo*>(structExtension), ptr);
+            reservedmarshal_VkImageStencilUsageCreateInfo(vkStream, rootType, reinterpret_cast<const VkImageStencilUsageCreateInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO:
         {
-            reservedmarshal_VkSamplerReductionModeCreateInfo(vkStream, reinterpret_cast<const VkSamplerReductionModeCreateInfo*>(structExtension), ptr);
+            reservedmarshal_VkSamplerReductionModeCreateInfo(vkStream, rootType, reinterpret_cast<const VkSamplerReductionModeCreateInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES:
         {
-            reservedmarshal_VkPhysicalDeviceSamplerFilterMinmaxProperties(vkStream, reinterpret_cast<const VkPhysicalDeviceSamplerFilterMinmaxProperties*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceSamplerFilterMinmaxProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceSamplerFilterMinmaxProperties*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES:
         {
-            reservedmarshal_VkPhysicalDeviceVulkanMemoryModelFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceVulkanMemoryModelFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES:
         {
-            reservedmarshal_VkPhysicalDeviceImagelessFramebufferFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceImagelessFramebufferFeatures*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceImagelessFramebufferFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceImagelessFramebufferFeatures*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO:
         {
-            reservedmarshal_VkFramebufferAttachmentsCreateInfo(vkStream, reinterpret_cast<const VkFramebufferAttachmentsCreateInfo*>(structExtension), ptr);
+            reservedmarshal_VkFramebufferAttachmentsCreateInfo(vkStream, rootType, reinterpret_cast<const VkFramebufferAttachmentsCreateInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO:
         {
-            reservedmarshal_VkRenderPassAttachmentBeginInfo(vkStream, reinterpret_cast<const VkRenderPassAttachmentBeginInfo*>(structExtension), ptr);
+            reservedmarshal_VkRenderPassAttachmentBeginInfo(vkStream, rootType, reinterpret_cast<const VkRenderPassAttachmentBeginInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES:
         {
-            reservedmarshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES:
         {
-            reservedmarshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES:
         {
-            reservedmarshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT:
         {
-            reservedmarshal_VkAttachmentReferenceStencilLayout(vkStream, reinterpret_cast<const VkAttachmentReferenceStencilLayout*>(structExtension), ptr);
+            reservedmarshal_VkAttachmentReferenceStencilLayout(vkStream, rootType, reinterpret_cast<const VkAttachmentReferenceStencilLayout*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT:
         {
-            reservedmarshal_VkAttachmentDescriptionStencilLayout(vkStream, reinterpret_cast<const VkAttachmentDescriptionStencilLayout*>(structExtension), ptr);
+            reservedmarshal_VkAttachmentDescriptionStencilLayout(vkStream, rootType, reinterpret_cast<const VkAttachmentDescriptionStencilLayout*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES:
         {
-            reservedmarshal_VkPhysicalDeviceHostQueryResetFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceHostQueryResetFeatures*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceHostQueryResetFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceHostQueryResetFeatures*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES:
         {
-            reservedmarshal_VkPhysicalDeviceTimelineSemaphoreFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceTimelineSemaphoreFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES:
         {
-            reservedmarshal_VkPhysicalDeviceTimelineSemaphoreProperties(vkStream, reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreProperties*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceTimelineSemaphoreProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreProperties*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO:
         {
-            reservedmarshal_VkSemaphoreTypeCreateInfo(vkStream, reinterpret_cast<const VkSemaphoreTypeCreateInfo*>(structExtension), ptr);
+            reservedmarshal_VkSemaphoreTypeCreateInfo(vkStream, rootType, reinterpret_cast<const VkSemaphoreTypeCreateInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO:
         {
-            reservedmarshal_VkTimelineSemaphoreSubmitInfo(vkStream, reinterpret_cast<const VkTimelineSemaphoreSubmitInfo*>(structExtension), ptr);
+            reservedmarshal_VkTimelineSemaphoreSubmitInfo(vkStream, rootType, reinterpret_cast<const VkTimelineSemaphoreSubmitInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES:
         {
-            reservedmarshal_VkPhysicalDeviceBufferDeviceAddressFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeatures*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceBufferDeviceAddressFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeatures*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO:
         {
-            reservedmarshal_VkBufferOpaqueCaptureAddressCreateInfo(vkStream, reinterpret_cast<const VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension), ptr);
+            reservedmarshal_VkBufferOpaqueCaptureAddressCreateInfo(vkStream, rootType, reinterpret_cast<const VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO:
         {
-            reservedmarshal_VkMemoryOpaqueCaptureAddressAllocateInfo(vkStream, reinterpret_cast<const VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension), ptr);
+            reservedmarshal_VkMemoryOpaqueCaptureAddressAllocateInfo(vkStream, rootType, reinterpret_cast<const VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_swapchain
         case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR:
         {
-            reservedmarshal_VkImageSwapchainCreateInfoKHR(vkStream, reinterpret_cast<const VkImageSwapchainCreateInfoKHR*>(structExtension), ptr);
+            reservedmarshal_VkImageSwapchainCreateInfoKHR(vkStream, rootType, reinterpret_cast<const VkImageSwapchainCreateInfoKHR*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR:
         {
-            reservedmarshal_VkBindImageMemorySwapchainInfoKHR(vkStream, reinterpret_cast<const VkBindImageMemorySwapchainInfoKHR*>(structExtension), ptr);
+            reservedmarshal_VkBindImageMemorySwapchainInfoKHR(vkStream, rootType, reinterpret_cast<const VkBindImageMemorySwapchainInfoKHR*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR:
         {
-            reservedmarshal_VkDeviceGroupPresentInfoKHR(vkStream, reinterpret_cast<const VkDeviceGroupPresentInfoKHR*>(structExtension), ptr);
+            reservedmarshal_VkDeviceGroupPresentInfoKHR(vkStream, rootType, reinterpret_cast<const VkDeviceGroupPresentInfoKHR*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR:
         {
-            reservedmarshal_VkDeviceGroupSwapchainCreateInfoKHR(vkStream, reinterpret_cast<const VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension), ptr);
+            reservedmarshal_VkDeviceGroupSwapchainCreateInfoKHR(vkStream, rootType, reinterpret_cast<const VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_display_swapchain
         case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR:
         {
-            reservedmarshal_VkDisplayPresentInfoKHR(vkStream, reinterpret_cast<const VkDisplayPresentInfoKHR*>(structExtension), ptr);
+            reservedmarshal_VkDisplayPresentInfoKHR(vkStream, rootType, reinterpret_cast<const VkDisplayPresentInfoKHR*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_external_memory_win32
         case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
         {
-            reservedmarshal_VkImportMemoryWin32HandleInfoKHR(vkStream, reinterpret_cast<const VkImportMemoryWin32HandleInfoKHR*>(structExtension), ptr);
+            reservedmarshal_VkImportMemoryWin32HandleInfoKHR(vkStream, rootType, reinterpret_cast<const VkImportMemoryWin32HandleInfoKHR*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
         {
-            reservedmarshal_VkExportMemoryWin32HandleInfoKHR(vkStream, reinterpret_cast<const VkExportMemoryWin32HandleInfoKHR*>(structExtension), ptr);
+            reservedmarshal_VkExportMemoryWin32HandleInfoKHR(vkStream, rootType, reinterpret_cast<const VkExportMemoryWin32HandleInfoKHR*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_external_memory_fd
         case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR:
         {
-            reservedmarshal_VkImportMemoryFdInfoKHR(vkStream, reinterpret_cast<const VkImportMemoryFdInfoKHR*>(structExtension), ptr);
+            reservedmarshal_VkImportMemoryFdInfoKHR(vkStream, rootType, reinterpret_cast<const VkImportMemoryFdInfoKHR*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
         case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR:
         {
-            reservedmarshal_VkWin32KeyedMutexAcquireReleaseInfoKHR(vkStream, reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension), ptr);
+            reservedmarshal_VkWin32KeyedMutexAcquireReleaseInfoKHR(vkStream, rootType, reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_external_semaphore_win32
         case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR:
         {
-            reservedmarshal_VkExportSemaphoreWin32HandleInfoKHR(vkStream, reinterpret_cast<const VkExportSemaphoreWin32HandleInfoKHR*>(structExtension), ptr);
+            reservedmarshal_VkExportSemaphoreWin32HandleInfoKHR(vkStream, rootType, reinterpret_cast<const VkExportSemaphoreWin32HandleInfoKHR*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR:
         {
-            reservedmarshal_VkD3D12FenceSubmitInfoKHR(vkStream, reinterpret_cast<const VkD3D12FenceSubmitInfoKHR*>(structExtension), ptr);
+            reservedmarshal_VkD3D12FenceSubmitInfoKHR(vkStream, rootType, reinterpret_cast<const VkD3D12FenceSubmitInfoKHR*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_push_descriptor
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR:
         {
-            reservedmarshal_VkPhysicalDevicePushDescriptorPropertiesKHR(vkStream, reinterpret_cast<const VkPhysicalDevicePushDescriptorPropertiesKHR*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDevicePushDescriptorPropertiesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePushDescriptorPropertiesKHR*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_incremental_present
         case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR:
         {
-            reservedmarshal_VkPresentRegionsKHR(vkStream, reinterpret_cast<const VkPresentRegionsKHR*>(structExtension), ptr);
+            reservedmarshal_VkPresentRegionsKHR(vkStream, rootType, reinterpret_cast<const VkPresentRegionsKHR*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_shared_presentable_image
         case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR:
         {
-            reservedmarshal_VkSharedPresentSurfaceCapabilitiesKHR(vkStream, reinterpret_cast<const VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension), ptr);
+            reservedmarshal_VkSharedPresentSurfaceCapabilitiesKHR(vkStream, rootType, reinterpret_cast<const VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_external_fence_win32
         case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR:
         {
-            reservedmarshal_VkExportFenceWin32HandleInfoKHR(vkStream, reinterpret_cast<const VkExportFenceWin32HandleInfoKHR*>(structExtension), ptr);
+            reservedmarshal_VkExportFenceWin32HandleInfoKHR(vkStream, rootType, reinterpret_cast<const VkExportFenceWin32HandleInfoKHR*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_performance_query
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR:
         {
-            reservedmarshal_VkPhysicalDevicePerformanceQueryFeaturesKHR(vkStream, reinterpret_cast<const VkPhysicalDevicePerformanceQueryFeaturesKHR*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDevicePerformanceQueryFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePerformanceQueryFeaturesKHR*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR:
         {
-            reservedmarshal_VkPhysicalDevicePerformanceQueryPropertiesKHR(vkStream, reinterpret_cast<const VkPhysicalDevicePerformanceQueryPropertiesKHR*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDevicePerformanceQueryPropertiesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePerformanceQueryPropertiesKHR*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR:
         {
-            reservedmarshal_VkQueryPoolPerformanceCreateInfoKHR(vkStream, reinterpret_cast<const VkQueryPoolPerformanceCreateInfoKHR*>(structExtension), ptr);
+            reservedmarshal_VkQueryPoolPerformanceCreateInfoKHR(vkStream, rootType, reinterpret_cast<const VkQueryPoolPerformanceCreateInfoKHR*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR:
         {
-            reservedmarshal_VkPerformanceQuerySubmitInfoKHR(vkStream, reinterpret_cast<const VkPerformanceQuerySubmitInfoKHR*>(structExtension), ptr);
+            reservedmarshal_VkPerformanceQuerySubmitInfoKHR(vkStream, rootType, reinterpret_cast<const VkPerformanceQuerySubmitInfoKHR*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_portability_subset
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR:
         {
-            reservedmarshal_VkPhysicalDevicePortabilitySubsetFeaturesKHR(vkStream, reinterpret_cast<const VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDevicePortabilitySubsetFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR:
         {
-            reservedmarshal_VkPhysicalDevicePortabilitySubsetPropertiesKHR(vkStream, reinterpret_cast<const VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDevicePortabilitySubsetPropertiesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_shader_clock
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR:
         {
-            reservedmarshal_VkPhysicalDeviceShaderClockFeaturesKHR(vkStream, reinterpret_cast<const VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceShaderClockFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_shader_terminate_invocation
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR:
         {
-            reservedmarshal_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(vkStream, reinterpret_cast<const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_fragment_shading_rate
         case VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR:
         {
-            reservedmarshal_VkFragmentShadingRateAttachmentInfoKHR(vkStream, reinterpret_cast<const VkFragmentShadingRateAttachmentInfoKHR*>(structExtension), ptr);
+            reservedmarshal_VkFragmentShadingRateAttachmentInfoKHR(vkStream, rootType, reinterpret_cast<const VkFragmentShadingRateAttachmentInfoKHR*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR:
         {
-            reservedmarshal_VkPipelineFragmentShadingRateStateCreateInfoKHR(vkStream, reinterpret_cast<const VkPipelineFragmentShadingRateStateCreateInfoKHR*>(structExtension), ptr);
+            reservedmarshal_VkPipelineFragmentShadingRateStateCreateInfoKHR(vkStream, rootType, reinterpret_cast<const VkPipelineFragmentShadingRateStateCreateInfoKHR*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR:
         {
-            reservedmarshal_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(vkStream, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR:
         {
-            reservedmarshal_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(vkStream, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_surface_protected_capabilities
         case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR:
         {
-            reservedmarshal_VkSurfaceProtectedCapabilitiesKHR(vkStream, reinterpret_cast<const VkSurfaceProtectedCapabilitiesKHR*>(structExtension), ptr);
+            reservedmarshal_VkSurfaceProtectedCapabilitiesKHR(vkStream, rootType, reinterpret_cast<const VkSurfaceProtectedCapabilitiesKHR*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR:
         {
-            reservedmarshal_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(vkStream, reinterpret_cast<const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_ANDROID_native_buffer
         case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID:
         {
-            reservedmarshal_VkNativeBufferANDROID(vkStream, reinterpret_cast<const VkNativeBufferANDROID*>(structExtension), ptr);
+            reservedmarshal_VkNativeBufferANDROID(vkStream, rootType, reinterpret_cast<const VkNativeBufferANDROID*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_debug_report
         case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT:
         {
-            reservedmarshal_VkDebugReportCallbackCreateInfoEXT(vkStream, reinterpret_cast<const VkDebugReportCallbackCreateInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkDebugReportCallbackCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkDebugReportCallbackCreateInfoEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_AMD_rasterization_order
         case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD:
         {
-            reservedmarshal_VkPipelineRasterizationStateRasterizationOrderAMD(vkStream, reinterpret_cast<const VkPipelineRasterizationStateRasterizationOrderAMD*>(structExtension), ptr);
+            reservedmarshal_VkPipelineRasterizationStateRasterizationOrderAMD(vkStream, rootType, reinterpret_cast<const VkPipelineRasterizationStateRasterizationOrderAMD*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_dedicated_allocation
         case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV:
         {
-            reservedmarshal_VkDedicatedAllocationImageCreateInfoNV(vkStream, reinterpret_cast<const VkDedicatedAllocationImageCreateInfoNV*>(structExtension), ptr);
+            reservedmarshal_VkDedicatedAllocationImageCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkDedicatedAllocationImageCreateInfoNV*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV:
         {
-            reservedmarshal_VkDedicatedAllocationBufferCreateInfoNV(vkStream, reinterpret_cast<const VkDedicatedAllocationBufferCreateInfoNV*>(structExtension), ptr);
+            reservedmarshal_VkDedicatedAllocationBufferCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkDedicatedAllocationBufferCreateInfoNV*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV:
         {
-            reservedmarshal_VkDedicatedAllocationMemoryAllocateInfoNV(vkStream, reinterpret_cast<const VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension), ptr);
+            reservedmarshal_VkDedicatedAllocationMemoryAllocateInfoNV(vkStream, rootType, reinterpret_cast<const VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_transform_feedback
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceTransformFeedbackFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceTransformFeedbackFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceTransformFeedbackPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceTransformFeedbackPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT:
         {
-            reservedmarshal_VkPipelineRasterizationStateStreamCreateInfoEXT(vkStream, reinterpret_cast<const VkPipelineRasterizationStateStreamCreateInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkPipelineRasterizationStateStreamCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkPipelineRasterizationStateStreamCreateInfoEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
         case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD:
         {
-            reservedmarshal_VkTextureLODGatherFormatPropertiesAMD(vkStream, reinterpret_cast<const VkTextureLODGatherFormatPropertiesAMD*>(structExtension), ptr);
+            reservedmarshal_VkTextureLODGatherFormatPropertiesAMD(vkStream, rootType, reinterpret_cast<const VkTextureLODGatherFormatPropertiesAMD*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_corner_sampled_image
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV:
         {
-            reservedmarshal_VkPhysicalDeviceCornerSampledImageFeaturesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceCornerSampledImageFeaturesNV*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceCornerSampledImageFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceCornerSampledImageFeaturesNV*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_external_memory
         case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV:
         {
-            reservedmarshal_VkExternalMemoryImageCreateInfoNV(vkStream, reinterpret_cast<const VkExternalMemoryImageCreateInfoNV*>(structExtension), ptr);
+            reservedmarshal_VkExternalMemoryImageCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkExternalMemoryImageCreateInfoNV*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV:
         {
-            reservedmarshal_VkExportMemoryAllocateInfoNV(vkStream, reinterpret_cast<const VkExportMemoryAllocateInfoNV*>(structExtension), ptr);
+            reservedmarshal_VkExportMemoryAllocateInfoNV(vkStream, rootType, reinterpret_cast<const VkExportMemoryAllocateInfoNV*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_external_memory_win32
         case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV:
         {
-            reservedmarshal_VkImportMemoryWin32HandleInfoNV(vkStream, reinterpret_cast<const VkImportMemoryWin32HandleInfoNV*>(structExtension), ptr);
+            reservedmarshal_VkImportMemoryWin32HandleInfoNV(vkStream, rootType, reinterpret_cast<const VkImportMemoryWin32HandleInfoNV*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV:
         {
-            reservedmarshal_VkExportMemoryWin32HandleInfoNV(vkStream, reinterpret_cast<const VkExportMemoryWin32HandleInfoNV*>(structExtension), ptr);
+            reservedmarshal_VkExportMemoryWin32HandleInfoNV(vkStream, rootType, reinterpret_cast<const VkExportMemoryWin32HandleInfoNV*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_win32_keyed_mutex
         case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV:
         {
-            reservedmarshal_VkWin32KeyedMutexAcquireReleaseInfoNV(vkStream, reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension), ptr);
+            reservedmarshal_VkWin32KeyedMutexAcquireReleaseInfoNV(vkStream, rootType, reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_validation_flags
         case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT:
         {
-            reservedmarshal_VkValidationFlagsEXT(vkStream, reinterpret_cast<const VkValidationFlagsEXT*>(structExtension), ptr);
+            reservedmarshal_VkValidationFlagsEXT(vkStream, rootType, reinterpret_cast<const VkValidationFlagsEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_texture_compression_astc_hdr
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_astc_decode_mode
         case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT:
         {
-            reservedmarshal_VkImageViewASTCDecodeModeEXT(vkStream, reinterpret_cast<const VkImageViewASTCDecodeModeEXT*>(structExtension), ptr);
+            reservedmarshal_VkImageViewASTCDecodeModeEXT(vkStream, rootType, reinterpret_cast<const VkImageViewASTCDecodeModeEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceASTCDecodeFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceASTCDecodeFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_conditional_rendering
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceConditionalRenderingFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceConditionalRenderingFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT:
         {
-            reservedmarshal_VkCommandBufferInheritanceConditionalRenderingInfoEXT(vkStream, reinterpret_cast<const VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkCommandBufferInheritanceConditionalRenderingInfoEXT(vkStream, rootType, reinterpret_cast<const VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_clip_space_w_scaling
         case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV:
         {
-            reservedmarshal_VkPipelineViewportWScalingStateCreateInfoNV(vkStream, reinterpret_cast<const VkPipelineViewportWScalingStateCreateInfoNV*>(structExtension), ptr);
+            reservedmarshal_VkPipelineViewportWScalingStateCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkPipelineViewportWScalingStateCreateInfoNV*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_display_control
         case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT:
         {
-            reservedmarshal_VkSwapchainCounterCreateInfoEXT(vkStream, reinterpret_cast<const VkSwapchainCounterCreateInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkSwapchainCounterCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkSwapchainCounterCreateInfoEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_GOOGLE_display_timing
         case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE:
         {
-            reservedmarshal_VkPresentTimesInfoGOOGLE(vkStream, reinterpret_cast<const VkPresentTimesInfoGOOGLE*>(structExtension), ptr);
+            reservedmarshal_VkPresentTimesInfoGOOGLE(vkStream, rootType, reinterpret_cast<const VkPresentTimesInfoGOOGLE*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_NVX_multiview_per_view_attributes
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX:
         {
-            reservedmarshal_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(vkStream, reinterpret_cast<const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_viewport_swizzle
         case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV:
         {
-            reservedmarshal_VkPipelineViewportSwizzleStateCreateInfoNV(vkStream, reinterpret_cast<const VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension), ptr);
+            reservedmarshal_VkPipelineViewportSwizzleStateCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_discard_rectangles
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceDiscardRectanglePropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceDiscardRectanglePropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT:
         {
-            reservedmarshal_VkPipelineDiscardRectangleStateCreateInfoEXT(vkStream, reinterpret_cast<const VkPipelineDiscardRectangleStateCreateInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkPipelineDiscardRectangleStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkPipelineDiscardRectangleStateCreateInfoEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_conservative_rasterization
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT:
         {
-            reservedmarshal_VkPipelineRasterizationConservativeStateCreateInfoEXT(vkStream, reinterpret_cast<const VkPipelineRasterizationConservativeStateCreateInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkPipelineRasterizationConservativeStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkPipelineRasterizationConservativeStateCreateInfoEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_depth_clip_enable
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceDepthClipEnableFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceDepthClipEnableFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT:
         {
-            reservedmarshal_VkPipelineRasterizationDepthClipStateCreateInfoEXT(vkStream, reinterpret_cast<const VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkPipelineRasterizationDepthClipStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_debug_utils
         case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT:
         {
-            reservedmarshal_VkDebugUtilsMessengerCreateInfoEXT(vkStream, reinterpret_cast<const VkDebugUtilsMessengerCreateInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkDebugUtilsMessengerCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkDebugUtilsMessengerCreateInfoEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
         case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID:
         {
-            reservedmarshal_VkAndroidHardwareBufferUsageANDROID(vkStream, reinterpret_cast<const VkAndroidHardwareBufferUsageANDROID*>(structExtension), ptr);
+            reservedmarshal_VkAndroidHardwareBufferUsageANDROID(vkStream, rootType, reinterpret_cast<const VkAndroidHardwareBufferUsageANDROID*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID:
         {
-            reservedmarshal_VkAndroidHardwareBufferFormatPropertiesANDROID(vkStream, reinterpret_cast<const VkAndroidHardwareBufferFormatPropertiesANDROID*>(structExtension), ptr);
+            reservedmarshal_VkAndroidHardwareBufferFormatPropertiesANDROID(vkStream, rootType, reinterpret_cast<const VkAndroidHardwareBufferFormatPropertiesANDROID*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID:
         {
-            reservedmarshal_VkImportAndroidHardwareBufferInfoANDROID(vkStream, reinterpret_cast<const VkImportAndroidHardwareBufferInfoANDROID*>(structExtension), ptr);
+            reservedmarshal_VkImportAndroidHardwareBufferInfoANDROID(vkStream, rootType, reinterpret_cast<const VkImportAndroidHardwareBufferInfoANDROID*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID:
         {
-            reservedmarshal_VkExternalFormatANDROID(vkStream, reinterpret_cast<const VkExternalFormatANDROID*>(structExtension), ptr);
+            reservedmarshal_VkExternalFormatANDROID(vkStream, rootType, reinterpret_cast<const VkExternalFormatANDROID*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_inline_uniform_block
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT:
         {
-            reservedmarshal_VkWriteDescriptorSetInlineUniformBlockEXT(vkStream, reinterpret_cast<const VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension), ptr);
+            reservedmarshal_VkWriteDescriptorSetInlineUniformBlockEXT(vkStream, rootType, reinterpret_cast<const VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT:
         {
-            reservedmarshal_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(vkStream, reinterpret_cast<const VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_sample_locations
         case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT:
         {
-            reservedmarshal_VkSampleLocationsInfoEXT(vkStream, reinterpret_cast<const VkSampleLocationsInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkSampleLocationsInfoEXT(vkStream, rootType, reinterpret_cast<const VkSampleLocationsInfoEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT:
         {
-            reservedmarshal_VkRenderPassSampleLocationsBeginInfoEXT(vkStream, reinterpret_cast<const VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkRenderPassSampleLocationsBeginInfoEXT(vkStream, rootType, reinterpret_cast<const VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT:
         {
-            reservedmarshal_VkPipelineSampleLocationsStateCreateInfoEXT(vkStream, reinterpret_cast<const VkPipelineSampleLocationsStateCreateInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkPipelineSampleLocationsStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkPipelineSampleLocationsStateCreateInfoEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceSampleLocationsPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceSampleLocationsPropertiesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceSampleLocationsPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceSampleLocationsPropertiesEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_blend_operation_advanced
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT:
         {
-            reservedmarshal_VkPipelineColorBlendAdvancedStateCreateInfoEXT(vkStream, reinterpret_cast<const VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkPipelineColorBlendAdvancedStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_fragment_coverage_to_color
         case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV:
         {
-            reservedmarshal_VkPipelineCoverageToColorStateCreateInfoNV(vkStream, reinterpret_cast<const VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension), ptr);
+            reservedmarshal_VkPipelineCoverageToColorStateCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_framebuffer_mixed_samples
         case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV:
         {
-            reservedmarshal_VkPipelineCoverageModulationStateCreateInfoNV(vkStream, reinterpret_cast<const VkPipelineCoverageModulationStateCreateInfoNV*>(structExtension), ptr);
+            reservedmarshal_VkPipelineCoverageModulationStateCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkPipelineCoverageModulationStateCreateInfoNV*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_shader_sm_builtins
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV:
         {
-            reservedmarshal_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV:
         {
-            reservedmarshal_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
         case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT:
         {
-            reservedmarshal_VkDrmFormatModifierPropertiesListEXT(vkStream, reinterpret_cast<const VkDrmFormatModifierPropertiesListEXT*>(structExtension), ptr);
+            reservedmarshal_VkDrmFormatModifierPropertiesListEXT(vkStream, rootType, reinterpret_cast<const VkDrmFormatModifierPropertiesListEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT:
         {
-            reservedmarshal_VkImageDrmFormatModifierListCreateInfoEXT(vkStream, reinterpret_cast<const VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkImageDrmFormatModifierListCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT:
         {
-            reservedmarshal_VkImageDrmFormatModifierExplicitCreateInfoEXT(vkStream, reinterpret_cast<const VkImageDrmFormatModifierExplicitCreateInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkImageDrmFormatModifierExplicitCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkImageDrmFormatModifierExplicitCreateInfoEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_validation_cache
         case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT:
         {
-            reservedmarshal_VkShaderModuleValidationCacheCreateInfoEXT(vkStream, reinterpret_cast<const VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkShaderModuleValidationCacheCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_shading_rate_image
         case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV:
         {
-            reservedmarshal_VkPipelineViewportShadingRateImageStateCreateInfoNV(vkStream, reinterpret_cast<const VkPipelineViewportShadingRateImageStateCreateInfoNV*>(structExtension), ptr);
+            reservedmarshal_VkPipelineViewportShadingRateImageStateCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkPipelineViewportShadingRateImageStateCreateInfoNV*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV:
         {
-            reservedmarshal_VkPhysicalDeviceShadingRateImageFeaturesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceShadingRateImageFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV:
         {
-            reservedmarshal_VkPhysicalDeviceShadingRateImagePropertiesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceShadingRateImagePropertiesNV*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceShadingRateImagePropertiesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShadingRateImagePropertiesNV*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV:
         {
-            reservedmarshal_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(vkStream, reinterpret_cast<const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(structExtension), ptr);
+            reservedmarshal_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_ray_tracing
         case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV:
         {
-            reservedmarshal_VkWriteDescriptorSetAccelerationStructureNV(vkStream, reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureNV*>(structExtension), ptr);
+            reservedmarshal_VkWriteDescriptorSetAccelerationStructureNV(vkStream, rootType, reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureNV*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV:
         {
-            reservedmarshal_VkPhysicalDeviceRayTracingPropertiesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceRayTracingPropertiesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_representative_fragment_test
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV:
         {
-            reservedmarshal_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV:
         {
-            reservedmarshal_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(vkStream, reinterpret_cast<const VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(structExtension), ptr);
+            reservedmarshal_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_filter_cubic
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceImageViewImageFormatInfoEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceImageViewImageFormatInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceImageViewImageFormatInfoEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceImageViewImageFormatInfoEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT:
         {
-            reservedmarshal_VkFilterCubicImageViewImageFormatPropertiesEXT(vkStream, reinterpret_cast<const VkFilterCubicImageViewImageFormatPropertiesEXT*>(structExtension), ptr);
+            reservedmarshal_VkFilterCubicImageViewImageFormatPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkFilterCubicImageViewImageFormatPropertiesEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_global_priority
         case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT:
         {
-            reservedmarshal_VkDeviceQueueGlobalPriorityCreateInfoEXT(vkStream, reinterpret_cast<const VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkDeviceQueueGlobalPriorityCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_external_memory_host
         case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT:
         {
-            reservedmarshal_VkImportMemoryHostPointerInfoEXT(vkStream, reinterpret_cast<const VkImportMemoryHostPointerInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkImportMemoryHostPointerInfoEXT(vkStream, rootType, reinterpret_cast<const VkImportMemoryHostPointerInfoEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
         case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD:
         {
-            reservedmarshal_VkPipelineCompilerControlCreateInfoAMD(vkStream, reinterpret_cast<const VkPipelineCompilerControlCreateInfoAMD*>(structExtension), ptr);
+            reservedmarshal_VkPipelineCompilerControlCreateInfoAMD(vkStream, rootType, reinterpret_cast<const VkPipelineCompilerControlCreateInfoAMD*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_AMD_shader_core_properties
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD:
         {
-            reservedmarshal_VkPhysicalDeviceShaderCorePropertiesAMD(vkStream, reinterpret_cast<const VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceShaderCorePropertiesAMD(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
         case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD:
         {
-            reservedmarshal_VkDeviceMemoryOverallocationCreateInfoAMD(vkStream, reinterpret_cast<const VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension), ptr);
+            reservedmarshal_VkDeviceMemoryOverallocationCreateInfoAMD(vkStream, rootType, reinterpret_cast<const VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_vertex_attribute_divisor
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT:
         {
-            reservedmarshal_VkPipelineVertexInputDivisorStateCreateInfoEXT(vkStream, reinterpret_cast<const VkPipelineVertexInputDivisorStateCreateInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkPipelineVertexInputDivisorStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkPipelineVertexInputDivisorStateCreateInfoEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_GGP_frame_token
         case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP:
         {
-            reservedmarshal_VkPresentFrameTokenGGP(vkStream, reinterpret_cast<const VkPresentFrameTokenGGP*>(structExtension), ptr);
+            reservedmarshal_VkPresentFrameTokenGGP(vkStream, rootType, reinterpret_cast<const VkPresentFrameTokenGGP*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
         case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT:
         {
-            reservedmarshal_VkPipelineCreationFeedbackCreateInfoEXT(vkStream, reinterpret_cast<const VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkPipelineCreationFeedbackCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_compute_shader_derivatives
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV:
         {
-            reservedmarshal_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_mesh_shader
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV:
         {
-            reservedmarshal_VkPhysicalDeviceMeshShaderFeaturesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceMeshShaderFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV:
         {
-            reservedmarshal_VkPhysicalDeviceMeshShaderPropertiesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceMeshShaderPropertiesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV:
         {
-            reservedmarshal_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_shader_image_footprint
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV:
         {
-            reservedmarshal_VkPhysicalDeviceShaderImageFootprintFeaturesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceShaderImageFootprintFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_scissor_exclusive
         case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV:
         {
-            reservedmarshal_VkPipelineViewportExclusiveScissorStateCreateInfoNV(vkStream, reinterpret_cast<const VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(structExtension), ptr);
+            reservedmarshal_VkPipelineViewportExclusiveScissorStateCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV:
         {
-            reservedmarshal_VkPhysicalDeviceExclusiveScissorFeaturesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceExclusiveScissorFeaturesNV*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceExclusiveScissorFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceExclusiveScissorFeaturesNV*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
         case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV:
         {
-            reservedmarshal_VkQueueFamilyCheckpointPropertiesNV(vkStream, reinterpret_cast<const VkQueueFamilyCheckpointPropertiesNV*>(structExtension), ptr);
+            reservedmarshal_VkQueueFamilyCheckpointPropertiesNV(vkStream, rootType, reinterpret_cast<const VkQueueFamilyCheckpointPropertiesNV*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL:
         {
-            reservedmarshal_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(vkStream, reinterpret_cast<const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_INTEL_performance_query
         case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL:
         {
-            reservedmarshal_VkQueryPoolPerformanceQueryCreateInfoINTEL(vkStream, reinterpret_cast<const VkQueryPoolPerformanceQueryCreateInfoINTEL*>(structExtension), ptr);
+            reservedmarshal_VkQueryPoolPerformanceQueryCreateInfoINTEL(vkStream, rootType, reinterpret_cast<const VkQueryPoolPerformanceQueryCreateInfoINTEL*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_pci_bus_info
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT:
         {
-            reservedmarshal_VkPhysicalDevicePCIBusInfoPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDevicePCIBusInfoPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_AMD_display_native_hdr
         case VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD:
         {
-            reservedmarshal_VkDisplayNativeHdrSurfaceCapabilitiesAMD(vkStream, reinterpret_cast<const VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension), ptr);
+            reservedmarshal_VkDisplayNativeHdrSurfaceCapabilitiesAMD(vkStream, rootType, reinterpret_cast<const VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD:
         {
-            reservedmarshal_VkSwapchainDisplayNativeHdrCreateInfoAMD(vkStream, reinterpret_cast<const VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension), ptr);
+            reservedmarshal_VkSwapchainDisplayNativeHdrCreateInfoAMD(vkStream, rootType, reinterpret_cast<const VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension), ptr);
             break;
         }
 #endif
-#ifdef VK_GOOGLE_color_buffer
-        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE:
+#ifdef VK_EXT_fragment_density_map
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT:
         {
-            reservedmarshal_VkImportColorBufferGOOGLE(vkStream, reinterpret_cast<const VkImportColorBufferGOOGLE*>(structExtension), ptr);
+            switch(rootType)
+            {
+                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
+                {
+                    reservedmarshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension), ptr);
+                    break;
+                }
+                case VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO:
+                {
+                    reservedmarshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension), ptr);
+                    break;
+                }
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
+                {
+                    reservedmarshal_VkImportColorBufferGOOGLE(vkStream, rootType, reinterpret_cast<const VkImportColorBufferGOOGLE*>(structExtension), ptr);
+                    break;
+                }
+                default:
+                {
+                    reservedmarshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension), ptr);
+                    break;
+                }
+            }
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE:
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT:
         {
-            reservedmarshal_VkImportBufferGOOGLE(vkStream, reinterpret_cast<const VkImportBufferGOOGLE*>(structExtension), ptr);
+            switch(rootType)
+            {
+                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2:
+                {
+                    reservedmarshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension), ptr);
+                    break;
+                }
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
+                {
+                    reservedmarshal_VkImportPhysicalAddressGOOGLE(vkStream, rootType, reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension), ptr);
+                    break;
+                }
+                default:
+                {
+                    reservedmarshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension), ptr);
+                    break;
+                }
+            }
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
+        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT:
         {
-            reservedmarshal_VkImportPhysicalAddressGOOGLE(vkStream, reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension), ptr);
+            switch(rootType)
+            {
+                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO:
+                {
+                    reservedmarshal_VkRenderPassFragmentDensityMapCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension), ptr);
+                    break;
+                }
+                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2:
+                {
+                    reservedmarshal_VkRenderPassFragmentDensityMapCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension), ptr);
+                    break;
+                }
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
+                {
+                    reservedmarshal_VkImportBufferGOOGLE(vkStream, rootType, reinterpret_cast<const VkImportBufferGOOGLE*>(structExtension), ptr);
+                    break;
+                }
+                default:
+                {
+                    reservedmarshal_VkRenderPassFragmentDensityMapCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension), ptr);
+                    break;
+                }
+            }
             break;
         }
 #endif
 #ifdef VK_EXT_subgroup_size_control
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT:
         {
-            reservedmarshal_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(vkStream, reinterpret_cast<const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_AMD_shader_core_properties2
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD:
         {
-            reservedmarshal_VkPhysicalDeviceShaderCoreProperties2AMD(vkStream, reinterpret_cast<const VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceShaderCoreProperties2AMD(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_AMD_device_coherent_memory
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD:
         {
-            reservedmarshal_VkPhysicalDeviceCoherentMemoryFeaturesAMD(vkStream, reinterpret_cast<const VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceCoherentMemoryFeaturesAMD(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_shader_image_atomic_int64
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_memory_budget
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceMemoryBudgetPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceMemoryBudgetPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_memory_priority
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceMemoryPriorityFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceMemoryPriorityFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT:
         {
-            reservedmarshal_VkMemoryPriorityAllocateInfoEXT(vkStream, reinterpret_cast<const VkMemoryPriorityAllocateInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkMemoryPriorityAllocateInfoEXT(vkStream, rootType, reinterpret_cast<const VkMemoryPriorityAllocateInfoEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_dedicated_allocation_image_aliasing
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV:
         {
-            reservedmarshal_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_buffer_device_address
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT:
         {
-            reservedmarshal_VkBufferDeviceAddressCreateInfoEXT(vkStream, reinterpret_cast<const VkBufferDeviceAddressCreateInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkBufferDeviceAddressCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkBufferDeviceAddressCreateInfoEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_validation_features
         case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT:
         {
-            reservedmarshal_VkValidationFeaturesEXT(vkStream, reinterpret_cast<const VkValidationFeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkValidationFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkValidationFeaturesEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_cooperative_matrix
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV:
         {
-            reservedmarshal_VkPhysicalDeviceCooperativeMatrixFeaturesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceCooperativeMatrixFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV:
         {
-            reservedmarshal_VkPhysicalDeviceCooperativeMatrixPropertiesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceCooperativeMatrixPropertiesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_coverage_reduction_mode
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV:
         {
-            reservedmarshal_VkPhysicalDeviceCoverageReductionModeFeaturesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceCoverageReductionModeFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV:
         {
-            reservedmarshal_VkPipelineCoverageReductionStateCreateInfoNV(vkStream, reinterpret_cast<const VkPipelineCoverageReductionStateCreateInfoNV*>(structExtension), ptr);
+            reservedmarshal_VkPipelineCoverageReductionStateCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkPipelineCoverageReductionStateCreateInfoNV*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_ycbcr_image_arrays
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_full_screen_exclusive
         case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT:
         {
-            reservedmarshal_VkSurfaceFullScreenExclusiveInfoEXT(vkStream, reinterpret_cast<const VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkSurfaceFullScreenExclusiveInfoEXT(vkStream, rootType, reinterpret_cast<const VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT:
         {
-            reservedmarshal_VkSurfaceCapabilitiesFullScreenExclusiveEXT(vkStream, reinterpret_cast<const VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(structExtension), ptr);
+            reservedmarshal_VkSurfaceCapabilitiesFullScreenExclusiveEXT(vkStream, rootType, reinterpret_cast<const VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT:
         {
-            reservedmarshal_VkSurfaceFullScreenExclusiveWin32InfoEXT(vkStream, reinterpret_cast<const VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkSurfaceFullScreenExclusiveWin32InfoEXT(vkStream, rootType, reinterpret_cast<const VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_line_rasterization
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceLineRasterizationFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceLineRasterizationFeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceLineRasterizationFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceLineRasterizationFeaturesEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceLineRasterizationPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceLineRasterizationPropertiesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceLineRasterizationPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceLineRasterizationPropertiesEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT:
         {
-            reservedmarshal_VkPipelineRasterizationLineStateCreateInfoEXT(vkStream, reinterpret_cast<const VkPipelineRasterizationLineStateCreateInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkPipelineRasterizationLineStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkPipelineRasterizationLineStateCreateInfoEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_shader_atomic_float
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_index_type_uint8
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_device_generated_commands
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV:
         {
-            reservedmarshal_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV:
         {
-            reservedmarshal_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV:
         {
-            reservedmarshal_VkGraphicsPipelineShaderGroupsCreateInfoNV(vkStream, reinterpret_cast<const VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension), ptr);
+            reservedmarshal_VkGraphicsPipelineShaderGroupsCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_texel_buffer_alignment
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_QCOM_render_pass_transform
         case VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM:
         {
-            reservedmarshal_VkRenderPassTransformBeginInfoQCOM(vkStream, reinterpret_cast<const VkRenderPassTransformBeginInfoQCOM*>(structExtension), ptr);
+            reservedmarshal_VkRenderPassTransformBeginInfoQCOM(vkStream, rootType, reinterpret_cast<const VkRenderPassTransformBeginInfoQCOM*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM:
         {
-            reservedmarshal_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(vkStream, reinterpret_cast<const VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(structExtension), ptr);
+            reservedmarshal_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(vkStream, rootType, reinterpret_cast<const VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_device_memory_report
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT:
         {
-            reservedmarshal_VkDeviceDeviceMemoryReportCreateInfoEXT(vkStream, reinterpret_cast<const VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkDeviceDeviceMemoryReportCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_robustness2
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceRobustness2FeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceRobustness2FeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceRobustness2PropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceRobustness2PropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_custom_border_color
         case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT:
         {
-            reservedmarshal_VkSamplerCustomBorderColorCreateInfoEXT(vkStream, reinterpret_cast<const VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkSamplerCustomBorderColorCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceCustomBorderColorPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceCustomBorderColorPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceCustomBorderColorFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceCustomBorderColorFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_private_data
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDevicePrivateDataFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDevicePrivateDataFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT:
         {
-            reservedmarshal_VkDevicePrivateDataCreateInfoEXT(vkStream, reinterpret_cast<const VkDevicePrivateDataCreateInfoEXT*>(structExtension), ptr);
+            reservedmarshal_VkDevicePrivateDataCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkDevicePrivateDataCreateInfoEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_device_diagnostics_config
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV:
         {
-            reservedmarshal_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV:
         {
-            reservedmarshal_VkDeviceDiagnosticsConfigCreateInfoNV(vkStream, reinterpret_cast<const VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension), ptr);
+            reservedmarshal_VkDeviceDiagnosticsConfigCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV:
         {
-            reservedmarshal_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV:
         {
-            reservedmarshal_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(vkStream, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV:
         {
-            reservedmarshal_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(vkStream, reinterpret_cast<const VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(structExtension), ptr);
+            reservedmarshal_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_density_map2
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
         case VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM:
         {
-            reservedmarshal_VkCopyCommandTransformInfoQCOM(vkStream, reinterpret_cast<const VkCopyCommandTransformInfoQCOM*>(structExtension), ptr);
+            reservedmarshal_VkCopyCommandTransformInfoQCOM(vkStream, rootType, reinterpret_cast<const VkCopyCommandTransformInfoQCOM*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_image_robustness
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDeviceImageRobustnessFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceImageRobustnessFeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceImageRobustnessFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceImageRobustnessFeaturesEXT*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_4444_formats
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT:
         {
-            reservedmarshal_VkPhysicalDevice4444FormatsFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDevice4444FormatsFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_GOOGLE_gfxstream
+        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE:
+        {
+            reservedmarshal_VkImportColorBufferGOOGLE(vkStream, rootType, reinterpret_cast<const VkImportColorBufferGOOGLE*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE:
+        {
+            reservedmarshal_VkImportBufferGOOGLE(vkStream, rootType, reinterpret_cast<const VkImportBufferGOOGLE*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
+        {
+            reservedmarshal_VkImportPhysicalAddressGOOGLE(vkStream, rootType, reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
         case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR:
         {
-            reservedmarshal_VkWriteDescriptorSetAccelerationStructureKHR(vkStream, reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureKHR*>(structExtension), ptr);
+            reservedmarshal_VkWriteDescriptorSetAccelerationStructureKHR(vkStream, rootType, reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureKHR*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR:
         {
-            reservedmarshal_VkPhysicalDeviceAccelerationStructureFeaturesKHR(vkStream, reinterpret_cast<const VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceAccelerationStructureFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR:
         {
-            reservedmarshal_VkPhysicalDeviceAccelerationStructurePropertiesKHR(vkStream, reinterpret_cast<const VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceAccelerationStructurePropertiesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR:
         {
-            reservedmarshal_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(vkStream, reinterpret_cast<const VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(structExtension), ptr);
             break;
         }
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR:
         {
-            reservedmarshal_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(vkStream, reinterpret_cast<const VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(structExtension), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_ray_query
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR:
         {
-            reservedmarshal_VkPhysicalDeviceRayQueryFeaturesKHR(vkStream, reinterpret_cast<const VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension), ptr);
+            reservedmarshal_VkPhysicalDeviceRayQueryFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension), ptr);
             break;
         }
 #endif
diff --git a/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.h b/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.h
index ac5f12a..6984b87 100644
--- a/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.h
+++ b/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.h
@@ -46,546 +46,655 @@
 #ifdef VK_VERSION_1_0
 void reservedmarshal_VkExtent2D(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExtent2D* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkExtent3D(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExtent3D* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkOffset2D(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkOffset2D* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkOffset3D(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkOffset3D* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkRect2D(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRect2D* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkBaseInStructure(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBaseInStructure* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkBaseOutStructure(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBaseOutStructure* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkBufferMemoryBarrier(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferMemoryBarrier* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDispatchIndirectCommand(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDispatchIndirectCommand* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDrawIndexedIndirectCommand(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDrawIndexedIndirectCommand* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDrawIndirectCommand(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDrawIndirectCommand* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkImageSubresourceRange(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageSubresourceRange* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkImageMemoryBarrier(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageMemoryBarrier* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkMemoryBarrier(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryBarrier* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkAllocationCallbacks(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAllocationCallbacks* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkApplicationInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkApplicationInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFormatProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkImageFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageFormatProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkInstanceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkInstanceCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkMemoryHeap(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryHeap* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkMemoryType(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryType* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFeatures* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceLimits(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceLimits* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceMemoryProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceSparseProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSparseProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkQueueFamilyProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkQueueFamilyProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDeviceQueueCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceQueueCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDeviceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkExtensionProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExtensionProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkLayerProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkLayerProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSubmitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubmitInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkMappedMemoryRange(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMappedMemoryRange* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkMemoryAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryAllocateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkMemoryRequirements(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryRequirements* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSparseMemoryBind(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseMemoryBind* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSparseBufferMemoryBindInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseBufferMemoryBindInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSparseImageOpaqueMemoryBindInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseImageOpaqueMemoryBindInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkImageSubresource(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageSubresource* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSparseImageMemoryBind(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseImageMemoryBind* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSparseImageMemoryBindInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseImageMemoryBindInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkBindSparseInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindSparseInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSparseImageFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseImageFormatProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSparseImageMemoryRequirements(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseImageMemoryRequirements* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkFenceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFenceCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSemaphoreCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSemaphoreCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkEventCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkEventCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkQueryPoolCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkQueryPoolCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkBufferCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkBufferViewCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferViewCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkImageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSubresourceLayout(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubresourceLayout* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkComponentMapping(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkComponentMapping* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkImageViewCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageViewCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkShaderModuleCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkShaderModuleCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineCacheCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCacheCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSpecializationMapEntry(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSpecializationMapEntry* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSpecializationInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSpecializationInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineShaderStageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineShaderStageCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkComputePipelineCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkComputePipelineCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkVertexInputBindingDescription(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkVertexInputBindingDescription* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkVertexInputAttributeDescription(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkVertexInputAttributeDescription* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineVertexInputStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineVertexInputStateCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineInputAssemblyStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineInputAssemblyStateCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineTessellationStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineTessellationStateCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkViewport(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkViewport* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineViewportStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineViewportStateCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineRasterizationStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRasterizationStateCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineMultisampleStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineMultisampleStateCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkStencilOpState(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkStencilOpState* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineDepthStencilStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineDepthStencilStateCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineColorBlendAttachmentState(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineColorBlendAttachmentState* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineColorBlendStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineColorBlendStateCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineDynamicStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineDynamicStateCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkGraphicsPipelineCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGraphicsPipelineCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPushConstantRange(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPushConstantRange* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineLayoutCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineLayoutCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSamplerCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSamplerCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkCopyDescriptorSet(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyDescriptorSet* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDescriptorBufferInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorBufferInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDescriptorImageInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorImageInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDescriptorPoolSize(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorPoolSize* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDescriptorPoolCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorPoolCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDescriptorSetAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetAllocateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDescriptorSetLayoutBinding(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutBinding* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDescriptorSetLayoutCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkWriteDescriptorSet(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWriteDescriptorSet* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkAttachmentDescription(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentDescription* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkAttachmentReference(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentReference* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkFramebufferCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFramebufferCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSubpassDescription(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassDescription* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSubpassDependency(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassDependency* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkRenderPassCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkCommandPoolCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCommandPoolCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkCommandBufferAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCommandBufferAllocateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkCommandBufferInheritanceInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCommandBufferInheritanceInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkCommandBufferBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCommandBufferBeginInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkBufferCopy(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferCopy* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkImageSubresourceLayers(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageSubresourceLayers* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkBufferImageCopy(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferImageCopy* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkClearColorValue(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkClearColorValue* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkClearDepthStencilValue(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkClearDepthStencilValue* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkClearValue(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkClearValue* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkClearAttachment(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkClearAttachment* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkClearRect(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkClearRect* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkImageBlit(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageBlit* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkImageCopy(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageCopy* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkImageResolve(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageResolve* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkRenderPassBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassBeginInfo* forMarshaling,
     uint8_t** ptr);
 
@@ -593,191 +702,229 @@
 #ifdef VK_VERSION_1_1
 void reservedmarshal_VkPhysicalDeviceSubgroupProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSubgroupProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkBindBufferMemoryInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindBufferMemoryInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkBindImageMemoryInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindImageMemoryInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDevice16BitStorageFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevice16BitStorageFeatures* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkMemoryDedicatedRequirements(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryDedicatedRequirements* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkMemoryDedicatedAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryDedicatedAllocateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkMemoryAllocateFlagsInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryAllocateFlagsInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDeviceGroupRenderPassBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupRenderPassBeginInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDeviceGroupCommandBufferBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupCommandBufferBeginInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDeviceGroupSubmitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupSubmitInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDeviceGroupBindSparseInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupBindSparseInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkBindBufferMemoryDeviceGroupInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindBufferMemoryDeviceGroupInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkBindImageMemoryDeviceGroupInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindImageMemoryDeviceGroupInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceGroupProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceGroupProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDeviceGroupDeviceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupDeviceCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkBufferMemoryRequirementsInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferMemoryRequirementsInfo2* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkImageMemoryRequirementsInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageMemoryRequirementsInfo2* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkImageSparseMemoryRequirementsInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageSparseMemoryRequirementsInfo2* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkMemoryRequirements2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryRequirements2* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSparseImageMemoryRequirements2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseImageMemoryRequirements2* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceFeatures2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFeatures2* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceProperties2* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkFormatProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFormatProperties2* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkImageFormatProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageFormatProperties2* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceImageFormatInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageFormatInfo2* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkQueueFamilyProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkQueueFamilyProperties2* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceMemoryProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryProperties2* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSparseImageFormatProperties2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSparseImageFormatProperties2* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceSparseImageFormatInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSparseImageFormatInfo2* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDevicePointClippingProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePointClippingProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkInputAttachmentAspectReference(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkInputAttachmentAspectReference* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkRenderPassInputAttachmentAspectCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassInputAttachmentAspectCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkImageViewUsageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageViewUsageCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineTessellationDomainOriginStateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineTessellationDomainOriginStateCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkRenderPassMultiviewCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassMultiviewCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceMultiviewFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMultiviewFeatures* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceMultiviewProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMultiviewProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceVariablePointersFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVariablePointersFeatures* forMarshaling,
     uint8_t** ptr);
 
@@ -785,151 +932,181 @@
 
 void reservedmarshal_VkPhysicalDeviceProtectedMemoryFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceProtectedMemoryFeatures* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceProtectedMemoryProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceProtectedMemoryProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDeviceQueueInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceQueueInfo2* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkProtectedSubmitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkProtectedSubmitInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSamplerYcbcrConversionCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSamplerYcbcrConversionCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSamplerYcbcrConversionInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSamplerYcbcrConversionInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkBindImagePlaneMemoryInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindImagePlaneMemoryInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkImagePlaneMemoryRequirementsInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImagePlaneMemoryRequirementsInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSamplerYcbcrConversionFeatures* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSamplerYcbcrConversionImageFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSamplerYcbcrConversionImageFormatProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDescriptorUpdateTemplateEntry(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorUpdateTemplateEntry* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDescriptorUpdateTemplateCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorUpdateTemplateCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkExternalMemoryProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalMemoryProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceExternalImageFormatInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalImageFormatInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkExternalImageFormatProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalImageFormatProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceExternalBufferInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalBufferInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkExternalBufferProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalBufferProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceIDProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceIDProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkExternalMemoryImageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalMemoryImageCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkExternalMemoryBufferCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalMemoryBufferCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkExportMemoryAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportMemoryAllocateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceExternalFenceInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalFenceInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkExternalFenceProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalFenceProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkExportFenceCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportFenceCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkExportSemaphoreCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportSemaphoreCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceExternalSemaphoreInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalSemaphoreInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkExternalSemaphoreProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalSemaphoreProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceMaintenance3Properties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMaintenance3Properties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDescriptorSetLayoutSupport(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutSupport* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceShaderDrawParametersFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderDrawParametersFeatures* forMarshaling,
     uint8_t** ptr);
 
@@ -939,256 +1116,307 @@
 #ifdef VK_VERSION_1_2
 void reservedmarshal_VkPhysicalDeviceVulkan11Features(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan11Features* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceVulkan11Properties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan11Properties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceVulkan12Features(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan12Features* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkConformanceVersion(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkConformanceVersion* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceVulkan12Properties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkan12Properties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkImageFormatListCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageFormatListCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkAttachmentDescription2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentDescription2* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkAttachmentReference2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentReference2* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSubpassDescription2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassDescription2* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSubpassDependency2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassDependency2* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkRenderPassCreateInfo2(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassCreateInfo2* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSubpassBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassBeginInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSubpassEndInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassEndInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDevice8BitStorageFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevice8BitStorageFeatures* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceDriverProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDriverProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceShaderAtomicInt64Features(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderAtomicInt64Features* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceShaderFloat16Int8Features(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderFloat16Int8Features* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceFloatControlsProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFloatControlsProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetLayoutBindingFlagsCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceDescriptorIndexingFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDescriptorIndexingFeatures* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceDescriptorIndexingProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDescriptorIndexingProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetVariableDescriptorCountAllocateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupport(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorSetVariableDescriptorCountLayoutSupport* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSubpassDescriptionDepthStencilResolve(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassDescriptionDepthStencilResolve* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceDepthStencilResolveProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDepthStencilResolveProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceScalarBlockLayoutFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceScalarBlockLayoutFeatures* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkImageStencilUsageCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageStencilUsageCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSamplerReductionModeCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSamplerReductionModeCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceSamplerFilterMinmaxProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSamplerFilterMinmaxProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceVulkanMemoryModelFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVulkanMemoryModelFeatures* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceImagelessFramebufferFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceImagelessFramebufferFeatures* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkFramebufferAttachmentImageInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFramebufferAttachmentImageInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkFramebufferAttachmentsCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFramebufferAttachmentsCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkRenderPassAttachmentBeginInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassAttachmentBeginInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceUniformBufferStandardLayoutFeatures* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkAttachmentReferenceStencilLayout(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentReferenceStencilLayout* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkAttachmentDescriptionStencilLayout(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentDescriptionStencilLayout* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceHostQueryResetFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceHostQueryResetFeatures* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceTimelineSemaphoreFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTimelineSemaphoreFeatures* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceTimelineSemaphoreProperties(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTimelineSemaphoreProperties* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSemaphoreTypeCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSemaphoreTypeCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkTimelineSemaphoreSubmitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkTimelineSemaphoreSubmitInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSemaphoreWaitInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSemaphoreWaitInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSemaphoreSignalInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSemaphoreSignalInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceBufferDeviceAddressFeatures(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceBufferDeviceAddressFeatures* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkBufferDeviceAddressInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferDeviceAddressInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkBufferOpaqueCaptureAddressCreateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferOpaqueCaptureAddressCreateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkMemoryOpaqueCaptureAddressAllocateInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryOpaqueCaptureAddressAllocateInfo* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDeviceMemoryOpaqueCaptureAddressInfo(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceMemoryOpaqueCaptureAddressInfo* forMarshaling,
     uint8_t** ptr);
 
@@ -1196,11 +1424,13 @@
 #ifdef VK_KHR_surface
 void reservedmarshal_VkSurfaceCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceCapabilitiesKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSurfaceFormatKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceFormatKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1208,41 +1438,49 @@
 #ifdef VK_KHR_swapchain
 void reservedmarshal_VkSwapchainCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSwapchainCreateInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPresentInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPresentInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkImageSwapchainCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageSwapchainCreateInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkBindImageMemorySwapchainInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindImageMemorySwapchainInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkAcquireNextImageInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAcquireNextImageInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDeviceGroupPresentCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupPresentCapabilitiesKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDeviceGroupPresentInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupPresentInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDeviceGroupSwapchainCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceGroupSwapchainCreateInfoKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1250,36 +1488,43 @@
 #ifdef VK_KHR_display
 void reservedmarshal_VkDisplayModeParametersKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayModeParametersKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDisplayModeCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayModeCreateInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDisplayModePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayModePropertiesKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDisplayPlaneCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPlaneCapabilitiesKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDisplayPlanePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPlanePropertiesKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDisplayPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPropertiesKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDisplaySurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplaySurfaceCreateInfoKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1287,6 +1532,7 @@
 #ifdef VK_KHR_display_swapchain
 void reservedmarshal_VkDisplayPresentInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPresentInfoKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1294,6 +1540,7 @@
 #ifdef VK_KHR_xlib_surface
 void reservedmarshal_VkXlibSurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkXlibSurfaceCreateInfoKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1301,6 +1548,7 @@
 #ifdef VK_KHR_xcb_surface
 void reservedmarshal_VkXcbSurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkXcbSurfaceCreateInfoKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1308,6 +1556,7 @@
 #ifdef VK_KHR_wayland_surface
 void reservedmarshal_VkWaylandSurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWaylandSurfaceCreateInfoKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1315,6 +1564,7 @@
 #ifdef VK_KHR_android_surface
 void reservedmarshal_VkAndroidSurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAndroidSurfaceCreateInfoKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1322,6 +1572,7 @@
 #ifdef VK_KHR_win32_surface
 void reservedmarshal_VkWin32SurfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWin32SurfaceCreateInfoKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1407,21 +1658,25 @@
 #ifdef VK_KHR_external_memory_win32
 void reservedmarshal_VkImportMemoryWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportMemoryWin32HandleInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkExportMemoryWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportMemoryWin32HandleInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkMemoryWin32HandlePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryWin32HandlePropertiesKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkMemoryGetWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryGetWin32HandleInfoKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1429,16 +1684,19 @@
 #ifdef VK_KHR_external_memory_fd
 void reservedmarshal_VkImportMemoryFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportMemoryFdInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkMemoryFdPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryFdPropertiesKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkMemoryGetFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryGetFdInfoKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1446,6 +1704,7 @@
 #ifdef VK_KHR_win32_keyed_mutex
 void reservedmarshal_VkWin32KeyedMutexAcquireReleaseInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWin32KeyedMutexAcquireReleaseInfoKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1463,21 +1722,25 @@
 #ifdef VK_KHR_external_semaphore_win32
 void reservedmarshal_VkImportSemaphoreWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportSemaphoreWin32HandleInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkExportSemaphoreWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportSemaphoreWin32HandleInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkD3D12FenceSubmitInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkD3D12FenceSubmitInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSemaphoreGetWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSemaphoreGetWin32HandleInfoKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1485,11 +1748,13 @@
 #ifdef VK_KHR_external_semaphore_fd
 void reservedmarshal_VkImportSemaphoreFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportSemaphoreFdInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSemaphoreGetFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSemaphoreGetFdInfoKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1497,6 +1762,7 @@
 #ifdef VK_KHR_push_descriptor
 void reservedmarshal_VkPhysicalDevicePushDescriptorPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePushDescriptorPropertiesKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1514,16 +1780,19 @@
 #ifdef VK_KHR_incremental_present
 void reservedmarshal_VkRectLayerKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRectLayerKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPresentRegionKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPresentRegionKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPresentRegionsKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPresentRegionsKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1563,6 +1832,7 @@
 #ifdef VK_KHR_shared_presentable_image
 void reservedmarshal_VkSharedPresentSurfaceCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSharedPresentSurfaceCapabilitiesKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1580,16 +1850,19 @@
 #ifdef VK_KHR_external_fence_win32
 void reservedmarshal_VkImportFenceWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportFenceWin32HandleInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkExportFenceWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportFenceWin32HandleInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkFenceGetWin32HandleInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFenceGetWin32HandleInfoKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1597,11 +1870,13 @@
 #ifdef VK_KHR_external_fence_fd
 void reservedmarshal_VkImportFenceFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportFenceFdInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkFenceGetFdInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFenceGetFdInfoKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1609,41 +1884,49 @@
 #ifdef VK_KHR_performance_query
 void reservedmarshal_VkPhysicalDevicePerformanceQueryFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePerformanceQueryFeaturesKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDevicePerformanceQueryPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePerformanceQueryPropertiesKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPerformanceCounterKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceCounterKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPerformanceCounterDescriptionKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceCounterDescriptionKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkQueryPoolPerformanceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkQueryPoolPerformanceCreateInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPerformanceCounterResultKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceCounterResultKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkAcquireProfilingLockInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAcquireProfilingLockInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPerformanceQuerySubmitInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceQuerySubmitInfoKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1663,16 +1946,19 @@
 #ifdef VK_KHR_get_surface_capabilities2
 void reservedmarshal_VkPhysicalDeviceSurfaceInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSurfaceInfo2KHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSurfaceCapabilities2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceCapabilities2KHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSurfaceFormat2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceFormat2KHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1686,26 +1972,31 @@
 #ifdef VK_KHR_get_display_properties2
 void reservedmarshal_VkDisplayProperties2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayProperties2KHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDisplayPlaneProperties2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPlaneProperties2KHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDisplayModeProperties2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayModeProperties2KHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDisplayPlaneInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPlaneInfo2KHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDisplayPlaneCapabilities2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPlaneCapabilities2KHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1759,11 +2050,13 @@
 #ifdef VK_KHR_portability_subset
 void reservedmarshal_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePortabilitySubsetFeaturesKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePortabilitySubsetPropertiesKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1791,6 +2084,7 @@
 #ifdef VK_KHR_shader_clock
 void reservedmarshal_VkPhysicalDeviceShaderClockFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderClockFeaturesKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1834,6 +2128,7 @@
 #ifdef VK_KHR_shader_terminate_invocation
 void reservedmarshal_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1841,26 +2136,31 @@
 #ifdef VK_KHR_fragment_shading_rate
 void reservedmarshal_VkFragmentShadingRateAttachmentInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFragmentShadingRateAttachmentInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineFragmentShadingRateStateCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineFragmentShadingRateStateCreateInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateFeaturesKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRatePropertiesKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceFragmentShadingRateKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1870,6 +2170,7 @@
 #ifdef VK_KHR_surface_protected_capabilities
 void reservedmarshal_VkSurfaceProtectedCapabilitiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceProtectedCapabilitiesKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1903,36 +2204,43 @@
 #ifdef VK_KHR_pipeline_executable_properties
 void reservedmarshal_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineExecutablePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineExecutablePropertiesKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineExecutableInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineExecutableInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineExecutableStatisticValueKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineExecutableStatisticValueKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineExecutableStatisticKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineExecutableStatisticKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineExecutableInternalRepresentationKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineExecutableInternalRepresentationKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1940,6 +2248,7 @@
 #ifdef VK_KHR_pipeline_library
 void reservedmarshal_VkPipelineLibraryCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineLibraryCreateInfoKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -1949,56 +2258,67 @@
 #ifdef VK_KHR_copy_commands2
 void reservedmarshal_VkBufferCopy2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferCopy2KHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkCopyBufferInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyBufferInfo2KHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkImageCopy2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageCopy2KHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkCopyImageInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyImageInfo2KHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkBufferImageCopy2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferImageCopy2KHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkCopyBufferToImageInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyBufferToImageInfo2KHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkCopyImageToBufferInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyImageToBufferInfo2KHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkImageBlit2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageBlit2KHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkBlitImageInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBlitImageInfo2KHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkImageResolve2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageResolve2KHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkResolveImageInfo2KHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkResolveImageInfo2KHR* forMarshaling,
     uint8_t** ptr);
 
@@ -2006,6 +2326,7 @@
 #ifdef VK_ANDROID_native_buffer
 void reservedmarshal_VkNativeBufferANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkNativeBufferANDROID* forMarshaling,
     uint8_t** ptr);
 
@@ -2013,6 +2334,7 @@
 #ifdef VK_EXT_debug_report
 void reservedmarshal_VkDebugReportCallbackCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugReportCallbackCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -2026,6 +2348,7 @@
 #ifdef VK_AMD_rasterization_order
 void reservedmarshal_VkPipelineRasterizationStateRasterizationOrderAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRasterizationStateRasterizationOrderAMD* forMarshaling,
     uint8_t** ptr);
 
@@ -2037,16 +2360,19 @@
 #ifdef VK_EXT_debug_marker
 void reservedmarshal_VkDebugMarkerObjectNameInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugMarkerObjectNameInfoEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDebugMarkerObjectTagInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugMarkerObjectTagInfoEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDebugMarkerMarkerInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugMarkerMarkerInfoEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -2056,16 +2382,19 @@
 #ifdef VK_NV_dedicated_allocation
 void reservedmarshal_VkDedicatedAllocationImageCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDedicatedAllocationImageCreateInfoNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDedicatedAllocationBufferCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDedicatedAllocationBufferCreateInfoNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDedicatedAllocationMemoryAllocateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDedicatedAllocationMemoryAllocateInfoNV* forMarshaling,
     uint8_t** ptr);
 
@@ -2073,16 +2402,19 @@
 #ifdef VK_EXT_transform_feedback
 void reservedmarshal_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTransformFeedbackFeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTransformFeedbackPropertiesEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineRasterizationStateStreamCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRasterizationStateStreamCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -2090,11 +2422,13 @@
 #ifdef VK_NVX_image_view_handle
 void reservedmarshal_VkImageViewHandleInfoNVX(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageViewHandleInfoNVX* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkImageViewAddressPropertiesNVX(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageViewAddressPropertiesNVX* forMarshaling,
     uint8_t** ptr);
 
@@ -2110,6 +2444,7 @@
 #ifdef VK_AMD_texture_gather_bias_lod
 void reservedmarshal_VkTextureLODGatherFormatPropertiesAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkTextureLODGatherFormatPropertiesAMD* forMarshaling,
     uint8_t** ptr);
 
@@ -2117,11 +2452,13 @@
 #ifdef VK_AMD_shader_info
 void reservedmarshal_VkShaderResourceUsageAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkShaderResourceUsageAMD* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkShaderStatisticsInfoAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkShaderStatisticsInfoAMD* forMarshaling,
     uint8_t** ptr);
 
@@ -2131,6 +2468,7 @@
 #ifdef VK_GGP_stream_descriptor_surface
 void reservedmarshal_VkStreamDescriptorSurfaceCreateInfoGGP(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkStreamDescriptorSurfaceCreateInfoGGP* forMarshaling,
     uint8_t** ptr);
 
@@ -2138,6 +2476,7 @@
 #ifdef VK_NV_corner_sampled_image
 void reservedmarshal_VkPhysicalDeviceCornerSampledImageFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCornerSampledImageFeaturesNV* forMarshaling,
     uint8_t** ptr);
 
@@ -2147,6 +2486,7 @@
 #ifdef VK_NV_external_memory_capabilities
 void reservedmarshal_VkExternalImageFormatPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalImageFormatPropertiesNV* forMarshaling,
     uint8_t** ptr);
 
@@ -2154,11 +2494,13 @@
 #ifdef VK_NV_external_memory
 void reservedmarshal_VkExternalMemoryImageCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalMemoryImageCreateInfoNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkExportMemoryAllocateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportMemoryAllocateInfoNV* forMarshaling,
     uint8_t** ptr);
 
@@ -2166,11 +2508,13 @@
 #ifdef VK_NV_external_memory_win32
 void reservedmarshal_VkImportMemoryWin32HandleInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportMemoryWin32HandleInfoNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkExportMemoryWin32HandleInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExportMemoryWin32HandleInfoNV* forMarshaling,
     uint8_t** ptr);
 
@@ -2178,6 +2522,7 @@
 #ifdef VK_NV_win32_keyed_mutex
 void reservedmarshal_VkWin32KeyedMutexAcquireReleaseInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWin32KeyedMutexAcquireReleaseInfoNV* forMarshaling,
     uint8_t** ptr);
 
@@ -2185,6 +2530,7 @@
 #ifdef VK_EXT_validation_flags
 void reservedmarshal_VkValidationFlagsEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkValidationFlagsEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -2192,6 +2538,7 @@
 #ifdef VK_NN_vi_surface
 void reservedmarshal_VkViSurfaceCreateInfoNN(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkViSurfaceCreateInfoNN* forMarshaling,
     uint8_t** ptr);
 
@@ -2203,6 +2550,7 @@
 #ifdef VK_EXT_texture_compression_astc_hdr
 void reservedmarshal_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -2210,11 +2558,13 @@
 #ifdef VK_EXT_astc_decode_mode
 void reservedmarshal_VkImageViewASTCDecodeModeEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageViewASTCDecodeModeEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceASTCDecodeFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceASTCDecodeFeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -2222,16 +2572,19 @@
 #ifdef VK_EXT_conditional_rendering
 void reservedmarshal_VkConditionalRenderingBeginInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkConditionalRenderingBeginInfoEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceConditionalRenderingFeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCommandBufferInheritanceConditionalRenderingInfoEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -2239,11 +2592,13 @@
 #ifdef VK_NV_clip_space_w_scaling
 void reservedmarshal_VkViewportWScalingNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkViewportWScalingNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineViewportWScalingStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineViewportWScalingStateCreateInfoNV* forMarshaling,
     uint8_t** ptr);
 
@@ -2255,6 +2610,7 @@
 #ifdef VK_EXT_display_surface_counter
 void reservedmarshal_VkSurfaceCapabilities2EXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceCapabilities2EXT* forMarshaling,
     uint8_t** ptr);
 
@@ -2262,21 +2618,25 @@
 #ifdef VK_EXT_display_control
 void reservedmarshal_VkDisplayPowerInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayPowerInfoEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDeviceEventInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceEventInfoEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDisplayEventInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayEventInfoEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSwapchainCounterCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSwapchainCounterCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -2284,21 +2644,25 @@
 #ifdef VK_GOOGLE_display_timing
 void reservedmarshal_VkRefreshCycleDurationGOOGLE(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRefreshCycleDurationGOOGLE* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPastPresentationTimingGOOGLE(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPastPresentationTimingGOOGLE* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPresentTimeGOOGLE(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPresentTimeGOOGLE* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPresentTimesInfoGOOGLE(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPresentTimesInfoGOOGLE* forMarshaling,
     uint8_t** ptr);
 
@@ -2312,6 +2676,7 @@
 #ifdef VK_NVX_multiview_per_view_attributes
 void reservedmarshal_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* forMarshaling,
     uint8_t** ptr);
 
@@ -2319,11 +2684,13 @@
 #ifdef VK_NV_viewport_swizzle
 void reservedmarshal_VkViewportSwizzleNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkViewportSwizzleNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineViewportSwizzleStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineViewportSwizzleStateCreateInfoNV* forMarshaling,
     uint8_t** ptr);
 
@@ -2331,11 +2698,13 @@
 #ifdef VK_EXT_discard_rectangles
 void reservedmarshal_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDiscardRectanglePropertiesEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineDiscardRectangleStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineDiscardRectangleStateCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -2343,11 +2712,13 @@
 #ifdef VK_EXT_conservative_rasterization
 void reservedmarshal_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceConservativeRasterizationPropertiesEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineRasterizationConservativeStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRasterizationConservativeStateCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -2355,11 +2726,13 @@
 #ifdef VK_EXT_depth_clip_enable
 void reservedmarshal_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDepthClipEnableFeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRasterizationDepthClipStateCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -2369,11 +2742,13 @@
 #ifdef VK_EXT_hdr_metadata
 void reservedmarshal_VkXYColorEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkXYColorEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkHdrMetadataEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkHdrMetadataEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -2381,6 +2756,7 @@
 #ifdef VK_MVK_ios_surface
 void reservedmarshal_VkIOSSurfaceCreateInfoMVK(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkIOSSurfaceCreateInfoMVK* forMarshaling,
     uint8_t** ptr);
 
@@ -2388,6 +2764,7 @@
 #ifdef VK_MVK_macos_surface
 void reservedmarshal_VkMacOSSurfaceCreateInfoMVK(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMacOSSurfaceCreateInfoMVK* forMarshaling,
     uint8_t** ptr);
 
@@ -2401,26 +2778,31 @@
 #ifdef VK_EXT_debug_utils
 void reservedmarshal_VkDebugUtilsLabelEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugUtilsLabelEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDebugUtilsObjectNameInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugUtilsObjectNameInfoEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDebugUtilsMessengerCallbackDataEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugUtilsMessengerCallbackDataEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDebugUtilsMessengerCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugUtilsMessengerCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDebugUtilsObjectTagInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDebugUtilsObjectTagInfoEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -2428,31 +2810,37 @@
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
 void reservedmarshal_VkAndroidHardwareBufferUsageANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAndroidHardwareBufferUsageANDROID* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkAndroidHardwareBufferPropertiesANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAndroidHardwareBufferPropertiesANDROID* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkAndroidHardwareBufferFormatPropertiesANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAndroidHardwareBufferFormatPropertiesANDROID* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkImportAndroidHardwareBufferInfoANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportAndroidHardwareBufferInfoANDROID* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkMemoryGetAndroidHardwareBufferInfoANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryGetAndroidHardwareBufferInfoANDROID* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkExternalFormatANDROID(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkExternalFormatANDROID* forMarshaling,
     uint8_t** ptr);
 
@@ -2472,21 +2860,25 @@
 #ifdef VK_EXT_inline_uniform_block
 void reservedmarshal_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceInlineUniformBlockFeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceInlineUniformBlockPropertiesEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkWriteDescriptorSetInlineUniformBlockEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWriteDescriptorSetInlineUniformBlockEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDescriptorPoolInlineUniformBlockCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -2496,41 +2888,49 @@
 #ifdef VK_EXT_sample_locations
 void reservedmarshal_VkSampleLocationEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSampleLocationEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSampleLocationsInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSampleLocationsInfoEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkAttachmentSampleLocationsEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAttachmentSampleLocationsEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSubpassSampleLocationsEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSubpassSampleLocationsEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkRenderPassSampleLocationsBeginInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassSampleLocationsBeginInfoEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineSampleLocationsStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineSampleLocationsStateCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceSampleLocationsPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSampleLocationsPropertiesEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkMultisamplePropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMultisamplePropertiesEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -2538,16 +2938,19 @@
 #ifdef VK_EXT_blend_operation_advanced
 void reservedmarshal_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineColorBlendAdvancedStateCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -2555,6 +2958,7 @@
 #ifdef VK_NV_fragment_coverage_to_color
 void reservedmarshal_VkPipelineCoverageToColorStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCoverageToColorStateCreateInfoNV* forMarshaling,
     uint8_t** ptr);
 
@@ -2562,6 +2966,7 @@
 #ifdef VK_NV_framebuffer_mixed_samples
 void reservedmarshal_VkPipelineCoverageModulationStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCoverageModulationStateCreateInfoNV* forMarshaling,
     uint8_t** ptr);
 
@@ -2571,11 +2976,13 @@
 #ifdef VK_NV_shader_sm_builtins
 void reservedmarshal_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* forMarshaling,
     uint8_t** ptr);
 
@@ -2585,31 +2992,37 @@
 #ifdef VK_EXT_image_drm_format_modifier
 void reservedmarshal_VkDrmFormatModifierPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDrmFormatModifierPropertiesEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDrmFormatModifierPropertiesListEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDrmFormatModifierPropertiesListEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageDrmFormatModifierInfoEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkImageDrmFormatModifierListCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageDrmFormatModifierListCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkImageDrmFormatModifierExplicitCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageDrmFormatModifierExplicitCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkImageDrmFormatModifierPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImageDrmFormatModifierPropertiesEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -2617,11 +3030,13 @@
 #ifdef VK_EXT_validation_cache
 void reservedmarshal_VkValidationCacheCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkValidationCacheCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkShaderModuleValidationCacheCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkShaderModuleValidationCacheCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -2643,36 +3058,43 @@
 #ifdef VK_NV_shading_rate_image
 void reservedmarshal_VkShadingRatePaletteNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkShadingRatePaletteNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineViewportShadingRateImageStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineViewportShadingRateImageStateCreateInfoNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceShadingRateImageFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShadingRateImageFeaturesNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceShadingRateImagePropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShadingRateImagePropertiesNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkCoarseSampleLocationNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCoarseSampleLocationNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkCoarseSampleOrderCustomNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCoarseSampleOrderCustomNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* forMarshaling,
     uint8_t** ptr);
 
@@ -2680,66 +3102,79 @@
 #ifdef VK_NV_ray_tracing
 void reservedmarshal_VkRayTracingShaderGroupCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRayTracingShaderGroupCreateInfoNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkRayTracingPipelineCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRayTracingPipelineCreateInfoNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkGeometryTrianglesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGeometryTrianglesNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkGeometryAABBNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGeometryAABBNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkGeometryDataNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGeometryDataNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkGeometryNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGeometryNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkAccelerationStructureInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureInfoNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkAccelerationStructureCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureCreateInfoNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkBindAccelerationStructureMemoryInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindAccelerationStructureMemoryInfoNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkWriteDescriptorSetAccelerationStructureNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWriteDescriptorSetAccelerationStructureNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkAccelerationStructureMemoryRequirementsInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureMemoryRequirementsInfoNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceRayTracingPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPropertiesNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkTransformMatrixKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkTransformMatrixKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -2747,6 +3182,7 @@
 
 void reservedmarshal_VkAabbPositionsKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAabbPositionsKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -2754,6 +3190,7 @@
 
 void reservedmarshal_VkAccelerationStructureInstanceKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureInstanceKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -2763,11 +3200,13 @@
 #ifdef VK_NV_representative_fragment_test
 void reservedmarshal_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRepresentativeFragmentTestStateCreateInfoNV* forMarshaling,
     uint8_t** ptr);
 
@@ -2775,11 +3214,13 @@
 #ifdef VK_EXT_filter_cubic
 void reservedmarshal_VkPhysicalDeviceImageViewImageFormatInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageViewImageFormatInfoEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkFilterCubicImageViewImageFormatPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFilterCubicImageViewImageFormatPropertiesEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -2789,6 +3230,7 @@
 #ifdef VK_EXT_global_priority
 void reservedmarshal_VkDeviceQueueGlobalPriorityCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceQueueGlobalPriorityCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -2796,16 +3238,19 @@
 #ifdef VK_EXT_external_memory_host
 void reservedmarshal_VkImportMemoryHostPointerInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImportMemoryHostPointerInfoEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkMemoryHostPointerPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryHostPointerPropertiesEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExternalMemoryHostPropertiesEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -2815,6 +3260,7 @@
 #ifdef VK_AMD_pipeline_compiler_control
 void reservedmarshal_VkPipelineCompilerControlCreateInfoAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCompilerControlCreateInfoAMD* forMarshaling,
     uint8_t** ptr);
 
@@ -2822,6 +3268,7 @@
 #ifdef VK_EXT_calibrated_timestamps
 void reservedmarshal_VkCalibratedTimestampInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCalibratedTimestampInfoEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -2829,6 +3276,7 @@
 #ifdef VK_AMD_shader_core_properties
 void reservedmarshal_VkPhysicalDeviceShaderCorePropertiesAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderCorePropertiesAMD* forMarshaling,
     uint8_t** ptr);
 
@@ -2836,6 +3284,7 @@
 #ifdef VK_AMD_memory_overallocation_behavior
 void reservedmarshal_VkDeviceMemoryOverallocationCreateInfoAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceMemoryOverallocationCreateInfoAMD* forMarshaling,
     uint8_t** ptr);
 
@@ -2843,21 +3292,25 @@
 #ifdef VK_EXT_vertex_attribute_divisor
 void reservedmarshal_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkVertexInputBindingDivisorDescriptionEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkVertexInputBindingDivisorDescriptionEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineVertexInputDivisorStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineVertexInputDivisorStateCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -2865,6 +3318,7 @@
 #ifdef VK_GGP_frame_token
 void reservedmarshal_VkPresentFrameTokenGGP(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPresentFrameTokenGGP* forMarshaling,
     uint8_t** ptr);
 
@@ -2872,11 +3326,13 @@
 #ifdef VK_EXT_pipeline_creation_feedback
 void reservedmarshal_VkPipelineCreationFeedbackEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCreationFeedbackEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineCreationFeedbackCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCreationFeedbackCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -2886,6 +3342,7 @@
 #ifdef VK_NV_compute_shader_derivatives
 void reservedmarshal_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* forMarshaling,
     uint8_t** ptr);
 
@@ -2893,16 +3350,19 @@
 #ifdef VK_NV_mesh_shader
 void reservedmarshal_VkPhysicalDeviceMeshShaderFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMeshShaderFeaturesNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceMeshShaderPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMeshShaderPropertiesNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDrawMeshTasksIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDrawMeshTasksIndirectCommandNV* forMarshaling,
     uint8_t** ptr);
 
@@ -2910,6 +3370,7 @@
 #ifdef VK_NV_fragment_shader_barycentric
 void reservedmarshal_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* forMarshaling,
     uint8_t** ptr);
 
@@ -2917,6 +3378,7 @@
 #ifdef VK_NV_shader_image_footprint
 void reservedmarshal_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderImageFootprintFeaturesNV* forMarshaling,
     uint8_t** ptr);
 
@@ -2924,11 +3386,13 @@
 #ifdef VK_NV_scissor_exclusive
 void reservedmarshal_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineViewportExclusiveScissorStateCreateInfoNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceExclusiveScissorFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExclusiveScissorFeaturesNV* forMarshaling,
     uint8_t** ptr);
 
@@ -2936,11 +3400,13 @@
 #ifdef VK_NV_device_diagnostic_checkpoints
 void reservedmarshal_VkQueueFamilyCheckpointPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkQueueFamilyCheckpointPropertiesNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkCheckpointDataNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCheckpointDataNV* forMarshaling,
     uint8_t** ptr);
 
@@ -2948,6 +3414,7 @@
 #ifdef VK_INTEL_shader_integer_functions2
 void reservedmarshal_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* forMarshaling,
     uint8_t** ptr);
 
@@ -2955,21 +3422,25 @@
 #ifdef VK_INTEL_performance_query
 void reservedmarshal_VkPerformanceValueDataINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceValueDataINTEL* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPerformanceValueINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceValueINTEL* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkInitializePerformanceApiInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkInitializePerformanceApiInfoINTEL* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkQueryPoolPerformanceQueryCreateInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkQueryPoolPerformanceQueryCreateInfoINTEL* forMarshaling,
     uint8_t** ptr);
 
@@ -2977,21 +3448,25 @@
 
 void reservedmarshal_VkPerformanceMarkerInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceMarkerInfoINTEL* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPerformanceStreamMarkerInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceStreamMarkerInfoINTEL* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPerformanceOverrideInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceOverrideInfoINTEL* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPerformanceConfigurationAcquireInfoINTEL(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPerformanceConfigurationAcquireInfoINTEL* forMarshaling,
     uint8_t** ptr);
 
@@ -2999,6 +3474,7 @@
 #ifdef VK_EXT_pci_bus_info
 void reservedmarshal_VkPhysicalDevicePCIBusInfoPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePCIBusInfoPropertiesEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3006,11 +3482,13 @@
 #ifdef VK_AMD_display_native_hdr
 void reservedmarshal_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDisplayNativeHdrSurfaceCapabilitiesAMD* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSwapchainDisplayNativeHdrCreateInfoAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSwapchainDisplayNativeHdrCreateInfoAMD* forMarshaling,
     uint8_t** ptr);
 
@@ -3018,6 +3496,7 @@
 #ifdef VK_FUCHSIA_imagepipe_surface
 void reservedmarshal_VkImagePipeSurfaceCreateInfoFUCHSIA(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkImagePipeSurfaceCreateInfoFUCHSIA* forMarshaling,
     uint8_t** ptr);
 
@@ -3025,24 +3504,28 @@
 #ifdef VK_EXT_metal_surface
 void reservedmarshal_VkMetalSurfaceCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMetalSurfaceCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
 #endif
-#ifdef VK_GOOGLE_color_buffer
-void reservedmarshal_VkImportColorBufferGOOGLE(
+#ifdef VK_EXT_fragment_density_map
+void reservedmarshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
     VulkanStreamGuest* vkStream,
-    const VkImportColorBufferGOOGLE* forMarshaling,
+    VkStructureType rootType,
+    const VkPhysicalDeviceFragmentDensityMapFeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
-void reservedmarshal_VkImportBufferGOOGLE(
+void reservedmarshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
     VulkanStreamGuest* vkStream,
-    const VkImportBufferGOOGLE* forMarshaling,
+    VkStructureType rootType,
+    const VkPhysicalDeviceFragmentDensityMapPropertiesEXT* forMarshaling,
     uint8_t** ptr);
 
-void reservedmarshal_VkImportPhysicalAddressGOOGLE(
+void reservedmarshal_VkRenderPassFragmentDensityMapCreateInfoEXT(
     VulkanStreamGuest* vkStream,
-    const VkImportPhysicalAddressGOOGLE* forMarshaling,
+    VkStructureType rootType,
+    const VkRenderPassFragmentDensityMapCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
 #endif
@@ -3057,16 +3540,19 @@
 #ifdef VK_EXT_subgroup_size_control
 void reservedmarshal_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3074,6 +3560,7 @@
 #ifdef VK_AMD_shader_core_properties2
 void reservedmarshal_VkPhysicalDeviceShaderCoreProperties2AMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderCoreProperties2AMD* forMarshaling,
     uint8_t** ptr);
 
@@ -3081,6 +3568,7 @@
 #ifdef VK_AMD_device_coherent_memory
 void reservedmarshal_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCoherentMemoryFeaturesAMD* forMarshaling,
     uint8_t** ptr);
 
@@ -3088,6 +3576,7 @@
 #ifdef VK_EXT_shader_image_atomic_int64
 void reservedmarshal_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3095,6 +3584,7 @@
 #ifdef VK_EXT_memory_budget
 void reservedmarshal_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryBudgetPropertiesEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3102,11 +3592,13 @@
 #ifdef VK_EXT_memory_priority
 void reservedmarshal_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceMemoryPriorityFeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkMemoryPriorityAllocateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkMemoryPriorityAllocateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3114,6 +3606,7 @@
 #ifdef VK_NV_dedicated_allocation_image_aliasing
 void reservedmarshal_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* forMarshaling,
     uint8_t** ptr);
 
@@ -3121,6 +3614,7 @@
 #ifdef VK_EXT_buffer_device_address
 void reservedmarshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3130,6 +3624,7 @@
 
 void reservedmarshal_VkBufferDeviceAddressCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBufferDeviceAddressCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3137,6 +3632,7 @@
 #ifdef VK_EXT_tooling_info
 void reservedmarshal_VkPhysicalDeviceToolPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceToolPropertiesEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3148,6 +3644,7 @@
 #ifdef VK_EXT_validation_features
 void reservedmarshal_VkValidationFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkValidationFeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3155,16 +3652,19 @@
 #ifdef VK_NV_cooperative_matrix
 void reservedmarshal_VkCooperativeMatrixPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCooperativeMatrixPropertiesNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCooperativeMatrixFeaturesNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCooperativeMatrixPropertiesNV* forMarshaling,
     uint8_t** ptr);
 
@@ -3172,16 +3672,19 @@
 #ifdef VK_NV_coverage_reduction_mode
 void reservedmarshal_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCoverageReductionModeFeaturesNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineCoverageReductionStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineCoverageReductionStateCreateInfoNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkFramebufferMixedSamplesCombinationNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkFramebufferMixedSamplesCombinationNV* forMarshaling,
     uint8_t** ptr);
 
@@ -3189,6 +3692,7 @@
 #ifdef VK_EXT_fragment_shader_interlock
 void reservedmarshal_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3196,6 +3700,7 @@
 #ifdef VK_EXT_ycbcr_image_arrays
 void reservedmarshal_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3203,16 +3708,19 @@
 #ifdef VK_EXT_full_screen_exclusive
 void reservedmarshal_VkSurfaceFullScreenExclusiveInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceFullScreenExclusiveInfoEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceCapabilitiesFullScreenExclusiveEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSurfaceFullScreenExclusiveWin32InfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSurfaceFullScreenExclusiveWin32InfoEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3220,6 +3728,7 @@
 #ifdef VK_EXT_headless_surface
 void reservedmarshal_VkHeadlessSurfaceCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkHeadlessSurfaceCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3227,16 +3736,19 @@
 #ifdef VK_EXT_line_rasterization
 void reservedmarshal_VkPhysicalDeviceLineRasterizationFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceLineRasterizationFeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceLineRasterizationPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceLineRasterizationPropertiesEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineRasterizationLineStateCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineRasterizationLineStateCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3244,6 +3756,7 @@
 #ifdef VK_EXT_shader_atomic_float
 void reservedmarshal_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3255,6 +3768,7 @@
 #ifdef VK_EXT_index_type_uint8
 void reservedmarshal_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceIndexTypeUint8FeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3262,6 +3776,7 @@
 #ifdef VK_EXT_extended_dynamic_state
 void reservedmarshal_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3269,6 +3784,7 @@
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 void reservedmarshal_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3276,66 +3792,79 @@
 #ifdef VK_NV_device_generated_commands
 void reservedmarshal_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkGraphicsShaderGroupCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGraphicsShaderGroupCreateInfoNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkGraphicsPipelineShaderGroupsCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGraphicsPipelineShaderGroupsCreateInfoNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkBindShaderGroupIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindShaderGroupIndirectCommandNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkBindIndexBufferIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindIndexBufferIndirectCommandNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkBindVertexBufferIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkBindVertexBufferIndirectCommandNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkSetStateFlagsIndirectCommandNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSetStateFlagsIndirectCommandNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkIndirectCommandsStreamNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkIndirectCommandsStreamNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkIndirectCommandsLayoutTokenNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkIndirectCommandsLayoutTokenNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkIndirectCommandsLayoutCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkIndirectCommandsLayoutCreateInfoNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkGeneratedCommandsInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGeneratedCommandsInfoNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkGeneratedCommandsMemoryRequirementsInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkGeneratedCommandsMemoryRequirementsInfoNV* forMarshaling,
     uint8_t** ptr);
 
@@ -3343,11 +3872,13 @@
 #ifdef VK_EXT_texel_buffer_alignment
 void reservedmarshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3355,11 +3886,13 @@
 #ifdef VK_QCOM_render_pass_transform
 void reservedmarshal_VkRenderPassTransformBeginInfoQCOM(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRenderPassTransformBeginInfoQCOM* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCommandBufferInheritanceRenderPassTransformInfoQCOM* forMarshaling,
     uint8_t** ptr);
 
@@ -3367,16 +3900,19 @@
 #ifdef VK_EXT_device_memory_report
 void reservedmarshal_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDeviceMemoryReportCallbackDataEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceMemoryReportCallbackDataEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDeviceDeviceMemoryReportCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceDeviceMemoryReportCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3384,11 +3920,13 @@
 #ifdef VK_EXT_robustness2
 void reservedmarshal_VkPhysicalDeviceRobustness2FeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRobustness2FeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceRobustness2PropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRobustness2PropertiesEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3396,16 +3934,19 @@
 #ifdef VK_EXT_custom_border_color
 void reservedmarshal_VkSamplerCustomBorderColorCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkSamplerCustomBorderColorCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCustomBorderColorPropertiesEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceCustomBorderColorFeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3415,16 +3956,19 @@
 #ifdef VK_EXT_private_data
 void reservedmarshal_VkPhysicalDevicePrivateDataFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePrivateDataFeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDevicePrivateDataCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDevicePrivateDataCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPrivateDataSlotCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPrivateDataSlotCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3432,6 +3976,7 @@
 #ifdef VK_EXT_pipeline_creation_cache_control
 void reservedmarshal_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3439,11 +3984,13 @@
 #ifdef VK_NV_device_diagnostics_config
 void reservedmarshal_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceDiagnosticsConfigFeaturesNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDeviceDiagnosticsConfigCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceDiagnosticsConfigCreateInfoNV* forMarshaling,
     uint8_t** ptr);
 
@@ -3453,16 +4000,19 @@
 #ifdef VK_NV_fragment_shading_rate_enums
 void reservedmarshal_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPipelineFragmentShadingRateEnumStateCreateInfoNV* forMarshaling,
     uint8_t** ptr);
 
@@ -3470,11 +4020,13 @@
 #ifdef VK_EXT_fragment_density_map2
 void reservedmarshal_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3482,6 +4034,7 @@
 #ifdef VK_QCOM_rotated_copy_commands
 void reservedmarshal_VkCopyCommandTransformInfoQCOM(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyCommandTransformInfoQCOM* forMarshaling,
     uint8_t** ptr);
 
@@ -3489,6 +4042,7 @@
 #ifdef VK_EXT_image_robustness
 void reservedmarshal_VkPhysicalDeviceImageRobustnessFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceImageRobustnessFeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3496,6 +4050,7 @@
 #ifdef VK_EXT_4444_formats
 void reservedmarshal_VkPhysicalDevice4444FormatsFeaturesEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDevice4444FormatsFeaturesEXT* forMarshaling,
     uint8_t** ptr);
 
@@ -3503,105 +4058,143 @@
 #ifdef VK_EXT_directfb_surface
 void reservedmarshal_VkDirectFBSurfaceCreateInfoEXT(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDirectFBSurfaceCreateInfoEXT* forMarshaling,
     uint8_t** ptr);
 
 #endif
 #ifdef VK_GOOGLE_gfxstream
+void reservedmarshal_VkImportColorBufferGOOGLE(
+    VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
+    const VkImportColorBufferGOOGLE* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkImportBufferGOOGLE(
+    VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
+    const VkImportBufferGOOGLE* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkImportPhysicalAddressGOOGLE(
+    VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
+    const VkImportPhysicalAddressGOOGLE* forMarshaling,
+    uint8_t** ptr);
+
 #endif
 #ifdef VK_KHR_acceleration_structure
 void reservedmarshal_VkDeviceOrHostAddressKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceOrHostAddressKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkDeviceOrHostAddressConstKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkDeviceOrHostAddressConstKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkAccelerationStructureBuildRangeInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureBuildRangeInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkAccelerationStructureGeometryTrianglesDataKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryTrianglesDataKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkAccelerationStructureGeometryAabbsDataKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryAabbsDataKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkAccelerationStructureGeometryInstancesDataKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryInstancesDataKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkAccelerationStructureGeometryDataKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryDataKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkAccelerationStructureGeometryKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureGeometryKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkAccelerationStructureBuildGeometryInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureBuildGeometryInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkAccelerationStructureCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureCreateInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkWriteDescriptorSetAccelerationStructureKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkWriteDescriptorSetAccelerationStructureKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceAccelerationStructureFeaturesKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceAccelerationStructurePropertiesKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkAccelerationStructureDeviceAddressInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureDeviceAddressInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkAccelerationStructureVersionInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureVersionInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkCopyAccelerationStructureToMemoryInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyAccelerationStructureToMemoryInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkCopyMemoryToAccelerationStructureInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyMemoryToAccelerationStructureInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkCopyAccelerationStructureInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkCopyAccelerationStructureInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkAccelerationStructureBuildSizesInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkAccelerationStructureBuildSizesInfoKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -3609,36 +4202,43 @@
 #ifdef VK_KHR_ray_tracing_pipeline
 void reservedmarshal_VkRayTracingShaderGroupCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRayTracingShaderGroupCreateInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkRayTracingPipelineInterfaceCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRayTracingPipelineInterfaceCreateInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkRayTracingPipelineCreateInfoKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkRayTracingPipelineCreateInfoKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPipelineFeaturesKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPipelinePropertiesKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkStridedDeviceAddressRegionKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkStridedDeviceAddressRegionKHR* forMarshaling,
     uint8_t** ptr);
 
 void reservedmarshal_VkTraceRaysIndirectCommandKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkTraceRaysIndirectCommandKHR* forMarshaling,
     uint8_t** ptr);
 
@@ -3646,6 +4246,7 @@
 #ifdef VK_KHR_ray_query
 void reservedmarshal_VkPhysicalDeviceRayQueryFeaturesKHR(
     VulkanStreamGuest* vkStream,
+    VkStructureType rootType,
     const VkPhysicalDeviceRayQueryFeaturesKHR* forMarshaling,
     uint8_t** ptr);
 
diff --git a/system/vulkan_enc/goldfish_vk_transform_guest.cpp b/system/vulkan_enc/goldfish_vk_transform_guest.cpp
index bc75720..bcc896b 100644
--- a/system/vulkan_enc/goldfish_vk_transform_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_transform_guest.cpp
@@ -12921,10 +12921,10 @@
 }
 
 #endif
-#ifdef VK_GOOGLE_color_buffer
-void transform_tohost_VkImportColorBufferGOOGLE(
+#ifdef VK_EXT_fragment_density_map
+void transform_tohost_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
     ResourceTracker* resourceTracker,
-    VkImportColorBufferGOOGLE* toTransform)
+    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* toTransform)
 {
     (void)resourceTracker;
     (void)toTransform;
@@ -12934,9 +12934,9 @@
     }
 }
 
-void transform_fromhost_VkImportColorBufferGOOGLE(
+void transform_fromhost_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
     ResourceTracker* resourceTracker,
-    VkImportColorBufferGOOGLE* toTransform)
+    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* toTransform)
 {
     (void)resourceTracker;
     (void)toTransform;
@@ -12946,9 +12946,9 @@
     }
 }
 
-void transform_tohost_VkImportBufferGOOGLE(
+void transform_tohost_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
     ResourceTracker* resourceTracker,
-    VkImportBufferGOOGLE* toTransform)
+    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* toTransform)
 {
     (void)resourceTracker;
     (void)toTransform;
@@ -12956,11 +12956,13 @@
     {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
+    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->minFragmentDensityTexelSize));
+    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxFragmentDensityTexelSize));
 }
 
-void transform_fromhost_VkImportBufferGOOGLE(
+void transform_fromhost_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
     ResourceTracker* resourceTracker,
-    VkImportBufferGOOGLE* toTransform)
+    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* toTransform)
 {
     (void)resourceTracker;
     (void)toTransform;
@@ -12968,11 +12970,13 @@
     {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
+    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->minFragmentDensityTexelSize));
+    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxFragmentDensityTexelSize));
 }
 
-void transform_tohost_VkImportPhysicalAddressGOOGLE(
+void transform_tohost_VkRenderPassFragmentDensityMapCreateInfoEXT(
     ResourceTracker* resourceTracker,
-    VkImportPhysicalAddressGOOGLE* toTransform)
+    VkRenderPassFragmentDensityMapCreateInfoEXT* toTransform)
 {
     (void)resourceTracker;
     (void)toTransform;
@@ -12980,11 +12984,12 @@
     {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
+    transform_tohost_VkAttachmentReference(resourceTracker, (VkAttachmentReference*)(&toTransform->fragmentDensityMapAttachment));
 }
 
-void transform_fromhost_VkImportPhysicalAddressGOOGLE(
+void transform_fromhost_VkRenderPassFragmentDensityMapCreateInfoEXT(
     ResourceTracker* resourceTracker,
-    VkImportPhysicalAddressGOOGLE* toTransform)
+    VkRenderPassFragmentDensityMapCreateInfoEXT* toTransform)
 {
     (void)resourceTracker;
     (void)toTransform;
@@ -12992,6 +12997,7 @@
     {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
+    transform_fromhost_VkAttachmentReference(resourceTracker, (VkAttachmentReference*)(&toTransform->fragmentDensityMapAttachment));
 }
 
 #endif
@@ -14894,6 +14900,78 @@
 
 #endif
 #ifdef VK_GOOGLE_gfxstream
+void transform_tohost_VkImportColorBufferGOOGLE(
+    ResourceTracker* resourceTracker,
+    VkImportColorBufferGOOGLE* toTransform)
+{
+    (void)resourceTracker;
+    (void)toTransform;
+    if (toTransform->pNext)
+    {
+        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
+    }
+}
+
+void transform_fromhost_VkImportColorBufferGOOGLE(
+    ResourceTracker* resourceTracker,
+    VkImportColorBufferGOOGLE* toTransform)
+{
+    (void)resourceTracker;
+    (void)toTransform;
+    if (toTransform->pNext)
+    {
+        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
+    }
+}
+
+void transform_tohost_VkImportBufferGOOGLE(
+    ResourceTracker* resourceTracker,
+    VkImportBufferGOOGLE* toTransform)
+{
+    (void)resourceTracker;
+    (void)toTransform;
+    if (toTransform->pNext)
+    {
+        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
+    }
+}
+
+void transform_fromhost_VkImportBufferGOOGLE(
+    ResourceTracker* resourceTracker,
+    VkImportBufferGOOGLE* toTransform)
+{
+    (void)resourceTracker;
+    (void)toTransform;
+    if (toTransform->pNext)
+    {
+        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
+    }
+}
+
+void transform_tohost_VkImportPhysicalAddressGOOGLE(
+    ResourceTracker* resourceTracker,
+    VkImportPhysicalAddressGOOGLE* toTransform)
+{
+    (void)resourceTracker;
+    (void)toTransform;
+    if (toTransform->pNext)
+    {
+        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
+    }
+}
+
+void transform_fromhost_VkImportPhysicalAddressGOOGLE(
+    ResourceTracker* resourceTracker,
+    VkImportPhysicalAddressGOOGLE* toTransform)
+{
+    (void)resourceTracker;
+    (void)toTransform;
+    if (toTransform->pNext)
+    {
+        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
+    }
+}
+
 #endif
 #ifdef VK_KHR_acceleration_structure
 void transform_tohost_VkDeviceOrHostAddressKHR(
@@ -16761,20 +16839,20 @@
             break;
         }
 #endif
-#ifdef VK_GOOGLE_color_buffer
-        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE:
+#ifdef VK_EXT_fragment_density_map
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT:
         {
-            transform_tohost_VkImportColorBufferGOOGLE(resourceTracker, reinterpret_cast<VkImportColorBufferGOOGLE*>(structExtension_out));
+            transform_tohost_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE:
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT:
         {
-            transform_tohost_VkImportBufferGOOGLE(resourceTracker, reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out));
+            transform_tohost_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
+        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT:
         {
-            transform_tohost_VkImportPhysicalAddressGOOGLE(resourceTracker, reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
+            transform_tohost_VkRenderPassFragmentDensityMapCreateInfoEXT(resourceTracker, reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
@@ -17124,6 +17202,23 @@
             break;
         }
 #endif
+#ifdef VK_GOOGLE_gfxstream
+        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));
+            break;
+        }
+        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
+        {
+            transform_tohost_VkImportPhysicalAddressGOOGLE(resourceTracker, reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
+            break;
+        }
+#endif
 #ifdef VK_KHR_acceleration_structure
         case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR:
         {
@@ -18319,20 +18414,20 @@
             break;
         }
 #endif
-#ifdef VK_GOOGLE_color_buffer
-        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE:
+#ifdef VK_EXT_fragment_density_map
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT:
         {
-            transform_fromhost_VkImportColorBufferGOOGLE(resourceTracker, reinterpret_cast<VkImportColorBufferGOOGLE*>(structExtension_out));
+            transform_fromhost_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE:
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT:
         {
-            transform_fromhost_VkImportBufferGOOGLE(resourceTracker, reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out));
+            transform_fromhost_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
+        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT:
         {
-            transform_fromhost_VkImportPhysicalAddressGOOGLE(resourceTracker, reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
+            transform_fromhost_VkRenderPassFragmentDensityMapCreateInfoEXT(resourceTracker, reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
@@ -18682,6 +18777,23 @@
             break;
         }
 #endif
+#ifdef VK_GOOGLE_gfxstream
+        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));
+            break;
+        }
+        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
+        {
+            transform_fromhost_VkImportPhysicalAddressGOOGLE(resourceTracker, reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
+            break;
+        }
+#endif
 #ifdef VK_KHR_acceleration_structure
         case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR:
         {
diff --git a/system/vulkan_enc/goldfish_vk_transform_guest.h b/system/vulkan_enc/goldfish_vk_transform_guest.h
index 9434787..78262cd 100644
--- a/system/vulkan_enc/goldfish_vk_transform_guest.h
+++ b/system/vulkan_enc/goldfish_vk_transform_guest.h
@@ -4705,30 +4705,30 @@
     VkMetalSurfaceCreateInfoEXT* toTransform);
 
 #endif
-#ifdef VK_GOOGLE_color_buffer
-void transform_tohost_VkImportColorBufferGOOGLE(
+#ifdef VK_EXT_fragment_density_map
+void transform_tohost_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
     ResourceTracker* resourceTracker,
-    VkImportColorBufferGOOGLE* toTransform);
+    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* toTransform);
 
-void transform_fromhost_VkImportColorBufferGOOGLE(
+void transform_fromhost_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
     ResourceTracker* resourceTracker,
-    VkImportColorBufferGOOGLE* toTransform);
+    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* toTransform);
 
-void transform_tohost_VkImportBufferGOOGLE(
+void transform_tohost_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
     ResourceTracker* resourceTracker,
-    VkImportBufferGOOGLE* toTransform);
+    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* toTransform);
 
-void transform_fromhost_VkImportBufferGOOGLE(
+void transform_fromhost_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
     ResourceTracker* resourceTracker,
-    VkImportBufferGOOGLE* toTransform);
+    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* toTransform);
 
-void transform_tohost_VkImportPhysicalAddressGOOGLE(
+void transform_tohost_VkRenderPassFragmentDensityMapCreateInfoEXT(
     ResourceTracker* resourceTracker,
-    VkImportPhysicalAddressGOOGLE* toTransform);
+    VkRenderPassFragmentDensityMapCreateInfoEXT* toTransform);
 
-void transform_fromhost_VkImportPhysicalAddressGOOGLE(
+void transform_fromhost_VkRenderPassFragmentDensityMapCreateInfoEXT(
     ResourceTracker* resourceTracker,
-    VkImportPhysicalAddressGOOGLE* toTransform);
+    VkRenderPassFragmentDensityMapCreateInfoEXT* toTransform);
 
 #endif
 #ifdef VK_EXT_scalar_block_layout
@@ -5422,6 +5422,30 @@
 
 #endif
 #ifdef VK_GOOGLE_gfxstream
+void transform_tohost_VkImportColorBufferGOOGLE(
+    ResourceTracker* resourceTracker,
+    VkImportColorBufferGOOGLE* toTransform);
+
+void transform_fromhost_VkImportColorBufferGOOGLE(
+    ResourceTracker* resourceTracker,
+    VkImportColorBufferGOOGLE* toTransform);
+
+void transform_tohost_VkImportBufferGOOGLE(
+    ResourceTracker* resourceTracker,
+    VkImportBufferGOOGLE* toTransform);
+
+void transform_fromhost_VkImportBufferGOOGLE(
+    ResourceTracker* resourceTracker,
+    VkImportBufferGOOGLE* toTransform);
+
+void transform_tohost_VkImportPhysicalAddressGOOGLE(
+    ResourceTracker* resourceTracker,
+    VkImportPhysicalAddressGOOGLE* toTransform);
+
+void transform_fromhost_VkImportPhysicalAddressGOOGLE(
+    ResourceTracker* resourceTracker,
+    VkImportPhysicalAddressGOOGLE* toTransform);
+
 #endif
 #ifdef VK_KHR_acceleration_structure
 void transform_tohost_VkDeviceOrHostAddressKHR(
diff --git a/system/vulkan_enc/vk_format_info.h b/system/vulkan_enc/vk_format_info.h
index d80d9c3..f96d59e 100644
--- a/system/vulkan_enc/vk_format_info.h
+++ b/system/vulkan_enc/vk_format_info.h
@@ -107,6 +107,7 @@
    case HAL_PIXEL_FORMAT_NV12_Y_TILED_INTEL:
    case OMX_COLOR_FormatYUV420Planar:
    case HAL_PIXEL_FORMAT_YV12:
+   case AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420:
       return true;
 
    default:
diff --git a/system/vulkan_enc/vk_struct_id.h b/system/vulkan_enc/vk_struct_id.h
index 0aaf7a9..5cfb795 100644
--- a/system/vulkan_enc/vk_struct_id.h
+++ b/system/vulkan_enc/vk_struct_id.h
@@ -44,7 +44,7 @@
 REGISTER_VK_STRUCT_ID(VkImportColorBufferGOOGLE, VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE);
 REGISTER_VK_STRUCT_ID(VkImageViewCreateInfo, VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO);
 REGISTER_VK_STRUCT_ID(VkImportMemoryBufferCollectionFUCHSIA, VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA);
-REGISTER_VK_STRUCT_ID(VkImportMemoryZirconHandleInfoFUCHSIA, VK_STRUCTURE_TYPE_TEMP_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA);
+REGISTER_VK_STRUCT_ID(VkImportMemoryZirconHandleInfoFUCHSIA, VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA);
 REGISTER_VK_STRUCT_ID(VkBufferCollectionImageCreateInfoFUCHSIA, VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA);
 REGISTER_VK_STRUCT_ID(VkBufferCollectionBufferCreateInfoFUCHSIA, VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA);
 REGISTER_VK_STRUCT_ID(VkSamplerCreateInfo, VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO);
@@ -53,5 +53,8 @@
 REGISTER_VK_STRUCT_ID(VkExportFenceCreateInfo, VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO);
 REGISTER_VK_STRUCT_ID(VkImportBufferGOOGLE, VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE);
 REGISTER_VK_STRUCT_ID(VkExternalImageFormatProperties, VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES);
+REGISTER_VK_STRUCT_ID(VkPhysicalDeviceImageFormatInfo2, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2);
+REGISTER_VK_STRUCT_ID(VkPhysicalDeviceExternalImageFormatInfo, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO);
+REGISTER_VK_STRUCT_ID(VkSemaphoreTypeCreateInfo, VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO);
 
 #undef REGISTER_VK_STRUCT_ID