// Copyright (C) 2018 The Android Open Source Project
// Copyright (C) 2018 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Autogenerated module goldfish_vk_transform_guest
// (impl) generated by android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/genvk.py -registry android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/vk.xml cereal -o android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
// Please do not modify directly;
// re-run android/scripts/generate-vulkan-sources.sh,
// or directly from Python by defining:
// VULKAN_REGISTRY_XML_DIR : Directory containing genvk.py and vk.xml
// CEREAL_OUTPUT_DIR: Where to put the generated sources.
// python3 $VULKAN_REGISTRY_XML_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR

#include "goldfish_vk_transform_guest.h"


#include "goldfish_vk_extension_structs_guest.h"
#include "goldfish_vk_private_defs.h"

#include "ResourceTracker.h"


namespace goldfish_vk {

void transform_tohost_extension_struct(
    ResourceTracker* resourceTracker,
    void* structExtension_out);

void transform_fromhost_extension_struct(
    ResourceTracker* resourceTracker,
    void* structExtension_out);

#ifdef VK_VERSION_1_0
void transform_tohost_VkExtent2D(
    ResourceTracker* resourceTracker,
    VkExtent2D* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkExtent2D(
    ResourceTracker* resourceTracker,
    VkExtent2D* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkExtent3D(
    ResourceTracker* resourceTracker,
    VkExtent3D* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkExtent3D(
    ResourceTracker* resourceTracker,
    VkExtent3D* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkOffset2D(
    ResourceTracker* resourceTracker,
    VkOffset2D* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkOffset2D(
    ResourceTracker* resourceTracker,
    VkOffset2D* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkOffset3D(
    ResourceTracker* resourceTracker,
    VkOffset3D* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkOffset3D(
    ResourceTracker* resourceTracker,
    VkOffset3D* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkRect2D(
    ResourceTracker* resourceTracker,
    VkRect2D* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkOffset2D(resourceTracker, (VkOffset2D*)(&toTransform->offset));
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->extent));
}

void transform_fromhost_VkRect2D(
    ResourceTracker* resourceTracker,
    VkRect2D* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkOffset2D(resourceTracker, (VkOffset2D*)(&toTransform->offset));
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->extent));
}

void transform_tohost_VkBaseInStructure(
    ResourceTracker* resourceTracker,
    VkBaseInStructure* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkBaseInStructure(
    ResourceTracker* resourceTracker,
    VkBaseInStructure* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkBaseOutStructure(
    ResourceTracker* resourceTracker,
    VkBaseOutStructure* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkBaseOutStructure(
    ResourceTracker* resourceTracker,
    VkBaseOutStructure* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkBufferMemoryBarrier(
    ResourceTracker* resourceTracker,
    VkBufferMemoryBarrier* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkBufferMemoryBarrier(
    ResourceTracker* resourceTracker,
    VkBufferMemoryBarrier* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDispatchIndirectCommand(
    ResourceTracker* resourceTracker,
    VkDispatchIndirectCommand* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkDispatchIndirectCommand(
    ResourceTracker* resourceTracker,
    VkDispatchIndirectCommand* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkDrawIndexedIndirectCommand(
    ResourceTracker* resourceTracker,
    VkDrawIndexedIndirectCommand* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkDrawIndexedIndirectCommand(
    ResourceTracker* resourceTracker,
    VkDrawIndexedIndirectCommand* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkDrawIndirectCommand(
    ResourceTracker* resourceTracker,
    VkDrawIndirectCommand* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkDrawIndirectCommand(
    ResourceTracker* resourceTracker,
    VkDrawIndirectCommand* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkImageSubresourceRange(
    ResourceTracker* resourceTracker,
    VkImageSubresourceRange* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkImageSubresourceRange(
    ResourceTracker* resourceTracker,
    VkImageSubresourceRange* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkImageMemoryBarrier(
    ResourceTracker* resourceTracker,
    VkImageMemoryBarrier* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkImageSubresourceRange(resourceTracker, (VkImageSubresourceRange*)(&toTransform->subresourceRange));
}

void transform_fromhost_VkImageMemoryBarrier(
    ResourceTracker* resourceTracker,
    VkImageMemoryBarrier* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkImageSubresourceRange(resourceTracker, (VkImageSubresourceRange*)(&toTransform->subresourceRange));
}

void transform_tohost_VkMemoryBarrier(
    ResourceTracker* resourceTracker,
    VkMemoryBarrier* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkMemoryBarrier(
    ResourceTracker* resourceTracker,
    VkMemoryBarrier* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkAllocationCallbacks(
    ResourceTracker* resourceTracker,
    VkAllocationCallbacks* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkAllocationCallbacks(
    ResourceTracker* resourceTracker,
    VkAllocationCallbacks* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkApplicationInfo(
    ResourceTracker* resourceTracker,
    VkApplicationInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkApplicationInfo(
    ResourceTracker* resourceTracker,
    VkApplicationInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkFormatProperties(
    ResourceTracker* resourceTracker,
    VkFormatProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkFormatProperties(
    ResourceTracker* resourceTracker,
    VkFormatProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkImageFormatProperties(
    ResourceTracker* resourceTracker,
    VkImageFormatProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->maxExtent));
}

void transform_fromhost_VkImageFormatProperties(
    ResourceTracker* resourceTracker,
    VkImageFormatProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->maxExtent));
}

void transform_tohost_VkInstanceCreateInfo(
    ResourceTracker* resourceTracker,
    VkInstanceCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform->pApplicationInfo)
    {
        transform_tohost_VkApplicationInfo(resourceTracker, (VkApplicationInfo*)(toTransform->pApplicationInfo));
    }
}

void transform_fromhost_VkInstanceCreateInfo(
    ResourceTracker* resourceTracker,
    VkInstanceCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform->pApplicationInfo)
    {
        transform_fromhost_VkApplicationInfo(resourceTracker, (VkApplicationInfo*)(toTransform->pApplicationInfo));
    }
}

void transform_tohost_VkMemoryHeap(
    ResourceTracker* resourceTracker,
    VkMemoryHeap* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkMemoryHeap(
    ResourceTracker* resourceTracker,
    VkMemoryHeap* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkMemoryType(
    ResourceTracker* resourceTracker,
    VkMemoryType* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkMemoryType(
    ResourceTracker* resourceTracker,
    VkMemoryType* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkPhysicalDeviceFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkPhysicalDeviceFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkPhysicalDeviceLimits(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceLimits* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkPhysicalDeviceLimits(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceLimits* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkPhysicalDeviceMemoryProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceMemoryProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_TYPES; ++i)
    {
        transform_tohost_VkMemoryType(resourceTracker, (VkMemoryType*)(toTransform->memoryTypes + i));
    }
    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_HEAPS; ++i)
    {
        transform_tohost_VkMemoryHeap(resourceTracker, (VkMemoryHeap*)(toTransform->memoryHeaps + i));
    }
}

void transform_fromhost_VkPhysicalDeviceMemoryProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceMemoryProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_TYPES; ++i)
    {
        transform_fromhost_VkMemoryType(resourceTracker, (VkMemoryType*)(toTransform->memoryTypes + i));
    }
    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_HEAPS; ++i)
    {
        transform_fromhost_VkMemoryHeap(resourceTracker, (VkMemoryHeap*)(toTransform->memoryHeaps + i));
    }
}

void transform_tohost_VkPhysicalDeviceSparseProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceSparseProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkPhysicalDeviceSparseProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceSparseProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkPhysicalDeviceProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkPhysicalDeviceLimits(resourceTracker, (VkPhysicalDeviceLimits*)(&toTransform->limits));
    transform_tohost_VkPhysicalDeviceSparseProperties(resourceTracker, (VkPhysicalDeviceSparseProperties*)(&toTransform->sparseProperties));
}

void transform_fromhost_VkPhysicalDeviceProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkPhysicalDeviceLimits(resourceTracker, (VkPhysicalDeviceLimits*)(&toTransform->limits));
    transform_fromhost_VkPhysicalDeviceSparseProperties(resourceTracker, (VkPhysicalDeviceSparseProperties*)(&toTransform->sparseProperties));
}

void transform_tohost_VkQueueFamilyProperties(
    ResourceTracker* resourceTracker,
    VkQueueFamilyProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->minImageTransferGranularity));
}

void transform_fromhost_VkQueueFamilyProperties(
    ResourceTracker* resourceTracker,
    VkQueueFamilyProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->minImageTransferGranularity));
}

void transform_tohost_VkDeviceQueueCreateInfo(
    ResourceTracker* resourceTracker,
    VkDeviceQueueCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDeviceQueueCreateInfo(
    ResourceTracker* resourceTracker,
    VkDeviceQueueCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDeviceCreateInfo(
    ResourceTracker* resourceTracker,
    VkDeviceCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pQueueCreateInfos)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->queueCreateInfoCount; ++i)
            {
                transform_tohost_VkDeviceQueueCreateInfo(resourceTracker, (VkDeviceQueueCreateInfo*)(toTransform->pQueueCreateInfos + i));
            }
        }
    }
    if (toTransform->pEnabledFeatures)
    {
        transform_tohost_VkPhysicalDeviceFeatures(resourceTracker, (VkPhysicalDeviceFeatures*)(toTransform->pEnabledFeatures));
    }
}

void transform_fromhost_VkDeviceCreateInfo(
    ResourceTracker* resourceTracker,
    VkDeviceCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pQueueCreateInfos)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->queueCreateInfoCount; ++i)
            {
                transform_fromhost_VkDeviceQueueCreateInfo(resourceTracker, (VkDeviceQueueCreateInfo*)(toTransform->pQueueCreateInfos + i));
            }
        }
    }
    if (toTransform->pEnabledFeatures)
    {
        transform_fromhost_VkPhysicalDeviceFeatures(resourceTracker, (VkPhysicalDeviceFeatures*)(toTransform->pEnabledFeatures));
    }
}

void transform_tohost_VkExtensionProperties(
    ResourceTracker* resourceTracker,
    VkExtensionProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkExtensionProperties(
    ResourceTracker* resourceTracker,
    VkExtensionProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkLayerProperties(
    ResourceTracker* resourceTracker,
    VkLayerProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkLayerProperties(
    ResourceTracker* resourceTracker,
    VkLayerProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkSubmitInfo(
    ResourceTracker* resourceTracker,
    VkSubmitInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkSubmitInfo(
    ResourceTracker* resourceTracker,
    VkSubmitInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkMappedMemoryRange(
    ResourceTracker* resourceTracker,
    VkMappedMemoryRange* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->offset, 1, (VkDeviceSize*)&toTransform->size, 1, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkMappedMemoryRange(
    ResourceTracker* resourceTracker,
    VkMappedMemoryRange* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->offset, 1, (VkDeviceSize*)&toTransform->size, 1, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkMemoryAllocateInfo(
    ResourceTracker* resourceTracker,
    VkMemoryAllocateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeIndex, 1, (uint32_t*)nullptr, 0);
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkMemoryAllocateInfo(
    ResourceTracker* resourceTracker,
    VkMemoryAllocateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeIndex, 1, (uint32_t*)nullptr, 0);
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkMemoryRequirements(
    ResourceTracker* resourceTracker,
    VkMemoryRequirements* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
}

void transform_fromhost_VkMemoryRequirements(
    ResourceTracker* resourceTracker,
    VkMemoryRequirements* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
}

void transform_tohost_VkSparseMemoryBind(
    ResourceTracker* resourceTracker,
    VkSparseMemoryBind* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
}

void transform_fromhost_VkSparseMemoryBind(
    ResourceTracker* resourceTracker,
    VkSparseMemoryBind* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
}

void transform_tohost_VkSparseBufferMemoryBindInfo(
    ResourceTracker* resourceTracker,
    VkSparseBufferMemoryBindInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform)
    {
        if (toTransform->pBinds)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->bindCount; ++i)
            {
                transform_tohost_VkSparseMemoryBind(resourceTracker, (VkSparseMemoryBind*)(toTransform->pBinds + i));
            }
        }
    }
}

void transform_fromhost_VkSparseBufferMemoryBindInfo(
    ResourceTracker* resourceTracker,
    VkSparseBufferMemoryBindInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform)
    {
        if (toTransform->pBinds)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->bindCount; ++i)
            {
                transform_fromhost_VkSparseMemoryBind(resourceTracker, (VkSparseMemoryBind*)(toTransform->pBinds + i));
            }
        }
    }
}

void transform_tohost_VkSparseImageOpaqueMemoryBindInfo(
    ResourceTracker* resourceTracker,
    VkSparseImageOpaqueMemoryBindInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform)
    {
        if (toTransform->pBinds)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->bindCount; ++i)
            {
                transform_tohost_VkSparseMemoryBind(resourceTracker, (VkSparseMemoryBind*)(toTransform->pBinds + i));
            }
        }
    }
}

void transform_fromhost_VkSparseImageOpaqueMemoryBindInfo(
    ResourceTracker* resourceTracker,
    VkSparseImageOpaqueMemoryBindInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform)
    {
        if (toTransform->pBinds)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->bindCount; ++i)
            {
                transform_fromhost_VkSparseMemoryBind(resourceTracker, (VkSparseMemoryBind*)(toTransform->pBinds + i));
            }
        }
    }
}

void transform_tohost_VkImageSubresource(
    ResourceTracker* resourceTracker,
    VkImageSubresource* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkImageSubresource(
    ResourceTracker* resourceTracker,
    VkImageSubresource* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkSparseImageMemoryBind(
    ResourceTracker* resourceTracker,
    VkSparseImageMemoryBind* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
    transform_tohost_VkImageSubresource(resourceTracker, (VkImageSubresource*)(&toTransform->subresource));
    transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->offset));
    transform_tohost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->extent));
}

void transform_fromhost_VkSparseImageMemoryBind(
    ResourceTracker* resourceTracker,
    VkSparseImageMemoryBind* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
    transform_fromhost_VkImageSubresource(resourceTracker, (VkImageSubresource*)(&toTransform->subresource));
    transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->offset));
    transform_fromhost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->extent));
}

void transform_tohost_VkSparseImageMemoryBindInfo(
    ResourceTracker* resourceTracker,
    VkSparseImageMemoryBindInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform)
    {
        if (toTransform->pBinds)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->bindCount; ++i)
            {
                transform_tohost_VkSparseImageMemoryBind(resourceTracker, (VkSparseImageMemoryBind*)(toTransform->pBinds + i));
            }
        }
    }
}

void transform_fromhost_VkSparseImageMemoryBindInfo(
    ResourceTracker* resourceTracker,
    VkSparseImageMemoryBindInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform)
    {
        if (toTransform->pBinds)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->bindCount; ++i)
            {
                transform_fromhost_VkSparseImageMemoryBind(resourceTracker, (VkSparseImageMemoryBind*)(toTransform->pBinds + i));
            }
        }
    }
}

void transform_tohost_VkBindSparseInfo(
    ResourceTracker* resourceTracker,
    VkBindSparseInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pBufferBinds)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->bufferBindCount; ++i)
            {
                transform_tohost_VkSparseBufferMemoryBindInfo(resourceTracker, (VkSparseBufferMemoryBindInfo*)(toTransform->pBufferBinds + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pImageOpaqueBinds)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->imageOpaqueBindCount; ++i)
            {
                transform_tohost_VkSparseImageOpaqueMemoryBindInfo(resourceTracker, (VkSparseImageOpaqueMemoryBindInfo*)(toTransform->pImageOpaqueBinds + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pImageBinds)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->imageBindCount; ++i)
            {
                transform_tohost_VkSparseImageMemoryBindInfo(resourceTracker, (VkSparseImageMemoryBindInfo*)(toTransform->pImageBinds + i));
            }
        }
    }
}

void transform_fromhost_VkBindSparseInfo(
    ResourceTracker* resourceTracker,
    VkBindSparseInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pBufferBinds)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->bufferBindCount; ++i)
            {
                transform_fromhost_VkSparseBufferMemoryBindInfo(resourceTracker, (VkSparseBufferMemoryBindInfo*)(toTransform->pBufferBinds + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pImageOpaqueBinds)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->imageOpaqueBindCount; ++i)
            {
                transform_fromhost_VkSparseImageOpaqueMemoryBindInfo(resourceTracker, (VkSparseImageOpaqueMemoryBindInfo*)(toTransform->pImageOpaqueBinds + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pImageBinds)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->imageBindCount; ++i)
            {
                transform_fromhost_VkSparseImageMemoryBindInfo(resourceTracker, (VkSparseImageMemoryBindInfo*)(toTransform->pImageBinds + i));
            }
        }
    }
}

void transform_tohost_VkSparseImageFormatProperties(
    ResourceTracker* resourceTracker,
    VkSparseImageFormatProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->imageGranularity));
}

void transform_fromhost_VkSparseImageFormatProperties(
    ResourceTracker* resourceTracker,
    VkSparseImageFormatProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->imageGranularity));
}

void transform_tohost_VkSparseImageMemoryRequirements(
    ResourceTracker* resourceTracker,
    VkSparseImageMemoryRequirements* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkSparseImageFormatProperties(resourceTracker, (VkSparseImageFormatProperties*)(&toTransform->formatProperties));
}

void transform_fromhost_VkSparseImageMemoryRequirements(
    ResourceTracker* resourceTracker,
    VkSparseImageMemoryRequirements* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkSparseImageFormatProperties(resourceTracker, (VkSparseImageFormatProperties*)(&toTransform->formatProperties));
}

void transform_tohost_VkFenceCreateInfo(
    ResourceTracker* resourceTracker,
    VkFenceCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkFenceCreateInfo(
    ResourceTracker* resourceTracker,
    VkFenceCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkSemaphoreCreateInfo(
    ResourceTracker* resourceTracker,
    VkSemaphoreCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkSemaphoreCreateInfo(
    ResourceTracker* resourceTracker,
    VkSemaphoreCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkEventCreateInfo(
    ResourceTracker* resourceTracker,
    VkEventCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkEventCreateInfo(
    ResourceTracker* resourceTracker,
    VkEventCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkQueryPoolCreateInfo(
    ResourceTracker* resourceTracker,
    VkQueryPoolCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkQueryPoolCreateInfo(
    ResourceTracker* resourceTracker,
    VkQueryPoolCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkBufferCreateInfo(
    ResourceTracker* resourceTracker,
    VkBufferCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkBufferCreateInfo(
    ResourceTracker* resourceTracker,
    VkBufferCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkBufferViewCreateInfo(
    ResourceTracker* resourceTracker,
    VkBufferViewCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkBufferViewCreateInfo(
    ResourceTracker* resourceTracker,
    VkBufferViewCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkImageCreateInfo(
    ResourceTracker* resourceTracker,
    VkImageCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->extent));
}

void transform_fromhost_VkImageCreateInfo(
    ResourceTracker* resourceTracker,
    VkImageCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->extent));
}

void transform_tohost_VkSubresourceLayout(
    ResourceTracker* resourceTracker,
    VkSubresourceLayout* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkSubresourceLayout(
    ResourceTracker* resourceTracker,
    VkSubresourceLayout* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkComponentMapping(
    ResourceTracker* resourceTracker,
    VkComponentMapping* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkComponentMapping(
    ResourceTracker* resourceTracker,
    VkComponentMapping* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkImageViewCreateInfo(
    ResourceTracker* resourceTracker,
    VkImageViewCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkComponentMapping(resourceTracker, (VkComponentMapping*)(&toTransform->components));
    transform_tohost_VkImageSubresourceRange(resourceTracker, (VkImageSubresourceRange*)(&toTransform->subresourceRange));
}

void transform_fromhost_VkImageViewCreateInfo(
    ResourceTracker* resourceTracker,
    VkImageViewCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkComponentMapping(resourceTracker, (VkComponentMapping*)(&toTransform->components));
    transform_fromhost_VkImageSubresourceRange(resourceTracker, (VkImageSubresourceRange*)(&toTransform->subresourceRange));
}

void transform_tohost_VkShaderModuleCreateInfo(
    ResourceTracker* resourceTracker,
    VkShaderModuleCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkShaderModuleCreateInfo(
    ResourceTracker* resourceTracker,
    VkShaderModuleCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPipelineCacheCreateInfo(
    ResourceTracker* resourceTracker,
    VkPipelineCacheCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPipelineCacheCreateInfo(
    ResourceTracker* resourceTracker,
    VkPipelineCacheCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkSpecializationMapEntry(
    ResourceTracker* resourceTracker,
    VkSpecializationMapEntry* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkSpecializationMapEntry(
    ResourceTracker* resourceTracker,
    VkSpecializationMapEntry* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkSpecializationInfo(
    ResourceTracker* resourceTracker,
    VkSpecializationInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform)
    {
        if (toTransform->pMapEntries)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->mapEntryCount; ++i)
            {
                transform_tohost_VkSpecializationMapEntry(resourceTracker, (VkSpecializationMapEntry*)(toTransform->pMapEntries + i));
            }
        }
    }
}

void transform_fromhost_VkSpecializationInfo(
    ResourceTracker* resourceTracker,
    VkSpecializationInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform)
    {
        if (toTransform->pMapEntries)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->mapEntryCount; ++i)
            {
                transform_fromhost_VkSpecializationMapEntry(resourceTracker, (VkSpecializationMapEntry*)(toTransform->pMapEntries + i));
            }
        }
    }
}

void transform_tohost_VkPipelineShaderStageCreateInfo(
    ResourceTracker* resourceTracker,
    VkPipelineShaderStageCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform->pSpecializationInfo)
    {
        transform_tohost_VkSpecializationInfo(resourceTracker, (VkSpecializationInfo*)(toTransform->pSpecializationInfo));
    }
}

void transform_fromhost_VkPipelineShaderStageCreateInfo(
    ResourceTracker* resourceTracker,
    VkPipelineShaderStageCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform->pSpecializationInfo)
    {
        transform_fromhost_VkSpecializationInfo(resourceTracker, (VkSpecializationInfo*)(toTransform->pSpecializationInfo));
    }
}

void transform_tohost_VkComputePipelineCreateInfo(
    ResourceTracker* resourceTracker,
    VkComputePipelineCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkPipelineShaderStageCreateInfo(resourceTracker, (VkPipelineShaderStageCreateInfo*)(&toTransform->stage));
}

void transform_fromhost_VkComputePipelineCreateInfo(
    ResourceTracker* resourceTracker,
    VkComputePipelineCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkPipelineShaderStageCreateInfo(resourceTracker, (VkPipelineShaderStageCreateInfo*)(&toTransform->stage));
}

void transform_tohost_VkVertexInputBindingDescription(
    ResourceTracker* resourceTracker,
    VkVertexInputBindingDescription* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkVertexInputBindingDescription(
    ResourceTracker* resourceTracker,
    VkVertexInputBindingDescription* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkVertexInputAttributeDescription(
    ResourceTracker* resourceTracker,
    VkVertexInputAttributeDescription* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkVertexInputAttributeDescription(
    ResourceTracker* resourceTracker,
    VkVertexInputAttributeDescription* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkPipelineVertexInputStateCreateInfo(
    ResourceTracker* resourceTracker,
    VkPipelineVertexInputStateCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pVertexBindingDescriptions)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->vertexBindingDescriptionCount; ++i)
            {
                transform_tohost_VkVertexInputBindingDescription(resourceTracker, (VkVertexInputBindingDescription*)(toTransform->pVertexBindingDescriptions + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pVertexAttributeDescriptions)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->vertexAttributeDescriptionCount; ++i)
            {
                transform_tohost_VkVertexInputAttributeDescription(resourceTracker, (VkVertexInputAttributeDescription*)(toTransform->pVertexAttributeDescriptions + i));
            }
        }
    }
}

void transform_fromhost_VkPipelineVertexInputStateCreateInfo(
    ResourceTracker* resourceTracker,
    VkPipelineVertexInputStateCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pVertexBindingDescriptions)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->vertexBindingDescriptionCount; ++i)
            {
                transform_fromhost_VkVertexInputBindingDescription(resourceTracker, (VkVertexInputBindingDescription*)(toTransform->pVertexBindingDescriptions + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pVertexAttributeDescriptions)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->vertexAttributeDescriptionCount; ++i)
            {
                transform_fromhost_VkVertexInputAttributeDescription(resourceTracker, (VkVertexInputAttributeDescription*)(toTransform->pVertexAttributeDescriptions + i));
            }
        }
    }
}

void transform_tohost_VkPipelineInputAssemblyStateCreateInfo(
    ResourceTracker* resourceTracker,
    VkPipelineInputAssemblyStateCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPipelineInputAssemblyStateCreateInfo(
    ResourceTracker* resourceTracker,
    VkPipelineInputAssemblyStateCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPipelineTessellationStateCreateInfo(
    ResourceTracker* resourceTracker,
    VkPipelineTessellationStateCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPipelineTessellationStateCreateInfo(
    ResourceTracker* resourceTracker,
    VkPipelineTessellationStateCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkViewport(
    ResourceTracker* resourceTracker,
    VkViewport* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkViewport(
    ResourceTracker* resourceTracker,
    VkViewport* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkPipelineViewportStateCreateInfo(
    ResourceTracker* resourceTracker,
    VkPipelineViewportStateCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pViewports)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->viewportCount; ++i)
            {
                transform_tohost_VkViewport(resourceTracker, (VkViewport*)(toTransform->pViewports + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pScissors)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->scissorCount; ++i)
            {
                transform_tohost_VkRect2D(resourceTracker, (VkRect2D*)(toTransform->pScissors + i));
            }
        }
    }
}

void transform_fromhost_VkPipelineViewportStateCreateInfo(
    ResourceTracker* resourceTracker,
    VkPipelineViewportStateCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pViewports)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->viewportCount; ++i)
            {
                transform_fromhost_VkViewport(resourceTracker, (VkViewport*)(toTransform->pViewports + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pScissors)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->scissorCount; ++i)
            {
                transform_fromhost_VkRect2D(resourceTracker, (VkRect2D*)(toTransform->pScissors + i));
            }
        }
    }
}

void transform_tohost_VkPipelineRasterizationStateCreateInfo(
    ResourceTracker* resourceTracker,
    VkPipelineRasterizationStateCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPipelineRasterizationStateCreateInfo(
    ResourceTracker* resourceTracker,
    VkPipelineRasterizationStateCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPipelineMultisampleStateCreateInfo(
    ResourceTracker* resourceTracker,
    VkPipelineMultisampleStateCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPipelineMultisampleStateCreateInfo(
    ResourceTracker* resourceTracker,
    VkPipelineMultisampleStateCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkStencilOpState(
    ResourceTracker* resourceTracker,
    VkStencilOpState* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkStencilOpState(
    ResourceTracker* resourceTracker,
    VkStencilOpState* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkPipelineDepthStencilStateCreateInfo(
    ResourceTracker* resourceTracker,
    VkPipelineDepthStencilStateCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkStencilOpState(resourceTracker, (VkStencilOpState*)(&toTransform->front));
    transform_tohost_VkStencilOpState(resourceTracker, (VkStencilOpState*)(&toTransform->back));
}

void transform_fromhost_VkPipelineDepthStencilStateCreateInfo(
    ResourceTracker* resourceTracker,
    VkPipelineDepthStencilStateCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkStencilOpState(resourceTracker, (VkStencilOpState*)(&toTransform->front));
    transform_fromhost_VkStencilOpState(resourceTracker, (VkStencilOpState*)(&toTransform->back));
}

void transform_tohost_VkPipelineColorBlendAttachmentState(
    ResourceTracker* resourceTracker,
    VkPipelineColorBlendAttachmentState* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkPipelineColorBlendAttachmentState(
    ResourceTracker* resourceTracker,
    VkPipelineColorBlendAttachmentState* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkPipelineColorBlendStateCreateInfo(
    ResourceTracker* resourceTracker,
    VkPipelineColorBlendStateCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pAttachments)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentCount; ++i)
            {
                transform_tohost_VkPipelineColorBlendAttachmentState(resourceTracker, (VkPipelineColorBlendAttachmentState*)(toTransform->pAttachments + i));
            }
        }
    }
}

void transform_fromhost_VkPipelineColorBlendStateCreateInfo(
    ResourceTracker* resourceTracker,
    VkPipelineColorBlendStateCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pAttachments)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentCount; ++i)
            {
                transform_fromhost_VkPipelineColorBlendAttachmentState(resourceTracker, (VkPipelineColorBlendAttachmentState*)(toTransform->pAttachments + i));
            }
        }
    }
}

void transform_tohost_VkPipelineDynamicStateCreateInfo(
    ResourceTracker* resourceTracker,
    VkPipelineDynamicStateCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPipelineDynamicStateCreateInfo(
    ResourceTracker* resourceTracker,
    VkPipelineDynamicStateCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkGraphicsPipelineCreateInfo(
    ResourceTracker* resourceTracker,
    VkGraphicsPipelineCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pStages)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->stageCount; ++i)
            {
                transform_tohost_VkPipelineShaderStageCreateInfo(resourceTracker, (VkPipelineShaderStageCreateInfo*)(toTransform->pStages + i));
            }
        }
    }
    if (toTransform->pVertexInputState)
    {
        transform_tohost_VkPipelineVertexInputStateCreateInfo(resourceTracker, (VkPipelineVertexInputStateCreateInfo*)(toTransform->pVertexInputState));
    }
    if (toTransform->pInputAssemblyState)
    {
        transform_tohost_VkPipelineInputAssemblyStateCreateInfo(resourceTracker, (VkPipelineInputAssemblyStateCreateInfo*)(toTransform->pInputAssemblyState));
    }
    if (toTransform->pTessellationState)
    {
        transform_tohost_VkPipelineTessellationStateCreateInfo(resourceTracker, (VkPipelineTessellationStateCreateInfo*)(toTransform->pTessellationState));
    }
    if (toTransform->pViewportState)
    {
        transform_tohost_VkPipelineViewportStateCreateInfo(resourceTracker, (VkPipelineViewportStateCreateInfo*)(toTransform->pViewportState));
    }
    if (toTransform->pRasterizationState)
    {
        transform_tohost_VkPipelineRasterizationStateCreateInfo(resourceTracker, (VkPipelineRasterizationStateCreateInfo*)(toTransform->pRasterizationState));
    }
    if (toTransform->pMultisampleState)
    {
        transform_tohost_VkPipelineMultisampleStateCreateInfo(resourceTracker, (VkPipelineMultisampleStateCreateInfo*)(toTransform->pMultisampleState));
    }
    if (toTransform->pDepthStencilState)
    {
        transform_tohost_VkPipelineDepthStencilStateCreateInfo(resourceTracker, (VkPipelineDepthStencilStateCreateInfo*)(toTransform->pDepthStencilState));
    }
    if (toTransform->pColorBlendState)
    {
        transform_tohost_VkPipelineColorBlendStateCreateInfo(resourceTracker, (VkPipelineColorBlendStateCreateInfo*)(toTransform->pColorBlendState));
    }
    if (toTransform->pDynamicState)
    {
        transform_tohost_VkPipelineDynamicStateCreateInfo(resourceTracker, (VkPipelineDynamicStateCreateInfo*)(toTransform->pDynamicState));
    }
}

void transform_fromhost_VkGraphicsPipelineCreateInfo(
    ResourceTracker* resourceTracker,
    VkGraphicsPipelineCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pStages)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->stageCount; ++i)
            {
                transform_fromhost_VkPipelineShaderStageCreateInfo(resourceTracker, (VkPipelineShaderStageCreateInfo*)(toTransform->pStages + i));
            }
        }
    }
    if (toTransform->pVertexInputState)
    {
        transform_fromhost_VkPipelineVertexInputStateCreateInfo(resourceTracker, (VkPipelineVertexInputStateCreateInfo*)(toTransform->pVertexInputState));
    }
    if (toTransform->pInputAssemblyState)
    {
        transform_fromhost_VkPipelineInputAssemblyStateCreateInfo(resourceTracker, (VkPipelineInputAssemblyStateCreateInfo*)(toTransform->pInputAssemblyState));
    }
    if (toTransform->pTessellationState)
    {
        transform_fromhost_VkPipelineTessellationStateCreateInfo(resourceTracker, (VkPipelineTessellationStateCreateInfo*)(toTransform->pTessellationState));
    }
    if (toTransform->pViewportState)
    {
        transform_fromhost_VkPipelineViewportStateCreateInfo(resourceTracker, (VkPipelineViewportStateCreateInfo*)(toTransform->pViewportState));
    }
    if (toTransform->pRasterizationState)
    {
        transform_fromhost_VkPipelineRasterizationStateCreateInfo(resourceTracker, (VkPipelineRasterizationStateCreateInfo*)(toTransform->pRasterizationState));
    }
    if (toTransform->pMultisampleState)
    {
        transform_fromhost_VkPipelineMultisampleStateCreateInfo(resourceTracker, (VkPipelineMultisampleStateCreateInfo*)(toTransform->pMultisampleState));
    }
    if (toTransform->pDepthStencilState)
    {
        transform_fromhost_VkPipelineDepthStencilStateCreateInfo(resourceTracker, (VkPipelineDepthStencilStateCreateInfo*)(toTransform->pDepthStencilState));
    }
    if (toTransform->pColorBlendState)
    {
        transform_fromhost_VkPipelineColorBlendStateCreateInfo(resourceTracker, (VkPipelineColorBlendStateCreateInfo*)(toTransform->pColorBlendState));
    }
    if (toTransform->pDynamicState)
    {
        transform_fromhost_VkPipelineDynamicStateCreateInfo(resourceTracker, (VkPipelineDynamicStateCreateInfo*)(toTransform->pDynamicState));
    }
}

void transform_tohost_VkPushConstantRange(
    ResourceTracker* resourceTracker,
    VkPushConstantRange* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkPushConstantRange(
    ResourceTracker* resourceTracker,
    VkPushConstantRange* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkPipelineLayoutCreateInfo(
    ResourceTracker* resourceTracker,
    VkPipelineLayoutCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pPushConstantRanges)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->pushConstantRangeCount; ++i)
            {
                transform_tohost_VkPushConstantRange(resourceTracker, (VkPushConstantRange*)(toTransform->pPushConstantRanges + i));
            }
        }
    }
}

void transform_fromhost_VkPipelineLayoutCreateInfo(
    ResourceTracker* resourceTracker,
    VkPipelineLayoutCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pPushConstantRanges)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->pushConstantRangeCount; ++i)
            {
                transform_fromhost_VkPushConstantRange(resourceTracker, (VkPushConstantRange*)(toTransform->pPushConstantRanges + i));
            }
        }
    }
}

void transform_tohost_VkSamplerCreateInfo(
    ResourceTracker* resourceTracker,
    VkSamplerCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkSamplerCreateInfo(
    ResourceTracker* resourceTracker,
    VkSamplerCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkCopyDescriptorSet(
    ResourceTracker* resourceTracker,
    VkCopyDescriptorSet* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkCopyDescriptorSet(
    ResourceTracker* resourceTracker,
    VkCopyDescriptorSet* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDescriptorBufferInfo(
    ResourceTracker* resourceTracker,
    VkDescriptorBufferInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkDescriptorBufferInfo(
    ResourceTracker* resourceTracker,
    VkDescriptorBufferInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkDescriptorImageInfo(
    ResourceTracker* resourceTracker,
    VkDescriptorImageInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkDescriptorImageInfo(
    ResourceTracker* resourceTracker,
    VkDescriptorImageInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkDescriptorPoolSize(
    ResourceTracker* resourceTracker,
    VkDescriptorPoolSize* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkDescriptorPoolSize(
    ResourceTracker* resourceTracker,
    VkDescriptorPoolSize* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkDescriptorPoolCreateInfo(
    ResourceTracker* resourceTracker,
    VkDescriptorPoolCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pPoolSizes)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->poolSizeCount; ++i)
            {
                transform_tohost_VkDescriptorPoolSize(resourceTracker, (VkDescriptorPoolSize*)(toTransform->pPoolSizes + i));
            }
        }
    }
}

void transform_fromhost_VkDescriptorPoolCreateInfo(
    ResourceTracker* resourceTracker,
    VkDescriptorPoolCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pPoolSizes)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->poolSizeCount; ++i)
            {
                transform_fromhost_VkDescriptorPoolSize(resourceTracker, (VkDescriptorPoolSize*)(toTransform->pPoolSizes + i));
            }
        }
    }
}

void transform_tohost_VkDescriptorSetAllocateInfo(
    ResourceTracker* resourceTracker,
    VkDescriptorSetAllocateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDescriptorSetAllocateInfo(
    ResourceTracker* resourceTracker,
    VkDescriptorSetAllocateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDescriptorSetLayoutBinding(
    ResourceTracker* resourceTracker,
    VkDescriptorSetLayoutBinding* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkDescriptorSetLayoutBinding(
    ResourceTracker* resourceTracker,
    VkDescriptorSetLayoutBinding* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkDescriptorSetLayoutCreateInfo(
    ResourceTracker* resourceTracker,
    VkDescriptorSetLayoutCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pBindings)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->bindingCount; ++i)
            {
                transform_tohost_VkDescriptorSetLayoutBinding(resourceTracker, (VkDescriptorSetLayoutBinding*)(toTransform->pBindings + i));
            }
        }
    }
}

void transform_fromhost_VkDescriptorSetLayoutCreateInfo(
    ResourceTracker* resourceTracker,
    VkDescriptorSetLayoutCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pBindings)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->bindingCount; ++i)
            {
                transform_fromhost_VkDescriptorSetLayoutBinding(resourceTracker, (VkDescriptorSetLayoutBinding*)(toTransform->pBindings + i));
            }
        }
    }
}

void transform_tohost_VkWriteDescriptorSet(
    ResourceTracker* resourceTracker,
    VkWriteDescriptorSet* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pImageInfo)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->descriptorCount; ++i)
            {
                transform_tohost_VkDescriptorImageInfo(resourceTracker, (VkDescriptorImageInfo*)(toTransform->pImageInfo + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pBufferInfo)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->descriptorCount; ++i)
            {
                transform_tohost_VkDescriptorBufferInfo(resourceTracker, (VkDescriptorBufferInfo*)(toTransform->pBufferInfo + i));
            }
        }
    }
}

void transform_fromhost_VkWriteDescriptorSet(
    ResourceTracker* resourceTracker,
    VkWriteDescriptorSet* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pImageInfo)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->descriptorCount; ++i)
            {
                transform_fromhost_VkDescriptorImageInfo(resourceTracker, (VkDescriptorImageInfo*)(toTransform->pImageInfo + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pBufferInfo)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->descriptorCount; ++i)
            {
                transform_fromhost_VkDescriptorBufferInfo(resourceTracker, (VkDescriptorBufferInfo*)(toTransform->pBufferInfo + i));
            }
        }
    }
}

void transform_tohost_VkAttachmentDescription(
    ResourceTracker* resourceTracker,
    VkAttachmentDescription* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkAttachmentDescription(
    ResourceTracker* resourceTracker,
    VkAttachmentDescription* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkAttachmentReference(
    ResourceTracker* resourceTracker,
    VkAttachmentReference* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkAttachmentReference(
    ResourceTracker* resourceTracker,
    VkAttachmentReference* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkFramebufferCreateInfo(
    ResourceTracker* resourceTracker,
    VkFramebufferCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkFramebufferCreateInfo(
    ResourceTracker* resourceTracker,
    VkFramebufferCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkSubpassDescription(
    ResourceTracker* resourceTracker,
    VkSubpassDescription* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform)
    {
        if (toTransform->pInputAttachments)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->inputAttachmentCount; ++i)
            {
                transform_tohost_VkAttachmentReference(resourceTracker, (VkAttachmentReference*)(toTransform->pInputAttachments + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pColorAttachments)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i)
            {
                transform_tohost_VkAttachmentReference(resourceTracker, (VkAttachmentReference*)(toTransform->pColorAttachments + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pResolveAttachments)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i)
            {
                transform_tohost_VkAttachmentReference(resourceTracker, (VkAttachmentReference*)(toTransform->pResolveAttachments + i));
            }
        }
    }
    if (toTransform->pDepthStencilAttachment)
    {
        transform_tohost_VkAttachmentReference(resourceTracker, (VkAttachmentReference*)(toTransform->pDepthStencilAttachment));
    }
}

void transform_fromhost_VkSubpassDescription(
    ResourceTracker* resourceTracker,
    VkSubpassDescription* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform)
    {
        if (toTransform->pInputAttachments)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->inputAttachmentCount; ++i)
            {
                transform_fromhost_VkAttachmentReference(resourceTracker, (VkAttachmentReference*)(toTransform->pInputAttachments + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pColorAttachments)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i)
            {
                transform_fromhost_VkAttachmentReference(resourceTracker, (VkAttachmentReference*)(toTransform->pColorAttachments + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pResolveAttachments)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i)
            {
                transform_fromhost_VkAttachmentReference(resourceTracker, (VkAttachmentReference*)(toTransform->pResolveAttachments + i));
            }
        }
    }
    if (toTransform->pDepthStencilAttachment)
    {
        transform_fromhost_VkAttachmentReference(resourceTracker, (VkAttachmentReference*)(toTransform->pDepthStencilAttachment));
    }
}

void transform_tohost_VkSubpassDependency(
    ResourceTracker* resourceTracker,
    VkSubpassDependency* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkSubpassDependency(
    ResourceTracker* resourceTracker,
    VkSubpassDependency* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkRenderPassCreateInfo(
    ResourceTracker* resourceTracker,
    VkRenderPassCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pAttachments)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentCount; ++i)
            {
                transform_tohost_VkAttachmentDescription(resourceTracker, (VkAttachmentDescription*)(toTransform->pAttachments + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pSubpasses)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->subpassCount; ++i)
            {
                transform_tohost_VkSubpassDescription(resourceTracker, (VkSubpassDescription*)(toTransform->pSubpasses + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pDependencies)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->dependencyCount; ++i)
            {
                transform_tohost_VkSubpassDependency(resourceTracker, (VkSubpassDependency*)(toTransform->pDependencies + i));
            }
        }
    }
}

void transform_fromhost_VkRenderPassCreateInfo(
    ResourceTracker* resourceTracker,
    VkRenderPassCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pAttachments)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentCount; ++i)
            {
                transform_fromhost_VkAttachmentDescription(resourceTracker, (VkAttachmentDescription*)(toTransform->pAttachments + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pSubpasses)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->subpassCount; ++i)
            {
                transform_fromhost_VkSubpassDescription(resourceTracker, (VkSubpassDescription*)(toTransform->pSubpasses + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pDependencies)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->dependencyCount; ++i)
            {
                transform_fromhost_VkSubpassDependency(resourceTracker, (VkSubpassDependency*)(toTransform->pDependencies + i));
            }
        }
    }
}

void transform_tohost_VkCommandPoolCreateInfo(
    ResourceTracker* resourceTracker,
    VkCommandPoolCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkCommandPoolCreateInfo(
    ResourceTracker* resourceTracker,
    VkCommandPoolCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkCommandBufferAllocateInfo(
    ResourceTracker* resourceTracker,
    VkCommandBufferAllocateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkCommandBufferAllocateInfo(
    ResourceTracker* resourceTracker,
    VkCommandBufferAllocateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkCommandBufferInheritanceInfo(
    ResourceTracker* resourceTracker,
    VkCommandBufferInheritanceInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkCommandBufferInheritanceInfo(
    ResourceTracker* resourceTracker,
    VkCommandBufferInheritanceInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkCommandBufferBeginInfo(
    ResourceTracker* resourceTracker,
    VkCommandBufferBeginInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform->pInheritanceInfo)
    {
        transform_tohost_VkCommandBufferInheritanceInfo(resourceTracker, (VkCommandBufferInheritanceInfo*)(toTransform->pInheritanceInfo));
    }
}

void transform_fromhost_VkCommandBufferBeginInfo(
    ResourceTracker* resourceTracker,
    VkCommandBufferBeginInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform->pInheritanceInfo)
    {
        transform_fromhost_VkCommandBufferInheritanceInfo(resourceTracker, (VkCommandBufferInheritanceInfo*)(toTransform->pInheritanceInfo));
    }
}

void transform_tohost_VkBufferCopy(
    ResourceTracker* resourceTracker,
    VkBufferCopy* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkBufferCopy(
    ResourceTracker* resourceTracker,
    VkBufferCopy* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkImageSubresourceLayers(
    ResourceTracker* resourceTracker,
    VkImageSubresourceLayers* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkImageSubresourceLayers(
    ResourceTracker* resourceTracker,
    VkImageSubresourceLayers* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkBufferImageCopy(
    ResourceTracker* resourceTracker,
    VkBufferImageCopy* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->imageSubresource));
    transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->imageOffset));
    transform_tohost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->imageExtent));
}

void transform_fromhost_VkBufferImageCopy(
    ResourceTracker* resourceTracker,
    VkBufferImageCopy* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->imageSubresource));
    transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->imageOffset));
    transform_fromhost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->imageExtent));
}

void transform_tohost_VkClearColorValue(
    ResourceTracker* resourceTracker,
    VkClearColorValue* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkClearColorValue(
    ResourceTracker* resourceTracker,
    VkClearColorValue* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkClearDepthStencilValue(
    ResourceTracker* resourceTracker,
    VkClearDepthStencilValue* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkClearDepthStencilValue(
    ResourceTracker* resourceTracker,
    VkClearDepthStencilValue* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkClearValue(
    ResourceTracker* resourceTracker,
    VkClearValue* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkClearColorValue(resourceTracker, (VkClearColorValue*)(&toTransform->color));
    transform_tohost_VkClearDepthStencilValue(resourceTracker, (VkClearDepthStencilValue*)(&toTransform->depthStencil));
}

void transform_fromhost_VkClearValue(
    ResourceTracker* resourceTracker,
    VkClearValue* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkClearColorValue(resourceTracker, (VkClearColorValue*)(&toTransform->color));
    transform_fromhost_VkClearDepthStencilValue(resourceTracker, (VkClearDepthStencilValue*)(&toTransform->depthStencil));
}

void transform_tohost_VkClearAttachment(
    ResourceTracker* resourceTracker,
    VkClearAttachment* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkClearValue(resourceTracker, (VkClearValue*)(&toTransform->clearValue));
}

void transform_fromhost_VkClearAttachment(
    ResourceTracker* resourceTracker,
    VkClearAttachment* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkClearValue(resourceTracker, (VkClearValue*)(&toTransform->clearValue));
}

void transform_tohost_VkClearRect(
    ResourceTracker* resourceTracker,
    VkClearRect* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkRect2D(resourceTracker, (VkRect2D*)(&toTransform->rect));
}

void transform_fromhost_VkClearRect(
    ResourceTracker* resourceTracker,
    VkClearRect* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkRect2D(resourceTracker, (VkRect2D*)(&toTransform->rect));
}

void transform_tohost_VkImageBlit(
    ResourceTracker* resourceTracker,
    VkImageBlit* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
    for (uint32_t i = 0; i < (uint32_t)2; ++i)
    {
        transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(toTransform->srcOffsets + i));
    }
    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
    for (uint32_t i = 0; i < (uint32_t)2; ++i)
    {
        transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(toTransform->dstOffsets + i));
    }
}

void transform_fromhost_VkImageBlit(
    ResourceTracker* resourceTracker,
    VkImageBlit* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
    for (uint32_t i = 0; i < (uint32_t)2; ++i)
    {
        transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(toTransform->srcOffsets + i));
    }
    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
    for (uint32_t i = 0; i < (uint32_t)2; ++i)
    {
        transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(toTransform->dstOffsets + i));
    }
}

void transform_tohost_VkImageCopy(
    ResourceTracker* resourceTracker,
    VkImageCopy* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
    transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->srcOffset));
    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
    transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->dstOffset));
    transform_tohost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->extent));
}

void transform_fromhost_VkImageCopy(
    ResourceTracker* resourceTracker,
    VkImageCopy* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
    transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->srcOffset));
    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
    transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->dstOffset));
    transform_fromhost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->extent));
}

void transform_tohost_VkImageResolve(
    ResourceTracker* resourceTracker,
    VkImageResolve* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
    transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->srcOffset));
    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
    transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->dstOffset));
    transform_tohost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->extent));
}

void transform_fromhost_VkImageResolve(
    ResourceTracker* resourceTracker,
    VkImageResolve* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
    transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->srcOffset));
    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
    transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->dstOffset));
    transform_fromhost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->extent));
}

void transform_tohost_VkRenderPassBeginInfo(
    ResourceTracker* resourceTracker,
    VkRenderPassBeginInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkRect2D(resourceTracker, (VkRect2D*)(&toTransform->renderArea));
    if (toTransform)
    {
        if (toTransform->pClearValues)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->clearValueCount; ++i)
            {
                transform_tohost_VkClearValue(resourceTracker, (VkClearValue*)(toTransform->pClearValues + i));
            }
        }
    }
}

void transform_fromhost_VkRenderPassBeginInfo(
    ResourceTracker* resourceTracker,
    VkRenderPassBeginInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkRect2D(resourceTracker, (VkRect2D*)(&toTransform->renderArea));
    if (toTransform)
    {
        if (toTransform->pClearValues)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->clearValueCount; ++i)
            {
                transform_fromhost_VkClearValue(resourceTracker, (VkClearValue*)(toTransform->pClearValues + i));
            }
        }
    }
}

#endif
#ifdef VK_VERSION_1_1
void transform_tohost_VkPhysicalDeviceSubgroupProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceSubgroupProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceSubgroupProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceSubgroupProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkBindBufferMemoryInfo(
    ResourceTracker* resourceTracker,
    VkBindBufferMemoryInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkBindBufferMemoryInfo(
    ResourceTracker* resourceTracker,
    VkBindBufferMemoryInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkBindImageMemoryInfo(
    ResourceTracker* resourceTracker,
    VkBindImageMemoryInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkBindImageMemoryInfo(
    ResourceTracker* resourceTracker,
    VkBindImageMemoryInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDevice16BitStorageFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDevice16BitStorageFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDevice16BitStorageFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDevice16BitStorageFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkMemoryDedicatedRequirements(
    ResourceTracker* resourceTracker,
    VkMemoryDedicatedRequirements* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkMemoryDedicatedRequirements(
    ResourceTracker* resourceTracker,
    VkMemoryDedicatedRequirements* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkMemoryDedicatedAllocateInfo(
    ResourceTracker* resourceTracker,
    VkMemoryDedicatedAllocateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkMemoryDedicatedAllocateInfo(
    ResourceTracker* resourceTracker,
    VkMemoryDedicatedAllocateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkMemoryAllocateFlagsInfo(
    ResourceTracker* resourceTracker,
    VkMemoryAllocateFlagsInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkMemoryAllocateFlagsInfo(
    ResourceTracker* resourceTracker,
    VkMemoryAllocateFlagsInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDeviceGroupRenderPassBeginInfo(
    ResourceTracker* resourceTracker,
    VkDeviceGroupRenderPassBeginInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pDeviceRenderAreas)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->deviceRenderAreaCount; ++i)
            {
                transform_tohost_VkRect2D(resourceTracker, (VkRect2D*)(toTransform->pDeviceRenderAreas + i));
            }
        }
    }
}

void transform_fromhost_VkDeviceGroupRenderPassBeginInfo(
    ResourceTracker* resourceTracker,
    VkDeviceGroupRenderPassBeginInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pDeviceRenderAreas)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->deviceRenderAreaCount; ++i)
            {
                transform_fromhost_VkRect2D(resourceTracker, (VkRect2D*)(toTransform->pDeviceRenderAreas + i));
            }
        }
    }
}

void transform_tohost_VkDeviceGroupCommandBufferBeginInfo(
    ResourceTracker* resourceTracker,
    VkDeviceGroupCommandBufferBeginInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDeviceGroupCommandBufferBeginInfo(
    ResourceTracker* resourceTracker,
    VkDeviceGroupCommandBufferBeginInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDeviceGroupSubmitInfo(
    ResourceTracker* resourceTracker,
    VkDeviceGroupSubmitInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDeviceGroupSubmitInfo(
    ResourceTracker* resourceTracker,
    VkDeviceGroupSubmitInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDeviceGroupBindSparseInfo(
    ResourceTracker* resourceTracker,
    VkDeviceGroupBindSparseInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDeviceGroupBindSparseInfo(
    ResourceTracker* resourceTracker,
    VkDeviceGroupBindSparseInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkBindBufferMemoryDeviceGroupInfo(
    ResourceTracker* resourceTracker,
    VkBindBufferMemoryDeviceGroupInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkBindBufferMemoryDeviceGroupInfo(
    ResourceTracker* resourceTracker,
    VkBindBufferMemoryDeviceGroupInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkBindImageMemoryDeviceGroupInfo(
    ResourceTracker* resourceTracker,
    VkBindImageMemoryDeviceGroupInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pSplitInstanceBindRegions)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->splitInstanceBindRegionCount; ++i)
            {
                transform_tohost_VkRect2D(resourceTracker, (VkRect2D*)(toTransform->pSplitInstanceBindRegions + i));
            }
        }
    }
}

void transform_fromhost_VkBindImageMemoryDeviceGroupInfo(
    ResourceTracker* resourceTracker,
    VkBindImageMemoryDeviceGroupInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pSplitInstanceBindRegions)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->splitInstanceBindRegionCount; ++i)
            {
                transform_fromhost_VkRect2D(resourceTracker, (VkRect2D*)(toTransform->pSplitInstanceBindRegions + i));
            }
        }
    }
}

void transform_tohost_VkPhysicalDeviceGroupProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceGroupProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceGroupProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceGroupProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDeviceGroupDeviceCreateInfo(
    ResourceTracker* resourceTracker,
    VkDeviceGroupDeviceCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDeviceGroupDeviceCreateInfo(
    ResourceTracker* resourceTracker,
    VkDeviceGroupDeviceCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkBufferMemoryRequirementsInfo2(
    ResourceTracker* resourceTracker,
    VkBufferMemoryRequirementsInfo2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkBufferMemoryRequirementsInfo2(
    ResourceTracker* resourceTracker,
    VkBufferMemoryRequirementsInfo2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkImageMemoryRequirementsInfo2(
    ResourceTracker* resourceTracker,
    VkImageMemoryRequirementsInfo2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkImageMemoryRequirementsInfo2(
    ResourceTracker* resourceTracker,
    VkImageMemoryRequirementsInfo2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkImageSparseMemoryRequirementsInfo2(
    ResourceTracker* resourceTracker,
    VkImageSparseMemoryRequirementsInfo2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkImageSparseMemoryRequirementsInfo2(
    ResourceTracker* resourceTracker,
    VkImageSparseMemoryRequirementsInfo2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkMemoryRequirements2(
    ResourceTracker* resourceTracker,
    VkMemoryRequirements2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkMemoryRequirements(resourceTracker, (VkMemoryRequirements*)(&toTransform->memoryRequirements));
}

void transform_fromhost_VkMemoryRequirements2(
    ResourceTracker* resourceTracker,
    VkMemoryRequirements2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkMemoryRequirements(resourceTracker, (VkMemoryRequirements*)(&toTransform->memoryRequirements));
}

void transform_tohost_VkSparseImageMemoryRequirements2(
    ResourceTracker* resourceTracker,
    VkSparseImageMemoryRequirements2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkSparseImageMemoryRequirements(resourceTracker, (VkSparseImageMemoryRequirements*)(&toTransform->memoryRequirements));
}

void transform_fromhost_VkSparseImageMemoryRequirements2(
    ResourceTracker* resourceTracker,
    VkSparseImageMemoryRequirements2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkSparseImageMemoryRequirements(resourceTracker, (VkSparseImageMemoryRequirements*)(&toTransform->memoryRequirements));
}

void transform_tohost_VkPhysicalDeviceFeatures2(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFeatures2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkPhysicalDeviceFeatures(resourceTracker, (VkPhysicalDeviceFeatures*)(&toTransform->features));
}

void transform_fromhost_VkPhysicalDeviceFeatures2(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFeatures2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkPhysicalDeviceFeatures(resourceTracker, (VkPhysicalDeviceFeatures*)(&toTransform->features));
}

void transform_tohost_VkPhysicalDeviceProperties2(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceProperties2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkPhysicalDeviceProperties(resourceTracker, (VkPhysicalDeviceProperties*)(&toTransform->properties));
}

void transform_fromhost_VkPhysicalDeviceProperties2(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceProperties2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkPhysicalDeviceProperties(resourceTracker, (VkPhysicalDeviceProperties*)(&toTransform->properties));
}

void transform_tohost_VkFormatProperties2(
    ResourceTracker* resourceTracker,
    VkFormatProperties2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkFormatProperties(resourceTracker, (VkFormatProperties*)(&toTransform->formatProperties));
}

void transform_fromhost_VkFormatProperties2(
    ResourceTracker* resourceTracker,
    VkFormatProperties2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkFormatProperties(resourceTracker, (VkFormatProperties*)(&toTransform->formatProperties));
}

void transform_tohost_VkImageFormatProperties2(
    ResourceTracker* resourceTracker,
    VkImageFormatProperties2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkImageFormatProperties(resourceTracker, (VkImageFormatProperties*)(&toTransform->imageFormatProperties));
}

void transform_fromhost_VkImageFormatProperties2(
    ResourceTracker* resourceTracker,
    VkImageFormatProperties2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkImageFormatProperties(resourceTracker, (VkImageFormatProperties*)(&toTransform->imageFormatProperties));
}

void transform_tohost_VkPhysicalDeviceImageFormatInfo2(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceImageFormatInfo2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceImageFormatInfo2(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceImageFormatInfo2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkQueueFamilyProperties2(
    ResourceTracker* resourceTracker,
    VkQueueFamilyProperties2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkQueueFamilyProperties(resourceTracker, (VkQueueFamilyProperties*)(&toTransform->queueFamilyProperties));
}

void transform_fromhost_VkQueueFamilyProperties2(
    ResourceTracker* resourceTracker,
    VkQueueFamilyProperties2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkQueueFamilyProperties(resourceTracker, (VkQueueFamilyProperties*)(&toTransform->queueFamilyProperties));
}

void transform_tohost_VkPhysicalDeviceMemoryProperties2(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceMemoryProperties2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkPhysicalDeviceMemoryProperties(resourceTracker, (VkPhysicalDeviceMemoryProperties*)(&toTransform->memoryProperties));
}

void transform_fromhost_VkPhysicalDeviceMemoryProperties2(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceMemoryProperties2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkPhysicalDeviceMemoryProperties(resourceTracker, (VkPhysicalDeviceMemoryProperties*)(&toTransform->memoryProperties));
}

void transform_tohost_VkSparseImageFormatProperties2(
    ResourceTracker* resourceTracker,
    VkSparseImageFormatProperties2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkSparseImageFormatProperties(resourceTracker, (VkSparseImageFormatProperties*)(&toTransform->properties));
}

void transform_fromhost_VkSparseImageFormatProperties2(
    ResourceTracker* resourceTracker,
    VkSparseImageFormatProperties2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkSparseImageFormatProperties(resourceTracker, (VkSparseImageFormatProperties*)(&toTransform->properties));
}

void transform_tohost_VkPhysicalDeviceSparseImageFormatInfo2(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceSparseImageFormatInfo2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceSparseImageFormatInfo2(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceSparseImageFormatInfo2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDevicePointClippingProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDevicePointClippingProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDevicePointClippingProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDevicePointClippingProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkInputAttachmentAspectReference(
    ResourceTracker* resourceTracker,
    VkInputAttachmentAspectReference* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkInputAttachmentAspectReference(
    ResourceTracker* resourceTracker,
    VkInputAttachmentAspectReference* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkRenderPassInputAttachmentAspectCreateInfo(
    ResourceTracker* resourceTracker,
    VkRenderPassInputAttachmentAspectCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pAspectReferences)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->aspectReferenceCount; ++i)
            {
                transform_tohost_VkInputAttachmentAspectReference(resourceTracker, (VkInputAttachmentAspectReference*)(toTransform->pAspectReferences + i));
            }
        }
    }
}

void transform_fromhost_VkRenderPassInputAttachmentAspectCreateInfo(
    ResourceTracker* resourceTracker,
    VkRenderPassInputAttachmentAspectCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pAspectReferences)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->aspectReferenceCount; ++i)
            {
                transform_fromhost_VkInputAttachmentAspectReference(resourceTracker, (VkInputAttachmentAspectReference*)(toTransform->pAspectReferences + i));
            }
        }
    }
}

void transform_tohost_VkImageViewUsageCreateInfo(
    ResourceTracker* resourceTracker,
    VkImageViewUsageCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkImageViewUsageCreateInfo(
    ResourceTracker* resourceTracker,
    VkImageViewUsageCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPipelineTessellationDomainOriginStateCreateInfo(
    ResourceTracker* resourceTracker,
    VkPipelineTessellationDomainOriginStateCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPipelineTessellationDomainOriginStateCreateInfo(
    ResourceTracker* resourceTracker,
    VkPipelineTessellationDomainOriginStateCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkRenderPassMultiviewCreateInfo(
    ResourceTracker* resourceTracker,
    VkRenderPassMultiviewCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkRenderPassMultiviewCreateInfo(
    ResourceTracker* resourceTracker,
    VkRenderPassMultiviewCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceMultiviewFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceMultiviewFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceMultiviewFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceMultiviewFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceMultiviewProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceMultiviewProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceMultiviewProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceMultiviewProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceVariablePointersFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceVariablePointersFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceVariablePointersFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceVariablePointersFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceProtectedMemoryFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceProtectedMemoryFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceProtectedMemoryFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceProtectedMemoryFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceProtectedMemoryProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceProtectedMemoryProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceProtectedMemoryProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceProtectedMemoryProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDeviceQueueInfo2(
    ResourceTracker* resourceTracker,
    VkDeviceQueueInfo2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDeviceQueueInfo2(
    ResourceTracker* resourceTracker,
    VkDeviceQueueInfo2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkProtectedSubmitInfo(
    ResourceTracker* resourceTracker,
    VkProtectedSubmitInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkProtectedSubmitInfo(
    ResourceTracker* resourceTracker,
    VkProtectedSubmitInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkSamplerYcbcrConversionCreateInfo(
    ResourceTracker* resourceTracker,
    VkSamplerYcbcrConversionCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkComponentMapping(resourceTracker, (VkComponentMapping*)(&toTransform->components));
}

void transform_fromhost_VkSamplerYcbcrConversionCreateInfo(
    ResourceTracker* resourceTracker,
    VkSamplerYcbcrConversionCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkComponentMapping(resourceTracker, (VkComponentMapping*)(&toTransform->components));
}

void transform_tohost_VkSamplerYcbcrConversionInfo(
    ResourceTracker* resourceTracker,
    VkSamplerYcbcrConversionInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkSamplerYcbcrConversionInfo(
    ResourceTracker* resourceTracker,
    VkSamplerYcbcrConversionInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkBindImagePlaneMemoryInfo(
    ResourceTracker* resourceTracker,
    VkBindImagePlaneMemoryInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkBindImagePlaneMemoryInfo(
    ResourceTracker* resourceTracker,
    VkBindImagePlaneMemoryInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkImagePlaneMemoryRequirementsInfo(
    ResourceTracker* resourceTracker,
    VkImagePlaneMemoryRequirementsInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkImagePlaneMemoryRequirementsInfo(
    ResourceTracker* resourceTracker,
    VkImagePlaneMemoryRequirementsInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceSamplerYcbcrConversionFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceSamplerYcbcrConversionFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkSamplerYcbcrConversionImageFormatProperties(
    ResourceTracker* resourceTracker,
    VkSamplerYcbcrConversionImageFormatProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkSamplerYcbcrConversionImageFormatProperties(
    ResourceTracker* resourceTracker,
    VkSamplerYcbcrConversionImageFormatProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDescriptorUpdateTemplateEntry(
    ResourceTracker* resourceTracker,
    VkDescriptorUpdateTemplateEntry* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkDescriptorUpdateTemplateEntry(
    ResourceTracker* resourceTracker,
    VkDescriptorUpdateTemplateEntry* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkDescriptorUpdateTemplateCreateInfo(
    ResourceTracker* resourceTracker,
    VkDescriptorUpdateTemplateCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pDescriptorUpdateEntries)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->descriptorUpdateEntryCount; ++i)
            {
                transform_tohost_VkDescriptorUpdateTemplateEntry(resourceTracker, (VkDescriptorUpdateTemplateEntry*)(toTransform->pDescriptorUpdateEntries + i));
            }
        }
    }
}

void transform_fromhost_VkDescriptorUpdateTemplateCreateInfo(
    ResourceTracker* resourceTracker,
    VkDescriptorUpdateTemplateCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pDescriptorUpdateEntries)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->descriptorUpdateEntryCount; ++i)
            {
                transform_fromhost_VkDescriptorUpdateTemplateEntry(resourceTracker, (VkDescriptorUpdateTemplateEntry*)(toTransform->pDescriptorUpdateEntries + i));
            }
        }
    }
}

void transform_tohost_VkExternalMemoryProperties(
    ResourceTracker* resourceTracker,
    VkExternalMemoryProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkExternalMemoryProperties(
    ResourceTracker* resourceTracker,
    VkExternalMemoryProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkPhysicalDeviceExternalImageFormatInfo(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceExternalImageFormatInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceExternalImageFormatInfo(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceExternalImageFormatInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkExternalImageFormatProperties(
    ResourceTracker* resourceTracker,
    VkExternalImageFormatProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    resourceTracker->transformImpl_VkExternalMemoryProperties_tohost(&toTransform->externalMemoryProperties, 1);
    transform_tohost_VkExternalMemoryProperties(resourceTracker, (VkExternalMemoryProperties*)(&toTransform->externalMemoryProperties));
}

void transform_fromhost_VkExternalImageFormatProperties(
    ResourceTracker* resourceTracker,
    VkExternalImageFormatProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    resourceTracker->transformImpl_VkExternalMemoryProperties_fromhost(&toTransform->externalMemoryProperties, 1);
    transform_fromhost_VkExternalMemoryProperties(resourceTracker, (VkExternalMemoryProperties*)(&toTransform->externalMemoryProperties));
}

void transform_tohost_VkPhysicalDeviceExternalBufferInfo(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceExternalBufferInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceExternalBufferInfo(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceExternalBufferInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkExternalBufferProperties(
    ResourceTracker* resourceTracker,
    VkExternalBufferProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    resourceTracker->transformImpl_VkExternalMemoryProperties_tohost(&toTransform->externalMemoryProperties, 1);
    transform_tohost_VkExternalMemoryProperties(resourceTracker, (VkExternalMemoryProperties*)(&toTransform->externalMemoryProperties));
}

void transform_fromhost_VkExternalBufferProperties(
    ResourceTracker* resourceTracker,
    VkExternalBufferProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    resourceTracker->transformImpl_VkExternalMemoryProperties_fromhost(&toTransform->externalMemoryProperties, 1);
    transform_fromhost_VkExternalMemoryProperties(resourceTracker, (VkExternalMemoryProperties*)(&toTransform->externalMemoryProperties));
}

void transform_tohost_VkPhysicalDeviceIDProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceIDProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceIDProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceIDProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkExternalMemoryImageCreateInfo(
    ResourceTracker* resourceTracker,
    VkExternalMemoryImageCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkExternalMemoryImageCreateInfo(
    ResourceTracker* resourceTracker,
    VkExternalMemoryImageCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkExternalMemoryBufferCreateInfo(
    ResourceTracker* resourceTracker,
    VkExternalMemoryBufferCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkExternalMemoryBufferCreateInfo(
    ResourceTracker* resourceTracker,
    VkExternalMemoryBufferCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkExportMemoryAllocateInfo(
    ResourceTracker* resourceTracker,
    VkExportMemoryAllocateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkExportMemoryAllocateInfo(
    ResourceTracker* resourceTracker,
    VkExportMemoryAllocateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceExternalFenceInfo(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceExternalFenceInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceExternalFenceInfo(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceExternalFenceInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkExternalFenceProperties(
    ResourceTracker* resourceTracker,
    VkExternalFenceProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkExternalFenceProperties(
    ResourceTracker* resourceTracker,
    VkExternalFenceProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkExportFenceCreateInfo(
    ResourceTracker* resourceTracker,
    VkExportFenceCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkExportFenceCreateInfo(
    ResourceTracker* resourceTracker,
    VkExportFenceCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkExportSemaphoreCreateInfo(
    ResourceTracker* resourceTracker,
    VkExportSemaphoreCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkExportSemaphoreCreateInfo(
    ResourceTracker* resourceTracker,
    VkExportSemaphoreCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceExternalSemaphoreInfo(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceExternalSemaphoreInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceExternalSemaphoreInfo(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceExternalSemaphoreInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkExternalSemaphoreProperties(
    ResourceTracker* resourceTracker,
    VkExternalSemaphoreProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkExternalSemaphoreProperties(
    ResourceTracker* resourceTracker,
    VkExternalSemaphoreProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceMaintenance3Properties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceMaintenance3Properties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceMaintenance3Properties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceMaintenance3Properties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDescriptorSetLayoutSupport(
    ResourceTracker* resourceTracker,
    VkDescriptorSetLayoutSupport* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDescriptorSetLayoutSupport(
    ResourceTracker* resourceTracker,
    VkDescriptorSetLayoutSupport* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceShaderDrawParametersFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderDrawParametersFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceShaderDrawParametersFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderDrawParametersFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_VERSION_1_2
void transform_tohost_VkPhysicalDeviceVulkan11Features(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceVulkan11Features* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceVulkan11Features(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceVulkan11Features* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceVulkan11Properties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceVulkan11Properties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceVulkan11Properties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceVulkan11Properties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceVulkan12Features(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceVulkan12Features* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceVulkan12Features(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceVulkan12Features* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkConformanceVersion(
    ResourceTracker* resourceTracker,
    VkConformanceVersion* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkConformanceVersion(
    ResourceTracker* resourceTracker,
    VkConformanceVersion* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkPhysicalDeviceVulkan12Properties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceVulkan12Properties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkConformanceVersion(resourceTracker, (VkConformanceVersion*)(&toTransform->conformanceVersion));
}

void transform_fromhost_VkPhysicalDeviceVulkan12Properties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceVulkan12Properties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkConformanceVersion(resourceTracker, (VkConformanceVersion*)(&toTransform->conformanceVersion));
}

void transform_tohost_VkImageFormatListCreateInfo(
    ResourceTracker* resourceTracker,
    VkImageFormatListCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkImageFormatListCreateInfo(
    ResourceTracker* resourceTracker,
    VkImageFormatListCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkAttachmentDescription2(
    ResourceTracker* resourceTracker,
    VkAttachmentDescription2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkAttachmentDescription2(
    ResourceTracker* resourceTracker,
    VkAttachmentDescription2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkAttachmentReference2(
    ResourceTracker* resourceTracker,
    VkAttachmentReference2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkAttachmentReference2(
    ResourceTracker* resourceTracker,
    VkAttachmentReference2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkSubpassDescription2(
    ResourceTracker* resourceTracker,
    VkSubpassDescription2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pInputAttachments)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->inputAttachmentCount; ++i)
            {
                transform_tohost_VkAttachmentReference2(resourceTracker, (VkAttachmentReference2*)(toTransform->pInputAttachments + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pColorAttachments)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i)
            {
                transform_tohost_VkAttachmentReference2(resourceTracker, (VkAttachmentReference2*)(toTransform->pColorAttachments + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pResolveAttachments)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i)
            {
                transform_tohost_VkAttachmentReference2(resourceTracker, (VkAttachmentReference2*)(toTransform->pResolveAttachments + i));
            }
        }
    }
    if (toTransform->pDepthStencilAttachment)
    {
        transform_tohost_VkAttachmentReference2(resourceTracker, (VkAttachmentReference2*)(toTransform->pDepthStencilAttachment));
    }
}

void transform_fromhost_VkSubpassDescription2(
    ResourceTracker* resourceTracker,
    VkSubpassDescription2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pInputAttachments)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->inputAttachmentCount; ++i)
            {
                transform_fromhost_VkAttachmentReference2(resourceTracker, (VkAttachmentReference2*)(toTransform->pInputAttachments + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pColorAttachments)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i)
            {
                transform_fromhost_VkAttachmentReference2(resourceTracker, (VkAttachmentReference2*)(toTransform->pColorAttachments + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pResolveAttachments)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i)
            {
                transform_fromhost_VkAttachmentReference2(resourceTracker, (VkAttachmentReference2*)(toTransform->pResolveAttachments + i));
            }
        }
    }
    if (toTransform->pDepthStencilAttachment)
    {
        transform_fromhost_VkAttachmentReference2(resourceTracker, (VkAttachmentReference2*)(toTransform->pDepthStencilAttachment));
    }
}

void transform_tohost_VkSubpassDependency2(
    ResourceTracker* resourceTracker,
    VkSubpassDependency2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkSubpassDependency2(
    ResourceTracker* resourceTracker,
    VkSubpassDependency2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkRenderPassCreateInfo2(
    ResourceTracker* resourceTracker,
    VkRenderPassCreateInfo2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pAttachments)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentCount; ++i)
            {
                transform_tohost_VkAttachmentDescription2(resourceTracker, (VkAttachmentDescription2*)(toTransform->pAttachments + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pSubpasses)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->subpassCount; ++i)
            {
                transform_tohost_VkSubpassDescription2(resourceTracker, (VkSubpassDescription2*)(toTransform->pSubpasses + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pDependencies)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->dependencyCount; ++i)
            {
                transform_tohost_VkSubpassDependency2(resourceTracker, (VkSubpassDependency2*)(toTransform->pDependencies + i));
            }
        }
    }
}

void transform_fromhost_VkRenderPassCreateInfo2(
    ResourceTracker* resourceTracker,
    VkRenderPassCreateInfo2* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pAttachments)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentCount; ++i)
            {
                transform_fromhost_VkAttachmentDescription2(resourceTracker, (VkAttachmentDescription2*)(toTransform->pAttachments + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pSubpasses)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->subpassCount; ++i)
            {
                transform_fromhost_VkSubpassDescription2(resourceTracker, (VkSubpassDescription2*)(toTransform->pSubpasses + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pDependencies)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->dependencyCount; ++i)
            {
                transform_fromhost_VkSubpassDependency2(resourceTracker, (VkSubpassDependency2*)(toTransform->pDependencies + i));
            }
        }
    }
}

void transform_tohost_VkSubpassBeginInfo(
    ResourceTracker* resourceTracker,
    VkSubpassBeginInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkSubpassBeginInfo(
    ResourceTracker* resourceTracker,
    VkSubpassBeginInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkSubpassEndInfo(
    ResourceTracker* resourceTracker,
    VkSubpassEndInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkSubpassEndInfo(
    ResourceTracker* resourceTracker,
    VkSubpassEndInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDevice8BitStorageFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDevice8BitStorageFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDevice8BitStorageFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDevice8BitStorageFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceDriverProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceDriverProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkConformanceVersion(resourceTracker, (VkConformanceVersion*)(&toTransform->conformanceVersion));
}

void transform_fromhost_VkPhysicalDeviceDriverProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceDriverProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkConformanceVersion(resourceTracker, (VkConformanceVersion*)(&toTransform->conformanceVersion));
}

void transform_tohost_VkPhysicalDeviceShaderAtomicInt64Features(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderAtomicInt64Features* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceShaderAtomicInt64Features(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderAtomicInt64Features* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceShaderFloat16Int8Features(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderFloat16Int8Features* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceShaderFloat16Int8Features(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderFloat16Int8Features* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceFloatControlsProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFloatControlsProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceFloatControlsProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFloatControlsProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDescriptorSetLayoutBindingFlagsCreateInfo(
    ResourceTracker* resourceTracker,
    VkDescriptorSetLayoutBindingFlagsCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDescriptorSetLayoutBindingFlagsCreateInfo(
    ResourceTracker* resourceTracker,
    VkDescriptorSetLayoutBindingFlagsCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceDescriptorIndexingFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceDescriptorIndexingFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceDescriptorIndexingFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceDescriptorIndexingFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceDescriptorIndexingProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceDescriptorIndexingProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceDescriptorIndexingProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceDescriptorIndexingProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDescriptorSetVariableDescriptorCountAllocateInfo(
    ResourceTracker* resourceTracker,
    VkDescriptorSetVariableDescriptorCountAllocateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDescriptorSetVariableDescriptorCountAllocateInfo(
    ResourceTracker* resourceTracker,
    VkDescriptorSetVariableDescriptorCountAllocateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDescriptorSetVariableDescriptorCountLayoutSupport(
    ResourceTracker* resourceTracker,
    VkDescriptorSetVariableDescriptorCountLayoutSupport* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDescriptorSetVariableDescriptorCountLayoutSupport(
    ResourceTracker* resourceTracker,
    VkDescriptorSetVariableDescriptorCountLayoutSupport* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkSubpassDescriptionDepthStencilResolve(
    ResourceTracker* resourceTracker,
    VkSubpassDescriptionDepthStencilResolve* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform->pDepthStencilResolveAttachment)
    {
        transform_tohost_VkAttachmentReference2(resourceTracker, (VkAttachmentReference2*)(toTransform->pDepthStencilResolveAttachment));
    }
}

void transform_fromhost_VkSubpassDescriptionDepthStencilResolve(
    ResourceTracker* resourceTracker,
    VkSubpassDescriptionDepthStencilResolve* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform->pDepthStencilResolveAttachment)
    {
        transform_fromhost_VkAttachmentReference2(resourceTracker, (VkAttachmentReference2*)(toTransform->pDepthStencilResolveAttachment));
    }
}

void transform_tohost_VkPhysicalDeviceDepthStencilResolveProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceDepthStencilResolveProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceDepthStencilResolveProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceDepthStencilResolveProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceScalarBlockLayoutFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceScalarBlockLayoutFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceScalarBlockLayoutFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceScalarBlockLayoutFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkImageStencilUsageCreateInfo(
    ResourceTracker* resourceTracker,
    VkImageStencilUsageCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkImageStencilUsageCreateInfo(
    ResourceTracker* resourceTracker,
    VkImageStencilUsageCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkSamplerReductionModeCreateInfo(
    ResourceTracker* resourceTracker,
    VkSamplerReductionModeCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkSamplerReductionModeCreateInfo(
    ResourceTracker* resourceTracker,
    VkSamplerReductionModeCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceSamplerFilterMinmaxProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceSamplerFilterMinmaxProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceSamplerFilterMinmaxProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceSamplerFilterMinmaxProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceVulkanMemoryModelFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceVulkanMemoryModelFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceVulkanMemoryModelFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceVulkanMemoryModelFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceImagelessFramebufferFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceImagelessFramebufferFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceImagelessFramebufferFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceImagelessFramebufferFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkFramebufferAttachmentImageInfo(
    ResourceTracker* resourceTracker,
    VkFramebufferAttachmentImageInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkFramebufferAttachmentImageInfo(
    ResourceTracker* resourceTracker,
    VkFramebufferAttachmentImageInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkFramebufferAttachmentsCreateInfo(
    ResourceTracker* resourceTracker,
    VkFramebufferAttachmentsCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pAttachmentImageInfos)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentImageInfoCount; ++i)
            {
                transform_tohost_VkFramebufferAttachmentImageInfo(resourceTracker, (VkFramebufferAttachmentImageInfo*)(toTransform->pAttachmentImageInfos + i));
            }
        }
    }
}

void transform_fromhost_VkFramebufferAttachmentsCreateInfo(
    ResourceTracker* resourceTracker,
    VkFramebufferAttachmentsCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pAttachmentImageInfos)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentImageInfoCount; ++i)
            {
                transform_fromhost_VkFramebufferAttachmentImageInfo(resourceTracker, (VkFramebufferAttachmentImageInfo*)(toTransform->pAttachmentImageInfos + i));
            }
        }
    }
}

void transform_tohost_VkRenderPassAttachmentBeginInfo(
    ResourceTracker* resourceTracker,
    VkRenderPassAttachmentBeginInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkRenderPassAttachmentBeginInfo(
    ResourceTracker* resourceTracker,
    VkRenderPassAttachmentBeginInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceUniformBufferStandardLayoutFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceUniformBufferStandardLayoutFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkAttachmentReferenceStencilLayout(
    ResourceTracker* resourceTracker,
    VkAttachmentReferenceStencilLayout* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkAttachmentReferenceStencilLayout(
    ResourceTracker* resourceTracker,
    VkAttachmentReferenceStencilLayout* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkAttachmentDescriptionStencilLayout(
    ResourceTracker* resourceTracker,
    VkAttachmentDescriptionStencilLayout* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkAttachmentDescriptionStencilLayout(
    ResourceTracker* resourceTracker,
    VkAttachmentDescriptionStencilLayout* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceHostQueryResetFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceHostQueryResetFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceHostQueryResetFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceHostQueryResetFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceTimelineSemaphoreFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceTimelineSemaphoreFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceTimelineSemaphoreFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceTimelineSemaphoreFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceTimelineSemaphoreProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceTimelineSemaphoreProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceTimelineSemaphoreProperties(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceTimelineSemaphoreProperties* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkSemaphoreTypeCreateInfo(
    ResourceTracker* resourceTracker,
    VkSemaphoreTypeCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkSemaphoreTypeCreateInfo(
    ResourceTracker* resourceTracker,
    VkSemaphoreTypeCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkTimelineSemaphoreSubmitInfo(
    ResourceTracker* resourceTracker,
    VkTimelineSemaphoreSubmitInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkTimelineSemaphoreSubmitInfo(
    ResourceTracker* resourceTracker,
    VkTimelineSemaphoreSubmitInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkSemaphoreWaitInfo(
    ResourceTracker* resourceTracker,
    VkSemaphoreWaitInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkSemaphoreWaitInfo(
    ResourceTracker* resourceTracker,
    VkSemaphoreWaitInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkSemaphoreSignalInfo(
    ResourceTracker* resourceTracker,
    VkSemaphoreSignalInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkSemaphoreSignalInfo(
    ResourceTracker* resourceTracker,
    VkSemaphoreSignalInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceBufferDeviceAddressFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceBufferDeviceAddressFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceBufferDeviceAddressFeatures(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceBufferDeviceAddressFeatures* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkBufferDeviceAddressInfo(
    ResourceTracker* resourceTracker,
    VkBufferDeviceAddressInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkBufferDeviceAddressInfo(
    ResourceTracker* resourceTracker,
    VkBufferDeviceAddressInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkBufferOpaqueCaptureAddressCreateInfo(
    ResourceTracker* resourceTracker,
    VkBufferOpaqueCaptureAddressCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkBufferOpaqueCaptureAddressCreateInfo(
    ResourceTracker* resourceTracker,
    VkBufferOpaqueCaptureAddressCreateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkMemoryOpaqueCaptureAddressAllocateInfo(
    ResourceTracker* resourceTracker,
    VkMemoryOpaqueCaptureAddressAllocateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkMemoryOpaqueCaptureAddressAllocateInfo(
    ResourceTracker* resourceTracker,
    VkMemoryOpaqueCaptureAddressAllocateInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDeviceMemoryOpaqueCaptureAddressInfo(
    ResourceTracker* resourceTracker,
    VkDeviceMemoryOpaqueCaptureAddressInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDeviceMemoryOpaqueCaptureAddressInfo(
    ResourceTracker* resourceTracker,
    VkDeviceMemoryOpaqueCaptureAddressInfo* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_KHR_surface
void transform_tohost_VkSurfaceCapabilitiesKHR(
    ResourceTracker* resourceTracker,
    VkSurfaceCapabilitiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->currentExtent));
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->minImageExtent));
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxImageExtent));
}

void transform_fromhost_VkSurfaceCapabilitiesKHR(
    ResourceTracker* resourceTracker,
    VkSurfaceCapabilitiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->currentExtent));
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->minImageExtent));
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxImageExtent));
}

void transform_tohost_VkSurfaceFormatKHR(
    ResourceTracker* resourceTracker,
    VkSurfaceFormatKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkSurfaceFormatKHR(
    ResourceTracker* resourceTracker,
    VkSurfaceFormatKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

#endif
#ifdef VK_KHR_swapchain
void transform_tohost_VkSwapchainCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkSwapchainCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->imageExtent));
}

void transform_fromhost_VkSwapchainCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkSwapchainCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->imageExtent));
}

void transform_tohost_VkPresentInfoKHR(
    ResourceTracker* resourceTracker,
    VkPresentInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPresentInfoKHR(
    ResourceTracker* resourceTracker,
    VkPresentInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkImageSwapchainCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkImageSwapchainCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkImageSwapchainCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkImageSwapchainCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkBindImageMemorySwapchainInfoKHR(
    ResourceTracker* resourceTracker,
    VkBindImageMemorySwapchainInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkBindImageMemorySwapchainInfoKHR(
    ResourceTracker* resourceTracker,
    VkBindImageMemorySwapchainInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkAcquireNextImageInfoKHR(
    ResourceTracker* resourceTracker,
    VkAcquireNextImageInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkAcquireNextImageInfoKHR(
    ResourceTracker* resourceTracker,
    VkAcquireNextImageInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDeviceGroupPresentCapabilitiesKHR(
    ResourceTracker* resourceTracker,
    VkDeviceGroupPresentCapabilitiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDeviceGroupPresentCapabilitiesKHR(
    ResourceTracker* resourceTracker,
    VkDeviceGroupPresentCapabilitiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDeviceGroupPresentInfoKHR(
    ResourceTracker* resourceTracker,
    VkDeviceGroupPresentInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDeviceGroupPresentInfoKHR(
    ResourceTracker* resourceTracker,
    VkDeviceGroupPresentInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDeviceGroupSwapchainCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkDeviceGroupSwapchainCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDeviceGroupSwapchainCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkDeviceGroupSwapchainCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_KHR_display
void transform_tohost_VkDisplayModeParametersKHR(
    ResourceTracker* resourceTracker,
    VkDisplayModeParametersKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->visibleRegion));
}

void transform_fromhost_VkDisplayModeParametersKHR(
    ResourceTracker* resourceTracker,
    VkDisplayModeParametersKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->visibleRegion));
}

void transform_tohost_VkDisplayModeCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkDisplayModeCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkDisplayModeParametersKHR(resourceTracker, (VkDisplayModeParametersKHR*)(&toTransform->parameters));
}

void transform_fromhost_VkDisplayModeCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkDisplayModeCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkDisplayModeParametersKHR(resourceTracker, (VkDisplayModeParametersKHR*)(&toTransform->parameters));
}

void transform_tohost_VkDisplayModePropertiesKHR(
    ResourceTracker* resourceTracker,
    VkDisplayModePropertiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkDisplayModeParametersKHR(resourceTracker, (VkDisplayModeParametersKHR*)(&toTransform->parameters));
}

void transform_fromhost_VkDisplayModePropertiesKHR(
    ResourceTracker* resourceTracker,
    VkDisplayModePropertiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkDisplayModeParametersKHR(resourceTracker, (VkDisplayModeParametersKHR*)(&toTransform->parameters));
}

void transform_tohost_VkDisplayPlaneCapabilitiesKHR(
    ResourceTracker* resourceTracker,
    VkDisplayPlaneCapabilitiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkOffset2D(resourceTracker, (VkOffset2D*)(&toTransform->minSrcPosition));
    transform_tohost_VkOffset2D(resourceTracker, (VkOffset2D*)(&toTransform->maxSrcPosition));
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->minSrcExtent));
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxSrcExtent));
    transform_tohost_VkOffset2D(resourceTracker, (VkOffset2D*)(&toTransform->minDstPosition));
    transform_tohost_VkOffset2D(resourceTracker, (VkOffset2D*)(&toTransform->maxDstPosition));
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->minDstExtent));
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxDstExtent));
}

void transform_fromhost_VkDisplayPlaneCapabilitiesKHR(
    ResourceTracker* resourceTracker,
    VkDisplayPlaneCapabilitiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkOffset2D(resourceTracker, (VkOffset2D*)(&toTransform->minSrcPosition));
    transform_fromhost_VkOffset2D(resourceTracker, (VkOffset2D*)(&toTransform->maxSrcPosition));
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->minSrcExtent));
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxSrcExtent));
    transform_fromhost_VkOffset2D(resourceTracker, (VkOffset2D*)(&toTransform->minDstPosition));
    transform_fromhost_VkOffset2D(resourceTracker, (VkOffset2D*)(&toTransform->maxDstPosition));
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->minDstExtent));
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxDstExtent));
}

void transform_tohost_VkDisplayPlanePropertiesKHR(
    ResourceTracker* resourceTracker,
    VkDisplayPlanePropertiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkDisplayPlanePropertiesKHR(
    ResourceTracker* resourceTracker,
    VkDisplayPlanePropertiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkDisplayPropertiesKHR(
    ResourceTracker* resourceTracker,
    VkDisplayPropertiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->physicalDimensions));
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->physicalResolution));
}

void transform_fromhost_VkDisplayPropertiesKHR(
    ResourceTracker* resourceTracker,
    VkDisplayPropertiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->physicalDimensions));
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->physicalResolution));
}

void transform_tohost_VkDisplaySurfaceCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkDisplaySurfaceCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->imageExtent));
}

void transform_fromhost_VkDisplaySurfaceCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkDisplaySurfaceCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->imageExtent));
}

#endif
#ifdef VK_KHR_display_swapchain
void transform_tohost_VkDisplayPresentInfoKHR(
    ResourceTracker* resourceTracker,
    VkDisplayPresentInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkRect2D(resourceTracker, (VkRect2D*)(&toTransform->srcRect));
    transform_tohost_VkRect2D(resourceTracker, (VkRect2D*)(&toTransform->dstRect));
}

void transform_fromhost_VkDisplayPresentInfoKHR(
    ResourceTracker* resourceTracker,
    VkDisplayPresentInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkRect2D(resourceTracker, (VkRect2D*)(&toTransform->srcRect));
    transform_fromhost_VkRect2D(resourceTracker, (VkRect2D*)(&toTransform->dstRect));
}

#endif
#ifdef VK_KHR_xlib_surface
void transform_tohost_VkXlibSurfaceCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkXlibSurfaceCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkXlibSurfaceCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkXlibSurfaceCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_KHR_xcb_surface
void transform_tohost_VkXcbSurfaceCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkXcbSurfaceCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkXcbSurfaceCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkXcbSurfaceCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_KHR_wayland_surface
void transform_tohost_VkWaylandSurfaceCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkWaylandSurfaceCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkWaylandSurfaceCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkWaylandSurfaceCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_KHR_android_surface
void transform_tohost_VkAndroidSurfaceCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkAndroidSurfaceCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkAndroidSurfaceCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkAndroidSurfaceCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_KHR_win32_surface
void transform_tohost_VkWin32SurfaceCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkWin32SurfaceCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkWin32SurfaceCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkWin32SurfaceCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_KHR_sampler_mirror_clamp_to_edge
#endif
#ifdef VK_KHR_multiview
#endif
#ifdef VK_KHR_get_physical_device_properties2
#endif
#ifdef VK_KHR_device_group
#endif
#ifdef VK_KHR_shader_draw_parameters
#endif
#ifdef VK_KHR_maintenance1
#endif
#ifdef VK_KHR_device_group_creation
#endif
#ifdef VK_KHR_external_memory_capabilities
#endif
#ifdef VK_KHR_external_memory
#endif
#ifdef VK_KHR_external_memory_win32
void transform_tohost_VkImportMemoryWin32HandleInfoKHR(
    ResourceTracker* resourceTracker,
    VkImportMemoryWin32HandleInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkImportMemoryWin32HandleInfoKHR(
    ResourceTracker* resourceTracker,
    VkImportMemoryWin32HandleInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkExportMemoryWin32HandleInfoKHR(
    ResourceTracker* resourceTracker,
    VkExportMemoryWin32HandleInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkExportMemoryWin32HandleInfoKHR(
    ResourceTracker* resourceTracker,
    VkExportMemoryWin32HandleInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkMemoryWin32HandlePropertiesKHR(
    ResourceTracker* resourceTracker,
    VkMemoryWin32HandlePropertiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkMemoryWin32HandlePropertiesKHR(
    ResourceTracker* resourceTracker,
    VkMemoryWin32HandlePropertiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkMemoryGetWin32HandleInfoKHR(
    ResourceTracker* resourceTracker,
    VkMemoryGetWin32HandleInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkMemoryGetWin32HandleInfoKHR(
    ResourceTracker* resourceTracker,
    VkMemoryGetWin32HandleInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_KHR_external_memory_fd
void transform_tohost_VkImportMemoryFdInfoKHR(
    ResourceTracker* resourceTracker,
    VkImportMemoryFdInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkImportMemoryFdInfoKHR(
    ResourceTracker* resourceTracker,
    VkImportMemoryFdInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkMemoryFdPropertiesKHR(
    ResourceTracker* resourceTracker,
    VkMemoryFdPropertiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkMemoryFdPropertiesKHR(
    ResourceTracker* resourceTracker,
    VkMemoryFdPropertiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkMemoryGetFdInfoKHR(
    ResourceTracker* resourceTracker,
    VkMemoryGetFdInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkMemoryGetFdInfoKHR(
    ResourceTracker* resourceTracker,
    VkMemoryGetFdInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_KHR_win32_keyed_mutex
void transform_tohost_VkWin32KeyedMutexAcquireReleaseInfoKHR(
    ResourceTracker* resourceTracker,
    VkWin32KeyedMutexAcquireReleaseInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)toTransform->pReleaseSyncs, toTransform->releaseCount, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkWin32KeyedMutexAcquireReleaseInfoKHR(
    ResourceTracker* resourceTracker,
    VkWin32KeyedMutexAcquireReleaseInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)toTransform->pReleaseSyncs, toTransform->releaseCount, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_KHR_external_semaphore_capabilities
#endif
#ifdef VK_KHR_external_semaphore
#endif
#ifdef VK_KHR_external_semaphore_win32
void transform_tohost_VkImportSemaphoreWin32HandleInfoKHR(
    ResourceTracker* resourceTracker,
    VkImportSemaphoreWin32HandleInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkImportSemaphoreWin32HandleInfoKHR(
    ResourceTracker* resourceTracker,
    VkImportSemaphoreWin32HandleInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkExportSemaphoreWin32HandleInfoKHR(
    ResourceTracker* resourceTracker,
    VkExportSemaphoreWin32HandleInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkExportSemaphoreWin32HandleInfoKHR(
    ResourceTracker* resourceTracker,
    VkExportSemaphoreWin32HandleInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkD3D12FenceSubmitInfoKHR(
    ResourceTracker* resourceTracker,
    VkD3D12FenceSubmitInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkD3D12FenceSubmitInfoKHR(
    ResourceTracker* resourceTracker,
    VkD3D12FenceSubmitInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkSemaphoreGetWin32HandleInfoKHR(
    ResourceTracker* resourceTracker,
    VkSemaphoreGetWin32HandleInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkSemaphoreGetWin32HandleInfoKHR(
    ResourceTracker* resourceTracker,
    VkSemaphoreGetWin32HandleInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_KHR_external_semaphore_fd
void transform_tohost_VkImportSemaphoreFdInfoKHR(
    ResourceTracker* resourceTracker,
    VkImportSemaphoreFdInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkImportSemaphoreFdInfoKHR(
    ResourceTracker* resourceTracker,
    VkImportSemaphoreFdInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkSemaphoreGetFdInfoKHR(
    ResourceTracker* resourceTracker,
    VkSemaphoreGetFdInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkSemaphoreGetFdInfoKHR(
    ResourceTracker* resourceTracker,
    VkSemaphoreGetFdInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_KHR_push_descriptor
void transform_tohost_VkPhysicalDevicePushDescriptorPropertiesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDevicePushDescriptorPropertiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDevicePushDescriptorPropertiesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDevicePushDescriptorPropertiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_KHR_shader_float16_int8
#endif
#ifdef VK_KHR_16bit_storage
#endif
#ifdef VK_KHR_incremental_present
void transform_tohost_VkRectLayerKHR(
    ResourceTracker* resourceTracker,
    VkRectLayerKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkOffset2D(resourceTracker, (VkOffset2D*)(&toTransform->offset));
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->extent));
}

void transform_fromhost_VkRectLayerKHR(
    ResourceTracker* resourceTracker,
    VkRectLayerKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkOffset2D(resourceTracker, (VkOffset2D*)(&toTransform->offset));
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->extent));
}

void transform_tohost_VkPresentRegionKHR(
    ResourceTracker* resourceTracker,
    VkPresentRegionKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform)
    {
        if (toTransform->pRectangles)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->rectangleCount; ++i)
            {
                transform_tohost_VkRectLayerKHR(resourceTracker, (VkRectLayerKHR*)(toTransform->pRectangles + i));
            }
        }
    }
}

void transform_fromhost_VkPresentRegionKHR(
    ResourceTracker* resourceTracker,
    VkPresentRegionKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform)
    {
        if (toTransform->pRectangles)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->rectangleCount; ++i)
            {
                transform_fromhost_VkRectLayerKHR(resourceTracker, (VkRectLayerKHR*)(toTransform->pRectangles + i));
            }
        }
    }
}

void transform_tohost_VkPresentRegionsKHR(
    ResourceTracker* resourceTracker,
    VkPresentRegionsKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pRegions)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->swapchainCount; ++i)
            {
                transform_tohost_VkPresentRegionKHR(resourceTracker, (VkPresentRegionKHR*)(toTransform->pRegions + i));
            }
        }
    }
}

void transform_fromhost_VkPresentRegionsKHR(
    ResourceTracker* resourceTracker,
    VkPresentRegionsKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pRegions)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->swapchainCount; ++i)
            {
                transform_fromhost_VkPresentRegionKHR(resourceTracker, (VkPresentRegionKHR*)(toTransform->pRegions + i));
            }
        }
    }
}

#endif
#ifdef VK_KHR_descriptor_update_template
#endif
#ifdef VK_KHR_imageless_framebuffer
#endif
#ifdef VK_KHR_create_renderpass2
#endif
#ifdef VK_KHR_shared_presentable_image
void transform_tohost_VkSharedPresentSurfaceCapabilitiesKHR(
    ResourceTracker* resourceTracker,
    VkSharedPresentSurfaceCapabilitiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkSharedPresentSurfaceCapabilitiesKHR(
    ResourceTracker* resourceTracker,
    VkSharedPresentSurfaceCapabilitiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_KHR_external_fence_capabilities
#endif
#ifdef VK_KHR_external_fence
#endif
#ifdef VK_KHR_external_fence_win32
void transform_tohost_VkImportFenceWin32HandleInfoKHR(
    ResourceTracker* resourceTracker,
    VkImportFenceWin32HandleInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkImportFenceWin32HandleInfoKHR(
    ResourceTracker* resourceTracker,
    VkImportFenceWin32HandleInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkExportFenceWin32HandleInfoKHR(
    ResourceTracker* resourceTracker,
    VkExportFenceWin32HandleInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkExportFenceWin32HandleInfoKHR(
    ResourceTracker* resourceTracker,
    VkExportFenceWin32HandleInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkFenceGetWin32HandleInfoKHR(
    ResourceTracker* resourceTracker,
    VkFenceGetWin32HandleInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkFenceGetWin32HandleInfoKHR(
    ResourceTracker* resourceTracker,
    VkFenceGetWin32HandleInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_KHR_external_fence_fd
void transform_tohost_VkImportFenceFdInfoKHR(
    ResourceTracker* resourceTracker,
    VkImportFenceFdInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkImportFenceFdInfoKHR(
    ResourceTracker* resourceTracker,
    VkImportFenceFdInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkFenceGetFdInfoKHR(
    ResourceTracker* resourceTracker,
    VkFenceGetFdInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkFenceGetFdInfoKHR(
    ResourceTracker* resourceTracker,
    VkFenceGetFdInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_KHR_performance_query
void transform_tohost_VkPhysicalDevicePerformanceQueryFeaturesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDevicePerformanceQueryFeaturesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDevicePerformanceQueryFeaturesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDevicePerformanceQueryFeaturesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDevicePerformanceQueryPropertiesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDevicePerformanceQueryPropertiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDevicePerformanceQueryPropertiesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDevicePerformanceQueryPropertiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPerformanceCounterKHR(
    ResourceTracker* resourceTracker,
    VkPerformanceCounterKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPerformanceCounterKHR(
    ResourceTracker* resourceTracker,
    VkPerformanceCounterKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPerformanceCounterDescriptionKHR(
    ResourceTracker* resourceTracker,
    VkPerformanceCounterDescriptionKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPerformanceCounterDescriptionKHR(
    ResourceTracker* resourceTracker,
    VkPerformanceCounterDescriptionKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkQueryPoolPerformanceCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkQueryPoolPerformanceCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkQueryPoolPerformanceCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkQueryPoolPerformanceCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPerformanceCounterResultKHR(
    ResourceTracker* resourceTracker,
    VkPerformanceCounterResultKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkPerformanceCounterResultKHR(
    ResourceTracker* resourceTracker,
    VkPerformanceCounterResultKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkAcquireProfilingLockInfoKHR(
    ResourceTracker* resourceTracker,
    VkAcquireProfilingLockInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkAcquireProfilingLockInfoKHR(
    ResourceTracker* resourceTracker,
    VkAcquireProfilingLockInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPerformanceQuerySubmitInfoKHR(
    ResourceTracker* resourceTracker,
    VkPerformanceQuerySubmitInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPerformanceQuerySubmitInfoKHR(
    ResourceTracker* resourceTracker,
    VkPerformanceQuerySubmitInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_KHR_maintenance2
#endif
#ifdef VK_KHR_get_surface_capabilities2
void transform_tohost_VkPhysicalDeviceSurfaceInfo2KHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceSurfaceInfo2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceSurfaceInfo2KHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceSurfaceInfo2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkSurfaceCapabilities2KHR(
    ResourceTracker* resourceTracker,
    VkSurfaceCapabilities2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkSurfaceCapabilitiesKHR(resourceTracker, (VkSurfaceCapabilitiesKHR*)(&toTransform->surfaceCapabilities));
}

void transform_fromhost_VkSurfaceCapabilities2KHR(
    ResourceTracker* resourceTracker,
    VkSurfaceCapabilities2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkSurfaceCapabilitiesKHR(resourceTracker, (VkSurfaceCapabilitiesKHR*)(&toTransform->surfaceCapabilities));
}

void transform_tohost_VkSurfaceFormat2KHR(
    ResourceTracker* resourceTracker,
    VkSurfaceFormat2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkSurfaceFormatKHR(resourceTracker, (VkSurfaceFormatKHR*)(&toTransform->surfaceFormat));
}

void transform_fromhost_VkSurfaceFormat2KHR(
    ResourceTracker* resourceTracker,
    VkSurfaceFormat2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkSurfaceFormatKHR(resourceTracker, (VkSurfaceFormatKHR*)(&toTransform->surfaceFormat));
}

#endif
#ifdef VK_KHR_variable_pointers
#endif
#ifdef VK_KHR_get_display_properties2
void transform_tohost_VkDisplayProperties2KHR(
    ResourceTracker* resourceTracker,
    VkDisplayProperties2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkDisplayPropertiesKHR(resourceTracker, (VkDisplayPropertiesKHR*)(&toTransform->displayProperties));
}

void transform_fromhost_VkDisplayProperties2KHR(
    ResourceTracker* resourceTracker,
    VkDisplayProperties2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkDisplayPropertiesKHR(resourceTracker, (VkDisplayPropertiesKHR*)(&toTransform->displayProperties));
}

void transform_tohost_VkDisplayPlaneProperties2KHR(
    ResourceTracker* resourceTracker,
    VkDisplayPlaneProperties2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkDisplayPlanePropertiesKHR(resourceTracker, (VkDisplayPlanePropertiesKHR*)(&toTransform->displayPlaneProperties));
}

void transform_fromhost_VkDisplayPlaneProperties2KHR(
    ResourceTracker* resourceTracker,
    VkDisplayPlaneProperties2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkDisplayPlanePropertiesKHR(resourceTracker, (VkDisplayPlanePropertiesKHR*)(&toTransform->displayPlaneProperties));
}

void transform_tohost_VkDisplayModeProperties2KHR(
    ResourceTracker* resourceTracker,
    VkDisplayModeProperties2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkDisplayModePropertiesKHR(resourceTracker, (VkDisplayModePropertiesKHR*)(&toTransform->displayModeProperties));
}

void transform_fromhost_VkDisplayModeProperties2KHR(
    ResourceTracker* resourceTracker,
    VkDisplayModeProperties2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkDisplayModePropertiesKHR(resourceTracker, (VkDisplayModePropertiesKHR*)(&toTransform->displayModeProperties));
}

void transform_tohost_VkDisplayPlaneInfo2KHR(
    ResourceTracker* resourceTracker,
    VkDisplayPlaneInfo2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDisplayPlaneInfo2KHR(
    ResourceTracker* resourceTracker,
    VkDisplayPlaneInfo2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDisplayPlaneCapabilities2KHR(
    ResourceTracker* resourceTracker,
    VkDisplayPlaneCapabilities2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkDisplayPlaneCapabilitiesKHR(resourceTracker, (VkDisplayPlaneCapabilitiesKHR*)(&toTransform->capabilities));
}

void transform_fromhost_VkDisplayPlaneCapabilities2KHR(
    ResourceTracker* resourceTracker,
    VkDisplayPlaneCapabilities2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkDisplayPlaneCapabilitiesKHR(resourceTracker, (VkDisplayPlaneCapabilitiesKHR*)(&toTransform->capabilities));
}

#endif
#ifdef VK_KHR_dedicated_allocation
#endif
#ifdef VK_KHR_storage_buffer_storage_class
#endif
#ifdef VK_KHR_relaxed_block_layout
#endif
#ifdef VK_KHR_get_memory_requirements2
#endif
#ifdef VK_KHR_image_format_list
#endif
#ifdef VK_KHR_sampler_ycbcr_conversion
#endif
#ifdef VK_KHR_bind_memory2
#endif
#ifdef VK_KHR_portability_subset
void transform_tohost_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDevicePortabilitySubsetFeaturesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDevicePortabilitySubsetFeaturesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDevicePortabilitySubsetPropertiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDevicePortabilitySubsetPropertiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_KHR_maintenance3
#endif
#ifdef VK_KHR_draw_indirect_count
#endif
#ifdef VK_KHR_shader_subgroup_extended_types
#endif
#ifdef VK_KHR_8bit_storage
#endif
#ifdef VK_KHR_shader_atomic_int64
#endif
#ifdef VK_KHR_shader_clock
void transform_tohost_VkPhysicalDeviceShaderClockFeaturesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderClockFeaturesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceShaderClockFeaturesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderClockFeaturesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_KHR_driver_properties
#endif
#ifdef VK_KHR_shader_float_controls
#endif
#ifdef VK_KHR_depth_stencil_resolve
#endif
#ifdef VK_KHR_swapchain_mutable_format
#endif
#ifdef VK_KHR_timeline_semaphore
#endif
#ifdef VK_KHR_vulkan_memory_model
#endif
#ifdef VK_KHR_shader_terminate_invocation
void transform_tohost_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_KHR_fragment_shading_rate
void transform_tohost_VkFragmentShadingRateAttachmentInfoKHR(
    ResourceTracker* resourceTracker,
    VkFragmentShadingRateAttachmentInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform->pFragmentShadingRateAttachment)
    {
        transform_tohost_VkAttachmentReference2(resourceTracker, (VkAttachmentReference2*)(toTransform->pFragmentShadingRateAttachment));
    }
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->shadingRateAttachmentTexelSize));
}

void transform_fromhost_VkFragmentShadingRateAttachmentInfoKHR(
    ResourceTracker* resourceTracker,
    VkFragmentShadingRateAttachmentInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform->pFragmentShadingRateAttachment)
    {
        transform_fromhost_VkAttachmentReference2(resourceTracker, (VkAttachmentReference2*)(toTransform->pFragmentShadingRateAttachment));
    }
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->shadingRateAttachmentTexelSize));
}

void transform_tohost_VkPipelineFragmentShadingRateStateCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkPipelineFragmentShadingRateStateCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->fragmentSize));
}

void transform_fromhost_VkPipelineFragmentShadingRateStateCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkPipelineFragmentShadingRateStateCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->fragmentSize));
}

void transform_tohost_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFragmentShadingRateFeaturesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFragmentShadingRateFeaturesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFragmentShadingRatePropertiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->minFragmentShadingRateAttachmentTexelSize));
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxFragmentShadingRateAttachmentTexelSize));
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxFragmentSize));
}

void transform_fromhost_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFragmentShadingRatePropertiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->minFragmentShadingRateAttachmentTexelSize));
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxFragmentShadingRateAttachmentTexelSize));
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxFragmentSize));
}

void transform_tohost_VkPhysicalDeviceFragmentShadingRateKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFragmentShadingRateKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->fragmentSize));
}

void transform_fromhost_VkPhysicalDeviceFragmentShadingRateKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFragmentShadingRateKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->fragmentSize));
}

#endif
#ifdef VK_KHR_spirv_1_4
#endif
#ifdef VK_KHR_surface_protected_capabilities
void transform_tohost_VkSurfaceProtectedCapabilitiesKHR(
    ResourceTracker* resourceTracker,
    VkSurfaceProtectedCapabilitiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkSurfaceProtectedCapabilitiesKHR(
    ResourceTracker* resourceTracker,
    VkSurfaceProtectedCapabilitiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_KHR_separate_depth_stencil_layouts
#endif
#ifdef VK_KHR_uniform_buffer_standard_layout
#endif
#ifdef VK_KHR_buffer_device_address
#endif
#ifdef VK_KHR_deferred_host_operations
#endif
#ifdef VK_KHR_pipeline_executable_properties
void transform_tohost_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPipelineInfoKHR(
    ResourceTracker* resourceTracker,
    VkPipelineInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPipelineInfoKHR(
    ResourceTracker* resourceTracker,
    VkPipelineInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPipelineExecutablePropertiesKHR(
    ResourceTracker* resourceTracker,
    VkPipelineExecutablePropertiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPipelineExecutablePropertiesKHR(
    ResourceTracker* resourceTracker,
    VkPipelineExecutablePropertiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPipelineExecutableInfoKHR(
    ResourceTracker* resourceTracker,
    VkPipelineExecutableInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPipelineExecutableInfoKHR(
    ResourceTracker* resourceTracker,
    VkPipelineExecutableInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPipelineExecutableStatisticValueKHR(
    ResourceTracker* resourceTracker,
    VkPipelineExecutableStatisticValueKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkPipelineExecutableStatisticValueKHR(
    ResourceTracker* resourceTracker,
    VkPipelineExecutableStatisticValueKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkPipelineExecutableStatisticKHR(
    ResourceTracker* resourceTracker,
    VkPipelineExecutableStatisticKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkPipelineExecutableStatisticValueKHR(resourceTracker, (VkPipelineExecutableStatisticValueKHR*)(&toTransform->value));
}

void transform_fromhost_VkPipelineExecutableStatisticKHR(
    ResourceTracker* resourceTracker,
    VkPipelineExecutableStatisticKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkPipelineExecutableStatisticValueKHR(resourceTracker, (VkPipelineExecutableStatisticValueKHR*)(&toTransform->value));
}

void transform_tohost_VkPipelineExecutableInternalRepresentationKHR(
    ResourceTracker* resourceTracker,
    VkPipelineExecutableInternalRepresentationKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPipelineExecutableInternalRepresentationKHR(
    ResourceTracker* resourceTracker,
    VkPipelineExecutableInternalRepresentationKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_KHR_pipeline_library
void transform_tohost_VkPipelineLibraryCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkPipelineLibraryCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPipelineLibraryCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkPipelineLibraryCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_KHR_shader_non_semantic_info
#endif
#ifdef VK_KHR_copy_commands2
void transform_tohost_VkBufferCopy2KHR(
    ResourceTracker* resourceTracker,
    VkBufferCopy2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkBufferCopy2KHR(
    ResourceTracker* resourceTracker,
    VkBufferCopy2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkCopyBufferInfo2KHR(
    ResourceTracker* resourceTracker,
    VkCopyBufferInfo2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pRegions)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i)
            {
                transform_tohost_VkBufferCopy2KHR(resourceTracker, (VkBufferCopy2KHR*)(toTransform->pRegions + i));
            }
        }
    }
}

void transform_fromhost_VkCopyBufferInfo2KHR(
    ResourceTracker* resourceTracker,
    VkCopyBufferInfo2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pRegions)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i)
            {
                transform_fromhost_VkBufferCopy2KHR(resourceTracker, (VkBufferCopy2KHR*)(toTransform->pRegions + i));
            }
        }
    }
}

void transform_tohost_VkImageCopy2KHR(
    ResourceTracker* resourceTracker,
    VkImageCopy2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
    transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->srcOffset));
    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
    transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->dstOffset));
    transform_tohost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->extent));
}

void transform_fromhost_VkImageCopy2KHR(
    ResourceTracker* resourceTracker,
    VkImageCopy2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
    transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->srcOffset));
    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
    transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->dstOffset));
    transform_fromhost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->extent));
}

void transform_tohost_VkCopyImageInfo2KHR(
    ResourceTracker* resourceTracker,
    VkCopyImageInfo2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pRegions)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i)
            {
                transform_tohost_VkImageCopy2KHR(resourceTracker, (VkImageCopy2KHR*)(toTransform->pRegions + i));
            }
        }
    }
}

void transform_fromhost_VkCopyImageInfo2KHR(
    ResourceTracker* resourceTracker,
    VkCopyImageInfo2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pRegions)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i)
            {
                transform_fromhost_VkImageCopy2KHR(resourceTracker, (VkImageCopy2KHR*)(toTransform->pRegions + i));
            }
        }
    }
}

void transform_tohost_VkBufferImageCopy2KHR(
    ResourceTracker* resourceTracker,
    VkBufferImageCopy2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->imageSubresource));
    transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->imageOffset));
    transform_tohost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->imageExtent));
}

void transform_fromhost_VkBufferImageCopy2KHR(
    ResourceTracker* resourceTracker,
    VkBufferImageCopy2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->imageSubresource));
    transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->imageOffset));
    transform_fromhost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->imageExtent));
}

void transform_tohost_VkCopyBufferToImageInfo2KHR(
    ResourceTracker* resourceTracker,
    VkCopyBufferToImageInfo2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pRegions)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i)
            {
                transform_tohost_VkBufferImageCopy2KHR(resourceTracker, (VkBufferImageCopy2KHR*)(toTransform->pRegions + i));
            }
        }
    }
}

void transform_fromhost_VkCopyBufferToImageInfo2KHR(
    ResourceTracker* resourceTracker,
    VkCopyBufferToImageInfo2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pRegions)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i)
            {
                transform_fromhost_VkBufferImageCopy2KHR(resourceTracker, (VkBufferImageCopy2KHR*)(toTransform->pRegions + i));
            }
        }
    }
}

void transform_tohost_VkCopyImageToBufferInfo2KHR(
    ResourceTracker* resourceTracker,
    VkCopyImageToBufferInfo2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pRegions)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i)
            {
                transform_tohost_VkBufferImageCopy2KHR(resourceTracker, (VkBufferImageCopy2KHR*)(toTransform->pRegions + i));
            }
        }
    }
}

void transform_fromhost_VkCopyImageToBufferInfo2KHR(
    ResourceTracker* resourceTracker,
    VkCopyImageToBufferInfo2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pRegions)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i)
            {
                transform_fromhost_VkBufferImageCopy2KHR(resourceTracker, (VkBufferImageCopy2KHR*)(toTransform->pRegions + i));
            }
        }
    }
}

void transform_tohost_VkImageBlit2KHR(
    ResourceTracker* resourceTracker,
    VkImageBlit2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
    for (uint32_t i = 0; i < (uint32_t)2; ++i)
    {
        transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(toTransform->srcOffsets + i));
    }
    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
    for (uint32_t i = 0; i < (uint32_t)2; ++i)
    {
        transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(toTransform->dstOffsets + i));
    }
}

void transform_fromhost_VkImageBlit2KHR(
    ResourceTracker* resourceTracker,
    VkImageBlit2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
    for (uint32_t i = 0; i < (uint32_t)2; ++i)
    {
        transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(toTransform->srcOffsets + i));
    }
    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
    for (uint32_t i = 0; i < (uint32_t)2; ++i)
    {
        transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(toTransform->dstOffsets + i));
    }
}

void transform_tohost_VkBlitImageInfo2KHR(
    ResourceTracker* resourceTracker,
    VkBlitImageInfo2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pRegions)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i)
            {
                transform_tohost_VkImageBlit2KHR(resourceTracker, (VkImageBlit2KHR*)(toTransform->pRegions + i));
            }
        }
    }
}

void transform_fromhost_VkBlitImageInfo2KHR(
    ResourceTracker* resourceTracker,
    VkBlitImageInfo2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pRegions)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i)
            {
                transform_fromhost_VkImageBlit2KHR(resourceTracker, (VkImageBlit2KHR*)(toTransform->pRegions + i));
            }
        }
    }
}

void transform_tohost_VkImageResolve2KHR(
    ResourceTracker* resourceTracker,
    VkImageResolve2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
    transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->srcOffset));
    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
    transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->dstOffset));
    transform_tohost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->extent));
}

void transform_fromhost_VkImageResolve2KHR(
    ResourceTracker* resourceTracker,
    VkImageResolve2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
    transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->srcOffset));
    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
    transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->dstOffset));
    transform_fromhost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->extent));
}

void transform_tohost_VkResolveImageInfo2KHR(
    ResourceTracker* resourceTracker,
    VkResolveImageInfo2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pRegions)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i)
            {
                transform_tohost_VkImageResolve2KHR(resourceTracker, (VkImageResolve2KHR*)(toTransform->pRegions + i));
            }
        }
    }
}

void transform_fromhost_VkResolveImageInfo2KHR(
    ResourceTracker* resourceTracker,
    VkResolveImageInfo2KHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pRegions)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i)
            {
                transform_fromhost_VkImageResolve2KHR(resourceTracker, (VkImageResolve2KHR*)(toTransform->pRegions + i));
            }
        }
    }
}

#endif
#ifdef VK_ANDROID_native_buffer
void transform_tohost_VkNativeBufferANDROID(
    ResourceTracker* resourceTracker,
    VkNativeBufferANDROID* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkNativeBufferANDROID(
    ResourceTracker* resourceTracker,
    VkNativeBufferANDROID* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_debug_report
void transform_tohost_VkDebugReportCallbackCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkDebugReportCallbackCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDebugReportCallbackCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkDebugReportCallbackCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_NV_glsl_shader
#endif
#ifdef VK_EXT_depth_range_unrestricted
#endif
#ifdef VK_IMG_filter_cubic
#endif
#ifdef VK_AMD_rasterization_order
void transform_tohost_VkPipelineRasterizationStateRasterizationOrderAMD(
    ResourceTracker* resourceTracker,
    VkPipelineRasterizationStateRasterizationOrderAMD* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPipelineRasterizationStateRasterizationOrderAMD(
    ResourceTracker* resourceTracker,
    VkPipelineRasterizationStateRasterizationOrderAMD* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_AMD_shader_trinary_minmax
#endif
#ifdef VK_AMD_shader_explicit_vertex_parameter
#endif
#ifdef VK_EXT_debug_marker
void transform_tohost_VkDebugMarkerObjectNameInfoEXT(
    ResourceTracker* resourceTracker,
    VkDebugMarkerObjectNameInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDebugMarkerObjectNameInfoEXT(
    ResourceTracker* resourceTracker,
    VkDebugMarkerObjectNameInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDebugMarkerObjectTagInfoEXT(
    ResourceTracker* resourceTracker,
    VkDebugMarkerObjectTagInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDebugMarkerObjectTagInfoEXT(
    ResourceTracker* resourceTracker,
    VkDebugMarkerObjectTagInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDebugMarkerMarkerInfoEXT(
    ResourceTracker* resourceTracker,
    VkDebugMarkerMarkerInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDebugMarkerMarkerInfoEXT(
    ResourceTracker* resourceTracker,
    VkDebugMarkerMarkerInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_AMD_gcn_shader
#endif
#ifdef VK_NV_dedicated_allocation
void transform_tohost_VkDedicatedAllocationImageCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkDedicatedAllocationImageCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDedicatedAllocationImageCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkDedicatedAllocationImageCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDedicatedAllocationBufferCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkDedicatedAllocationBufferCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDedicatedAllocationBufferCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkDedicatedAllocationBufferCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDedicatedAllocationMemoryAllocateInfoNV(
    ResourceTracker* resourceTracker,
    VkDedicatedAllocationMemoryAllocateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDedicatedAllocationMemoryAllocateInfoNV(
    ResourceTracker* resourceTracker,
    VkDedicatedAllocationMemoryAllocateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_transform_feedback
void transform_tohost_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceTransformFeedbackFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceTransformFeedbackFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceTransformFeedbackPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceTransformFeedbackPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPipelineRasterizationStateStreamCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkPipelineRasterizationStateStreamCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPipelineRasterizationStateStreamCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkPipelineRasterizationStateStreamCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_NVX_image_view_handle
void transform_tohost_VkImageViewHandleInfoNVX(
    ResourceTracker* resourceTracker,
    VkImageViewHandleInfoNVX* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkImageViewHandleInfoNVX(
    ResourceTracker* resourceTracker,
    VkImageViewHandleInfoNVX* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkImageViewAddressPropertiesNVX(
    ResourceTracker* resourceTracker,
    VkImageViewAddressPropertiesNVX* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkImageViewAddressPropertiesNVX(
    ResourceTracker* resourceTracker,
    VkImageViewAddressPropertiesNVX* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_AMD_draw_indirect_count
#endif
#ifdef VK_AMD_negative_viewport_height
#endif
#ifdef VK_AMD_gpu_shader_half_float
#endif
#ifdef VK_AMD_shader_ballot
#endif
#ifdef VK_AMD_texture_gather_bias_lod
void transform_tohost_VkTextureLODGatherFormatPropertiesAMD(
    ResourceTracker* resourceTracker,
    VkTextureLODGatherFormatPropertiesAMD* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkTextureLODGatherFormatPropertiesAMD(
    ResourceTracker* resourceTracker,
    VkTextureLODGatherFormatPropertiesAMD* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_AMD_shader_info
void transform_tohost_VkShaderResourceUsageAMD(
    ResourceTracker* resourceTracker,
    VkShaderResourceUsageAMD* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkShaderResourceUsageAMD(
    ResourceTracker* resourceTracker,
    VkShaderResourceUsageAMD* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkShaderStatisticsInfoAMD(
    ResourceTracker* resourceTracker,
    VkShaderStatisticsInfoAMD* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkShaderResourceUsageAMD(resourceTracker, (VkShaderResourceUsageAMD*)(&toTransform->resourceUsage));
}

void transform_fromhost_VkShaderStatisticsInfoAMD(
    ResourceTracker* resourceTracker,
    VkShaderStatisticsInfoAMD* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkShaderResourceUsageAMD(resourceTracker, (VkShaderResourceUsageAMD*)(&toTransform->resourceUsage));
}

#endif
#ifdef VK_AMD_shader_image_load_store_lod
#endif
#ifdef VK_GGP_stream_descriptor_surface
void transform_tohost_VkStreamDescriptorSurfaceCreateInfoGGP(
    ResourceTracker* resourceTracker,
    VkStreamDescriptorSurfaceCreateInfoGGP* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkStreamDescriptorSurfaceCreateInfoGGP(
    ResourceTracker* resourceTracker,
    VkStreamDescriptorSurfaceCreateInfoGGP* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_NV_corner_sampled_image
void transform_tohost_VkPhysicalDeviceCornerSampledImageFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceCornerSampledImageFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceCornerSampledImageFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceCornerSampledImageFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_IMG_format_pvrtc
#endif
#ifdef VK_NV_external_memory_capabilities
void transform_tohost_VkExternalImageFormatPropertiesNV(
    ResourceTracker* resourceTracker,
    VkExternalImageFormatPropertiesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkImageFormatProperties(resourceTracker, (VkImageFormatProperties*)(&toTransform->imageFormatProperties));
}

void transform_fromhost_VkExternalImageFormatPropertiesNV(
    ResourceTracker* resourceTracker,
    VkExternalImageFormatPropertiesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkImageFormatProperties(resourceTracker, (VkImageFormatProperties*)(&toTransform->imageFormatProperties));
}

#endif
#ifdef VK_NV_external_memory
void transform_tohost_VkExternalMemoryImageCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkExternalMemoryImageCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkExternalMemoryImageCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkExternalMemoryImageCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkExportMemoryAllocateInfoNV(
    ResourceTracker* resourceTracker,
    VkExportMemoryAllocateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkExportMemoryAllocateInfoNV(
    ResourceTracker* resourceTracker,
    VkExportMemoryAllocateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_NV_external_memory_win32
void transform_tohost_VkImportMemoryWin32HandleInfoNV(
    ResourceTracker* resourceTracker,
    VkImportMemoryWin32HandleInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkImportMemoryWin32HandleInfoNV(
    ResourceTracker* resourceTracker,
    VkImportMemoryWin32HandleInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkExportMemoryWin32HandleInfoNV(
    ResourceTracker* resourceTracker,
    VkExportMemoryWin32HandleInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkExportMemoryWin32HandleInfoNV(
    ResourceTracker* resourceTracker,
    VkExportMemoryWin32HandleInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_NV_win32_keyed_mutex
void transform_tohost_VkWin32KeyedMutexAcquireReleaseInfoNV(
    ResourceTracker* resourceTracker,
    VkWin32KeyedMutexAcquireReleaseInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)toTransform->pReleaseSyncs, toTransform->releaseCount, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkWin32KeyedMutexAcquireReleaseInfoNV(
    ResourceTracker* resourceTracker,
    VkWin32KeyedMutexAcquireReleaseInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)toTransform->pReleaseSyncs, toTransform->releaseCount, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_validation_flags
void transform_tohost_VkValidationFlagsEXT(
    ResourceTracker* resourceTracker,
    VkValidationFlagsEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkValidationFlagsEXT(
    ResourceTracker* resourceTracker,
    VkValidationFlagsEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_NN_vi_surface
void transform_tohost_VkViSurfaceCreateInfoNN(
    ResourceTracker* resourceTracker,
    VkViSurfaceCreateInfoNN* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkViSurfaceCreateInfoNN(
    ResourceTracker* resourceTracker,
    VkViSurfaceCreateInfoNN* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_shader_subgroup_ballot
#endif
#ifdef VK_EXT_shader_subgroup_vote
#endif
#ifdef VK_EXT_texture_compression_astc_hdr
void transform_tohost_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_astc_decode_mode
void transform_tohost_VkImageViewASTCDecodeModeEXT(
    ResourceTracker* resourceTracker,
    VkImageViewASTCDecodeModeEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkImageViewASTCDecodeModeEXT(
    ResourceTracker* resourceTracker,
    VkImageViewASTCDecodeModeEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceASTCDecodeFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceASTCDecodeFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceASTCDecodeFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceASTCDecodeFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_conditional_rendering
void transform_tohost_VkConditionalRenderingBeginInfoEXT(
    ResourceTracker* resourceTracker,
    VkConditionalRenderingBeginInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkConditionalRenderingBeginInfoEXT(
    ResourceTracker* resourceTracker,
    VkConditionalRenderingBeginInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceConditionalRenderingFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceConditionalRenderingFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
    ResourceTracker* resourceTracker,
    VkCommandBufferInheritanceConditionalRenderingInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
    ResourceTracker* resourceTracker,
    VkCommandBufferInheritanceConditionalRenderingInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_NV_clip_space_w_scaling
void transform_tohost_VkViewportWScalingNV(
    ResourceTracker* resourceTracker,
    VkViewportWScalingNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkViewportWScalingNV(
    ResourceTracker* resourceTracker,
    VkViewportWScalingNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkPipelineViewportWScalingStateCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkPipelineViewportWScalingStateCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pViewportWScalings)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->viewportCount; ++i)
            {
                transform_tohost_VkViewportWScalingNV(resourceTracker, (VkViewportWScalingNV*)(toTransform->pViewportWScalings + i));
            }
        }
    }
}

void transform_fromhost_VkPipelineViewportWScalingStateCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkPipelineViewportWScalingStateCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pViewportWScalings)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->viewportCount; ++i)
            {
                transform_fromhost_VkViewportWScalingNV(resourceTracker, (VkViewportWScalingNV*)(toTransform->pViewportWScalings + i));
            }
        }
    }
}

#endif
#ifdef VK_EXT_direct_mode_display
#endif
#ifdef VK_EXT_acquire_xlib_display
#endif
#ifdef VK_EXT_display_surface_counter
void transform_tohost_VkSurfaceCapabilities2EXT(
    ResourceTracker* resourceTracker,
    VkSurfaceCapabilities2EXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->currentExtent));
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->minImageExtent));
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxImageExtent));
}

void transform_fromhost_VkSurfaceCapabilities2EXT(
    ResourceTracker* resourceTracker,
    VkSurfaceCapabilities2EXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->currentExtent));
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->minImageExtent));
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxImageExtent));
}

#endif
#ifdef VK_EXT_display_control
void transform_tohost_VkDisplayPowerInfoEXT(
    ResourceTracker* resourceTracker,
    VkDisplayPowerInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDisplayPowerInfoEXT(
    ResourceTracker* resourceTracker,
    VkDisplayPowerInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDeviceEventInfoEXT(
    ResourceTracker* resourceTracker,
    VkDeviceEventInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDeviceEventInfoEXT(
    ResourceTracker* resourceTracker,
    VkDeviceEventInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDisplayEventInfoEXT(
    ResourceTracker* resourceTracker,
    VkDisplayEventInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDisplayEventInfoEXT(
    ResourceTracker* resourceTracker,
    VkDisplayEventInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkSwapchainCounterCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkSwapchainCounterCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkSwapchainCounterCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkSwapchainCounterCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_GOOGLE_display_timing
void transform_tohost_VkRefreshCycleDurationGOOGLE(
    ResourceTracker* resourceTracker,
    VkRefreshCycleDurationGOOGLE* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkRefreshCycleDurationGOOGLE(
    ResourceTracker* resourceTracker,
    VkRefreshCycleDurationGOOGLE* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkPastPresentationTimingGOOGLE(
    ResourceTracker* resourceTracker,
    VkPastPresentationTimingGOOGLE* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkPastPresentationTimingGOOGLE(
    ResourceTracker* resourceTracker,
    VkPastPresentationTimingGOOGLE* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkPresentTimeGOOGLE(
    ResourceTracker* resourceTracker,
    VkPresentTimeGOOGLE* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkPresentTimeGOOGLE(
    ResourceTracker* resourceTracker,
    VkPresentTimeGOOGLE* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkPresentTimesInfoGOOGLE(
    ResourceTracker* resourceTracker,
    VkPresentTimesInfoGOOGLE* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pTimes)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->swapchainCount; ++i)
            {
                transform_tohost_VkPresentTimeGOOGLE(resourceTracker, (VkPresentTimeGOOGLE*)(toTransform->pTimes + i));
            }
        }
    }
}

void transform_fromhost_VkPresentTimesInfoGOOGLE(
    ResourceTracker* resourceTracker,
    VkPresentTimesInfoGOOGLE* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pTimes)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->swapchainCount; ++i)
            {
                transform_fromhost_VkPresentTimeGOOGLE(resourceTracker, (VkPresentTimeGOOGLE*)(toTransform->pTimes + i));
            }
        }
    }
}

#endif
#ifdef VK_NV_sample_mask_override_coverage
#endif
#ifdef VK_NV_geometry_shader_passthrough
#endif
#ifdef VK_NV_viewport_array2
#endif
#ifdef VK_NVX_multiview_per_view_attributes
void transform_tohost_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_NV_viewport_swizzle
void transform_tohost_VkViewportSwizzleNV(
    ResourceTracker* resourceTracker,
    VkViewportSwizzleNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkViewportSwizzleNV(
    ResourceTracker* resourceTracker,
    VkViewportSwizzleNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkPipelineViewportSwizzleStateCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkPipelineViewportSwizzleStateCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pViewportSwizzles)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->viewportCount; ++i)
            {
                transform_tohost_VkViewportSwizzleNV(resourceTracker, (VkViewportSwizzleNV*)(toTransform->pViewportSwizzles + i));
            }
        }
    }
}

void transform_fromhost_VkPipelineViewportSwizzleStateCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkPipelineViewportSwizzleStateCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pViewportSwizzles)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->viewportCount; ++i)
            {
                transform_fromhost_VkViewportSwizzleNV(resourceTracker, (VkViewportSwizzleNV*)(toTransform->pViewportSwizzles + i));
            }
        }
    }
}

#endif
#ifdef VK_EXT_discard_rectangles
void transform_tohost_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceDiscardRectanglePropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceDiscardRectanglePropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPipelineDiscardRectangleStateCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkPipelineDiscardRectangleStateCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pDiscardRectangles)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->discardRectangleCount; ++i)
            {
                transform_tohost_VkRect2D(resourceTracker, (VkRect2D*)(toTransform->pDiscardRectangles + i));
            }
        }
    }
}

void transform_fromhost_VkPipelineDiscardRectangleStateCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkPipelineDiscardRectangleStateCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pDiscardRectangles)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->discardRectangleCount; ++i)
            {
                transform_fromhost_VkRect2D(resourceTracker, (VkRect2D*)(toTransform->pDiscardRectangles + i));
            }
        }
    }
}

#endif
#ifdef VK_EXT_conservative_rasterization
void transform_tohost_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceConservativeRasterizationPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceConservativeRasterizationPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPipelineRasterizationConservativeStateCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkPipelineRasterizationConservativeStateCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPipelineRasterizationConservativeStateCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkPipelineRasterizationConservativeStateCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_depth_clip_enable
void transform_tohost_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceDepthClipEnableFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceDepthClipEnableFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkPipelineRasterizationDepthClipStateCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkPipelineRasterizationDepthClipStateCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_swapchain_colorspace
#endif
#ifdef VK_EXT_hdr_metadata
void transform_tohost_VkXYColorEXT(
    ResourceTracker* resourceTracker,
    VkXYColorEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkXYColorEXT(
    ResourceTracker* resourceTracker,
    VkXYColorEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkHdrMetadataEXT(
    ResourceTracker* resourceTracker,
    VkHdrMetadataEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkXYColorEXT(resourceTracker, (VkXYColorEXT*)(&toTransform->displayPrimaryRed));
    transform_tohost_VkXYColorEXT(resourceTracker, (VkXYColorEXT*)(&toTransform->displayPrimaryGreen));
    transform_tohost_VkXYColorEXT(resourceTracker, (VkXYColorEXT*)(&toTransform->displayPrimaryBlue));
    transform_tohost_VkXYColorEXT(resourceTracker, (VkXYColorEXT*)(&toTransform->whitePoint));
}

void transform_fromhost_VkHdrMetadataEXT(
    ResourceTracker* resourceTracker,
    VkHdrMetadataEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkXYColorEXT(resourceTracker, (VkXYColorEXT*)(&toTransform->displayPrimaryRed));
    transform_fromhost_VkXYColorEXT(resourceTracker, (VkXYColorEXT*)(&toTransform->displayPrimaryGreen));
    transform_fromhost_VkXYColorEXT(resourceTracker, (VkXYColorEXT*)(&toTransform->displayPrimaryBlue));
    transform_fromhost_VkXYColorEXT(resourceTracker, (VkXYColorEXT*)(&toTransform->whitePoint));
}

#endif
#ifdef VK_MVK_ios_surface
void transform_tohost_VkIOSSurfaceCreateInfoMVK(
    ResourceTracker* resourceTracker,
    VkIOSSurfaceCreateInfoMVK* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkIOSSurfaceCreateInfoMVK(
    ResourceTracker* resourceTracker,
    VkIOSSurfaceCreateInfoMVK* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_MVK_macos_surface
void transform_tohost_VkMacOSSurfaceCreateInfoMVK(
    ResourceTracker* resourceTracker,
    VkMacOSSurfaceCreateInfoMVK* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkMacOSSurfaceCreateInfoMVK(
    ResourceTracker* resourceTracker,
    VkMacOSSurfaceCreateInfoMVK* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_MVK_moltenvk
#endif
#ifdef VK_EXT_external_memory_dma_buf
#endif
#ifdef VK_EXT_queue_family_foreign
#endif
#ifdef VK_EXT_debug_utils
void transform_tohost_VkDebugUtilsLabelEXT(
    ResourceTracker* resourceTracker,
    VkDebugUtilsLabelEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDebugUtilsLabelEXT(
    ResourceTracker* resourceTracker,
    VkDebugUtilsLabelEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDebugUtilsObjectNameInfoEXT(
    ResourceTracker* resourceTracker,
    VkDebugUtilsObjectNameInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDebugUtilsObjectNameInfoEXT(
    ResourceTracker* resourceTracker,
    VkDebugUtilsObjectNameInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDebugUtilsMessengerCallbackDataEXT(
    ResourceTracker* resourceTracker,
    VkDebugUtilsMessengerCallbackDataEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pQueueLabels)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->queueLabelCount; ++i)
            {
                transform_tohost_VkDebugUtilsLabelEXT(resourceTracker, (VkDebugUtilsLabelEXT*)(toTransform->pQueueLabels + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pCmdBufLabels)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->cmdBufLabelCount; ++i)
            {
                transform_tohost_VkDebugUtilsLabelEXT(resourceTracker, (VkDebugUtilsLabelEXT*)(toTransform->pCmdBufLabels + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pObjects)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->objectCount; ++i)
            {
                transform_tohost_VkDebugUtilsObjectNameInfoEXT(resourceTracker, (VkDebugUtilsObjectNameInfoEXT*)(toTransform->pObjects + i));
            }
        }
    }
}

void transform_fromhost_VkDebugUtilsMessengerCallbackDataEXT(
    ResourceTracker* resourceTracker,
    VkDebugUtilsMessengerCallbackDataEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pQueueLabels)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->queueLabelCount; ++i)
            {
                transform_fromhost_VkDebugUtilsLabelEXT(resourceTracker, (VkDebugUtilsLabelEXT*)(toTransform->pQueueLabels + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pCmdBufLabels)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->cmdBufLabelCount; ++i)
            {
                transform_fromhost_VkDebugUtilsLabelEXT(resourceTracker, (VkDebugUtilsLabelEXT*)(toTransform->pCmdBufLabels + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pObjects)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->objectCount; ++i)
            {
                transform_fromhost_VkDebugUtilsObjectNameInfoEXT(resourceTracker, (VkDebugUtilsObjectNameInfoEXT*)(toTransform->pObjects + i));
            }
        }
    }
}

void transform_tohost_VkDebugUtilsMessengerCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkDebugUtilsMessengerCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDebugUtilsMessengerCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkDebugUtilsMessengerCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDebugUtilsObjectTagInfoEXT(
    ResourceTracker* resourceTracker,
    VkDebugUtilsObjectTagInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDebugUtilsObjectTagInfoEXT(
    ResourceTracker* resourceTracker,
    VkDebugUtilsObjectTagInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_ANDROID_external_memory_android_hardware_buffer
void transform_tohost_VkAndroidHardwareBufferUsageANDROID(
    ResourceTracker* resourceTracker,
    VkAndroidHardwareBufferUsageANDROID* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkAndroidHardwareBufferUsageANDROID(
    ResourceTracker* resourceTracker,
    VkAndroidHardwareBufferUsageANDROID* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkAndroidHardwareBufferPropertiesANDROID(
    ResourceTracker* resourceTracker,
    VkAndroidHardwareBufferPropertiesANDROID* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkAndroidHardwareBufferPropertiesANDROID(
    ResourceTracker* resourceTracker,
    VkAndroidHardwareBufferPropertiesANDROID* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkAndroidHardwareBufferFormatPropertiesANDROID(
    ResourceTracker* resourceTracker,
    VkAndroidHardwareBufferFormatPropertiesANDROID* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkComponentMapping(resourceTracker, (VkComponentMapping*)(&toTransform->samplerYcbcrConversionComponents));
}

void transform_fromhost_VkAndroidHardwareBufferFormatPropertiesANDROID(
    ResourceTracker* resourceTracker,
    VkAndroidHardwareBufferFormatPropertiesANDROID* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkComponentMapping(resourceTracker, (VkComponentMapping*)(&toTransform->samplerYcbcrConversionComponents));
}

void transform_tohost_VkImportAndroidHardwareBufferInfoANDROID(
    ResourceTracker* resourceTracker,
    VkImportAndroidHardwareBufferInfoANDROID* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkImportAndroidHardwareBufferInfoANDROID(
    ResourceTracker* resourceTracker,
    VkImportAndroidHardwareBufferInfoANDROID* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkMemoryGetAndroidHardwareBufferInfoANDROID(
    ResourceTracker* resourceTracker,
    VkMemoryGetAndroidHardwareBufferInfoANDROID* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkMemoryGetAndroidHardwareBufferInfoANDROID(
    ResourceTracker* resourceTracker,
    VkMemoryGetAndroidHardwareBufferInfoANDROID* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkExternalFormatANDROID(
    ResourceTracker* resourceTracker,
    VkExternalFormatANDROID* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkExternalFormatANDROID(
    ResourceTracker* resourceTracker,
    VkExternalFormatANDROID* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_sampler_filter_minmax
#endif
#ifdef VK_AMD_gpu_shader_int16
#endif
#ifdef VK_AMD_mixed_attachment_samples
#endif
#ifdef VK_AMD_shader_fragment_mask
#endif
#ifdef VK_EXT_inline_uniform_block
void transform_tohost_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceInlineUniformBlockFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceInlineUniformBlockFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceInlineUniformBlockPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceInlineUniformBlockPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkWriteDescriptorSetInlineUniformBlockEXT(
    ResourceTracker* resourceTracker,
    VkWriteDescriptorSetInlineUniformBlockEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkWriteDescriptorSetInlineUniformBlockEXT(
    ResourceTracker* resourceTracker,
    VkWriteDescriptorSetInlineUniformBlockEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkDescriptorPoolInlineUniformBlockCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkDescriptorPoolInlineUniformBlockCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_shader_stencil_export
#endif
#ifdef VK_EXT_sample_locations
void transform_tohost_VkSampleLocationEXT(
    ResourceTracker* resourceTracker,
    VkSampleLocationEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkSampleLocationEXT(
    ResourceTracker* resourceTracker,
    VkSampleLocationEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkSampleLocationsInfoEXT(
    ResourceTracker* resourceTracker,
    VkSampleLocationsInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->sampleLocationGridSize));
    if (toTransform)
    {
        if (toTransform->pSampleLocations)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->sampleLocationsCount; ++i)
            {
                transform_tohost_VkSampleLocationEXT(resourceTracker, (VkSampleLocationEXT*)(toTransform->pSampleLocations + i));
            }
        }
    }
}

void transform_fromhost_VkSampleLocationsInfoEXT(
    ResourceTracker* resourceTracker,
    VkSampleLocationsInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->sampleLocationGridSize));
    if (toTransform)
    {
        if (toTransform->pSampleLocations)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->sampleLocationsCount; ++i)
            {
                transform_fromhost_VkSampleLocationEXT(resourceTracker, (VkSampleLocationEXT*)(toTransform->pSampleLocations + i));
            }
        }
    }
}

void transform_tohost_VkAttachmentSampleLocationsEXT(
    ResourceTracker* resourceTracker,
    VkAttachmentSampleLocationsEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkSampleLocationsInfoEXT(resourceTracker, (VkSampleLocationsInfoEXT*)(&toTransform->sampleLocationsInfo));
}

void transform_fromhost_VkAttachmentSampleLocationsEXT(
    ResourceTracker* resourceTracker,
    VkAttachmentSampleLocationsEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkSampleLocationsInfoEXT(resourceTracker, (VkSampleLocationsInfoEXT*)(&toTransform->sampleLocationsInfo));
}

void transform_tohost_VkSubpassSampleLocationsEXT(
    ResourceTracker* resourceTracker,
    VkSubpassSampleLocationsEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkSampleLocationsInfoEXT(resourceTracker, (VkSampleLocationsInfoEXT*)(&toTransform->sampleLocationsInfo));
}

void transform_fromhost_VkSubpassSampleLocationsEXT(
    ResourceTracker* resourceTracker,
    VkSubpassSampleLocationsEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkSampleLocationsInfoEXT(resourceTracker, (VkSampleLocationsInfoEXT*)(&toTransform->sampleLocationsInfo));
}

void transform_tohost_VkRenderPassSampleLocationsBeginInfoEXT(
    ResourceTracker* resourceTracker,
    VkRenderPassSampleLocationsBeginInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pAttachmentInitialSampleLocations)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentInitialSampleLocationsCount; ++i)
            {
                transform_tohost_VkAttachmentSampleLocationsEXT(resourceTracker, (VkAttachmentSampleLocationsEXT*)(toTransform->pAttachmentInitialSampleLocations + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pPostSubpassSampleLocations)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->postSubpassSampleLocationsCount; ++i)
            {
                transform_tohost_VkSubpassSampleLocationsEXT(resourceTracker, (VkSubpassSampleLocationsEXT*)(toTransform->pPostSubpassSampleLocations + i));
            }
        }
    }
}

void transform_fromhost_VkRenderPassSampleLocationsBeginInfoEXT(
    ResourceTracker* resourceTracker,
    VkRenderPassSampleLocationsBeginInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pAttachmentInitialSampleLocations)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentInitialSampleLocationsCount; ++i)
            {
                transform_fromhost_VkAttachmentSampleLocationsEXT(resourceTracker, (VkAttachmentSampleLocationsEXT*)(toTransform->pAttachmentInitialSampleLocations + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pPostSubpassSampleLocations)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->postSubpassSampleLocationsCount; ++i)
            {
                transform_fromhost_VkSubpassSampleLocationsEXT(resourceTracker, (VkSubpassSampleLocationsEXT*)(toTransform->pPostSubpassSampleLocations + i));
            }
        }
    }
}

void transform_tohost_VkPipelineSampleLocationsStateCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkPipelineSampleLocationsStateCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkSampleLocationsInfoEXT(resourceTracker, (VkSampleLocationsInfoEXT*)(&toTransform->sampleLocationsInfo));
}

void transform_fromhost_VkPipelineSampleLocationsStateCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkPipelineSampleLocationsStateCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkSampleLocationsInfoEXT(resourceTracker, (VkSampleLocationsInfoEXT*)(&toTransform->sampleLocationsInfo));
}

void transform_tohost_VkPhysicalDeviceSampleLocationsPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceSampleLocationsPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxSampleLocationGridSize));
}

void transform_fromhost_VkPhysicalDeviceSampleLocationsPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceSampleLocationsPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxSampleLocationGridSize));
}

void transform_tohost_VkMultisamplePropertiesEXT(
    ResourceTracker* resourceTracker,
    VkMultisamplePropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxSampleLocationGridSize));
}

void transform_fromhost_VkMultisamplePropertiesEXT(
    ResourceTracker* resourceTracker,
    VkMultisamplePropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxSampleLocationGridSize));
}

#endif
#ifdef VK_EXT_blend_operation_advanced
void transform_tohost_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkPipelineColorBlendAdvancedStateCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkPipelineColorBlendAdvancedStateCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_NV_fragment_coverage_to_color
void transform_tohost_VkPipelineCoverageToColorStateCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkPipelineCoverageToColorStateCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPipelineCoverageToColorStateCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkPipelineCoverageToColorStateCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_NV_framebuffer_mixed_samples
void transform_tohost_VkPipelineCoverageModulationStateCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkPipelineCoverageModulationStateCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPipelineCoverageModulationStateCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkPipelineCoverageModulationStateCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_NV_fill_rectangle
#endif
#ifdef VK_NV_shader_sm_builtins
void transform_tohost_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_post_depth_coverage
#endif
#ifdef VK_EXT_image_drm_format_modifier
void transform_tohost_VkDrmFormatModifierPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkDrmFormatModifierPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkDrmFormatModifierPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkDrmFormatModifierPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkDrmFormatModifierPropertiesListEXT(
    ResourceTracker* resourceTracker,
    VkDrmFormatModifierPropertiesListEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pDrmFormatModifierProperties)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->drmFormatModifierCount; ++i)
            {
                transform_tohost_VkDrmFormatModifierPropertiesEXT(resourceTracker, (VkDrmFormatModifierPropertiesEXT*)(toTransform->pDrmFormatModifierProperties + i));
            }
        }
    }
}

void transform_fromhost_VkDrmFormatModifierPropertiesListEXT(
    ResourceTracker* resourceTracker,
    VkDrmFormatModifierPropertiesListEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pDrmFormatModifierProperties)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->drmFormatModifierCount; ++i)
            {
                transform_fromhost_VkDrmFormatModifierPropertiesEXT(resourceTracker, (VkDrmFormatModifierPropertiesEXT*)(toTransform->pDrmFormatModifierProperties + i));
            }
        }
    }
}

void transform_tohost_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceImageDrmFormatModifierInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceImageDrmFormatModifierInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkImageDrmFormatModifierListCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkImageDrmFormatModifierListCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkImageDrmFormatModifierListCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkImageDrmFormatModifierListCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkImageDrmFormatModifierExplicitCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkImageDrmFormatModifierExplicitCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pPlaneLayouts)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->drmFormatModifierPlaneCount; ++i)
            {
                transform_tohost_VkSubresourceLayout(resourceTracker, (VkSubresourceLayout*)(toTransform->pPlaneLayouts + i));
            }
        }
    }
}

void transform_fromhost_VkImageDrmFormatModifierExplicitCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkImageDrmFormatModifierExplicitCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pPlaneLayouts)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->drmFormatModifierPlaneCount; ++i)
            {
                transform_fromhost_VkSubresourceLayout(resourceTracker, (VkSubresourceLayout*)(toTransform->pPlaneLayouts + i));
            }
        }
    }
}

void transform_tohost_VkImageDrmFormatModifierPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkImageDrmFormatModifierPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkImageDrmFormatModifierPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkImageDrmFormatModifierPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_validation_cache
void transform_tohost_VkValidationCacheCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkValidationCacheCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkValidationCacheCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkValidationCacheCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkShaderModuleValidationCacheCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkShaderModuleValidationCacheCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkShaderModuleValidationCacheCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkShaderModuleValidationCacheCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_descriptor_indexing
#endif
#ifdef VK_EXT_shader_viewport_index_layer
#endif
#ifdef VK_NV_shading_rate_image
void transform_tohost_VkShadingRatePaletteNV(
    ResourceTracker* resourceTracker,
    VkShadingRatePaletteNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkShadingRatePaletteNV(
    ResourceTracker* resourceTracker,
    VkShadingRatePaletteNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkPipelineViewportShadingRateImageStateCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkPipelineViewportShadingRateImageStateCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pShadingRatePalettes)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->viewportCount; ++i)
            {
                transform_tohost_VkShadingRatePaletteNV(resourceTracker, (VkShadingRatePaletteNV*)(toTransform->pShadingRatePalettes + i));
            }
        }
    }
}

void transform_fromhost_VkPipelineViewportShadingRateImageStateCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkPipelineViewportShadingRateImageStateCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pShadingRatePalettes)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->viewportCount; ++i)
            {
                transform_fromhost_VkShadingRatePaletteNV(resourceTracker, (VkShadingRatePaletteNV*)(toTransform->pShadingRatePalettes + i));
            }
        }
    }
}

void transform_tohost_VkPhysicalDeviceShadingRateImageFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShadingRateImageFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceShadingRateImageFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShadingRateImageFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceShadingRateImagePropertiesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShadingRateImagePropertiesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->shadingRateTexelSize));
}

void transform_fromhost_VkPhysicalDeviceShadingRateImagePropertiesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShadingRateImagePropertiesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->shadingRateTexelSize));
}

void transform_tohost_VkCoarseSampleLocationNV(
    ResourceTracker* resourceTracker,
    VkCoarseSampleLocationNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkCoarseSampleLocationNV(
    ResourceTracker* resourceTracker,
    VkCoarseSampleLocationNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkCoarseSampleOrderCustomNV(
    ResourceTracker* resourceTracker,
    VkCoarseSampleOrderCustomNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform)
    {
        if (toTransform->pSampleLocations)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->sampleLocationCount; ++i)
            {
                transform_tohost_VkCoarseSampleLocationNV(resourceTracker, (VkCoarseSampleLocationNV*)(toTransform->pSampleLocations + i));
            }
        }
    }
}

void transform_fromhost_VkCoarseSampleOrderCustomNV(
    ResourceTracker* resourceTracker,
    VkCoarseSampleOrderCustomNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform)
    {
        if (toTransform->pSampleLocations)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->sampleLocationCount; ++i)
            {
                transform_fromhost_VkCoarseSampleLocationNV(resourceTracker, (VkCoarseSampleLocationNV*)(toTransform->pSampleLocations + i));
            }
        }
    }
}

void transform_tohost_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pCustomSampleOrders)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->customSampleOrderCount; ++i)
            {
                transform_tohost_VkCoarseSampleOrderCustomNV(resourceTracker, (VkCoarseSampleOrderCustomNV*)(toTransform->pCustomSampleOrders + i));
            }
        }
    }
}

void transform_fromhost_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pCustomSampleOrders)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->customSampleOrderCount; ++i)
            {
                transform_fromhost_VkCoarseSampleOrderCustomNV(resourceTracker, (VkCoarseSampleOrderCustomNV*)(toTransform->pCustomSampleOrders + i));
            }
        }
    }
}

#endif
#ifdef VK_NV_ray_tracing
void transform_tohost_VkRayTracingShaderGroupCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkRayTracingShaderGroupCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkRayTracingShaderGroupCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkRayTracingShaderGroupCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkRayTracingPipelineCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkRayTracingPipelineCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pStages)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->stageCount; ++i)
            {
                transform_tohost_VkPipelineShaderStageCreateInfo(resourceTracker, (VkPipelineShaderStageCreateInfo*)(toTransform->pStages + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pGroups)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->groupCount; ++i)
            {
                transform_tohost_VkRayTracingShaderGroupCreateInfoNV(resourceTracker, (VkRayTracingShaderGroupCreateInfoNV*)(toTransform->pGroups + i));
            }
        }
    }
}

void transform_fromhost_VkRayTracingPipelineCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkRayTracingPipelineCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pStages)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->stageCount; ++i)
            {
                transform_fromhost_VkPipelineShaderStageCreateInfo(resourceTracker, (VkPipelineShaderStageCreateInfo*)(toTransform->pStages + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pGroups)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->groupCount; ++i)
            {
                transform_fromhost_VkRayTracingShaderGroupCreateInfoNV(resourceTracker, (VkRayTracingShaderGroupCreateInfoNV*)(toTransform->pGroups + i));
            }
        }
    }
}

void transform_tohost_VkGeometryTrianglesNV(
    ResourceTracker* resourceTracker,
    VkGeometryTrianglesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkGeometryTrianglesNV(
    ResourceTracker* resourceTracker,
    VkGeometryTrianglesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkGeometryAABBNV(
    ResourceTracker* resourceTracker,
    VkGeometryAABBNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkGeometryAABBNV(
    ResourceTracker* resourceTracker,
    VkGeometryAABBNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkGeometryDataNV(
    ResourceTracker* resourceTracker,
    VkGeometryDataNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkGeometryTrianglesNV(resourceTracker, (VkGeometryTrianglesNV*)(&toTransform->triangles));
    transform_tohost_VkGeometryAABBNV(resourceTracker, (VkGeometryAABBNV*)(&toTransform->aabbs));
}

void transform_fromhost_VkGeometryDataNV(
    ResourceTracker* resourceTracker,
    VkGeometryDataNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkGeometryTrianglesNV(resourceTracker, (VkGeometryTrianglesNV*)(&toTransform->triangles));
    transform_fromhost_VkGeometryAABBNV(resourceTracker, (VkGeometryAABBNV*)(&toTransform->aabbs));
}

void transform_tohost_VkGeometryNV(
    ResourceTracker* resourceTracker,
    VkGeometryNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkGeometryDataNV(resourceTracker, (VkGeometryDataNV*)(&toTransform->geometry));
}

void transform_fromhost_VkGeometryNV(
    ResourceTracker* resourceTracker,
    VkGeometryNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkGeometryDataNV(resourceTracker, (VkGeometryDataNV*)(&toTransform->geometry));
}

void transform_tohost_VkAccelerationStructureInfoNV(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pGeometries)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->geometryCount; ++i)
            {
                transform_tohost_VkGeometryNV(resourceTracker, (VkGeometryNV*)(toTransform->pGeometries + i));
            }
        }
    }
}

void transform_fromhost_VkAccelerationStructureInfoNV(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pGeometries)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->geometryCount; ++i)
            {
                transform_fromhost_VkGeometryNV(resourceTracker, (VkGeometryNV*)(toTransform->pGeometries + i));
            }
        }
    }
}

void transform_tohost_VkAccelerationStructureCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkAccelerationStructureInfoNV(resourceTracker, (VkAccelerationStructureInfoNV*)(&toTransform->info));
}

void transform_fromhost_VkAccelerationStructureCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkAccelerationStructureInfoNV(resourceTracker, (VkAccelerationStructureInfoNV*)(&toTransform->info));
}

void transform_tohost_VkBindAccelerationStructureMemoryInfoNV(
    ResourceTracker* resourceTracker,
    VkBindAccelerationStructureMemoryInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkBindAccelerationStructureMemoryInfoNV(
    ResourceTracker* resourceTracker,
    VkBindAccelerationStructureMemoryInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkWriteDescriptorSetAccelerationStructureNV(
    ResourceTracker* resourceTracker,
    VkWriteDescriptorSetAccelerationStructureNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkWriteDescriptorSetAccelerationStructureNV(
    ResourceTracker* resourceTracker,
    VkWriteDescriptorSetAccelerationStructureNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkAccelerationStructureMemoryRequirementsInfoNV(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureMemoryRequirementsInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkAccelerationStructureMemoryRequirementsInfoNV(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureMemoryRequirementsInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceRayTracingPropertiesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceRayTracingPropertiesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceRayTracingPropertiesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceRayTracingPropertiesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkTransformMatrixKHR(
    ResourceTracker* resourceTracker,
    VkTransformMatrixKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkTransformMatrixKHR(
    ResourceTracker* resourceTracker,
    VkTransformMatrixKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkAabbPositionsKHR(
    ResourceTracker* resourceTracker,
    VkAabbPositionsKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkAabbPositionsKHR(
    ResourceTracker* resourceTracker,
    VkAabbPositionsKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkAccelerationStructureInstanceKHR(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureInstanceKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkTransformMatrixKHR(resourceTracker, (VkTransformMatrixKHR*)(&toTransform->transform));
}

void transform_fromhost_VkAccelerationStructureInstanceKHR(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureInstanceKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkTransformMatrixKHR(resourceTracker, (VkTransformMatrixKHR*)(&toTransform->transform));
}

#endif
#ifdef VK_NV_representative_fragment_test
void transform_tohost_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkPipelineRepresentativeFragmentTestStateCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkPipelineRepresentativeFragmentTestStateCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_filter_cubic
void transform_tohost_VkPhysicalDeviceImageViewImageFormatInfoEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceImageViewImageFormatInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceImageViewImageFormatInfoEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceImageViewImageFormatInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkFilterCubicImageViewImageFormatPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkFilterCubicImageViewImageFormatPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkFilterCubicImageViewImageFormatPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkFilterCubicImageViewImageFormatPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_QCOM_render_pass_shader_resolve
#endif
#ifdef VK_EXT_global_priority
void transform_tohost_VkDeviceQueueGlobalPriorityCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkDeviceQueueGlobalPriorityCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDeviceQueueGlobalPriorityCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkDeviceQueueGlobalPriorityCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_external_memory_host
void transform_tohost_VkImportMemoryHostPointerInfoEXT(
    ResourceTracker* resourceTracker,
    VkImportMemoryHostPointerInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkImportMemoryHostPointerInfoEXT(
    ResourceTracker* resourceTracker,
    VkImportMemoryHostPointerInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkMemoryHostPointerPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkMemoryHostPointerPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkMemoryHostPointerPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkMemoryHostPointerPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceExternalMemoryHostPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceExternalMemoryHostPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_AMD_buffer_marker
#endif
#ifdef VK_AMD_pipeline_compiler_control
void transform_tohost_VkPipelineCompilerControlCreateInfoAMD(
    ResourceTracker* resourceTracker,
    VkPipelineCompilerControlCreateInfoAMD* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPipelineCompilerControlCreateInfoAMD(
    ResourceTracker* resourceTracker,
    VkPipelineCompilerControlCreateInfoAMD* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_calibrated_timestamps
void transform_tohost_VkCalibratedTimestampInfoEXT(
    ResourceTracker* resourceTracker,
    VkCalibratedTimestampInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkCalibratedTimestampInfoEXT(
    ResourceTracker* resourceTracker,
    VkCalibratedTimestampInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_AMD_shader_core_properties
void transform_tohost_VkPhysicalDeviceShaderCorePropertiesAMD(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderCorePropertiesAMD* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceShaderCorePropertiesAMD(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderCorePropertiesAMD* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_AMD_memory_overallocation_behavior
void transform_tohost_VkDeviceMemoryOverallocationCreateInfoAMD(
    ResourceTracker* resourceTracker,
    VkDeviceMemoryOverallocationCreateInfoAMD* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDeviceMemoryOverallocationCreateInfoAMD(
    ResourceTracker* resourceTracker,
    VkDeviceMemoryOverallocationCreateInfoAMD* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_vertex_attribute_divisor
void transform_tohost_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkVertexInputBindingDivisorDescriptionEXT(
    ResourceTracker* resourceTracker,
    VkVertexInputBindingDivisorDescriptionEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkVertexInputBindingDivisorDescriptionEXT(
    ResourceTracker* resourceTracker,
    VkVertexInputBindingDivisorDescriptionEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkPipelineVertexInputDivisorStateCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkPipelineVertexInputDivisorStateCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pVertexBindingDivisors)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->vertexBindingDivisorCount; ++i)
            {
                transform_tohost_VkVertexInputBindingDivisorDescriptionEXT(resourceTracker, (VkVertexInputBindingDivisorDescriptionEXT*)(toTransform->pVertexBindingDivisors + i));
            }
        }
    }
}

void transform_fromhost_VkPipelineVertexInputDivisorStateCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkPipelineVertexInputDivisorStateCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pVertexBindingDivisors)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->vertexBindingDivisorCount; ++i)
            {
                transform_fromhost_VkVertexInputBindingDivisorDescriptionEXT(resourceTracker, (VkVertexInputBindingDivisorDescriptionEXT*)(toTransform->pVertexBindingDivisors + i));
            }
        }
    }
}

void transform_tohost_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_GGP_frame_token
void transform_tohost_VkPresentFrameTokenGGP(
    ResourceTracker* resourceTracker,
    VkPresentFrameTokenGGP* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPresentFrameTokenGGP(
    ResourceTracker* resourceTracker,
    VkPresentFrameTokenGGP* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_pipeline_creation_feedback
void transform_tohost_VkPipelineCreationFeedbackEXT(
    ResourceTracker* resourceTracker,
    VkPipelineCreationFeedbackEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkPipelineCreationFeedbackEXT(
    ResourceTracker* resourceTracker,
    VkPipelineCreationFeedbackEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkPipelineCreationFeedbackCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkPipelineCreationFeedbackCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform->pPipelineCreationFeedback)
    {
        transform_tohost_VkPipelineCreationFeedbackEXT(resourceTracker, (VkPipelineCreationFeedbackEXT*)(toTransform->pPipelineCreationFeedback));
    }
    if (toTransform)
    {
        if (toTransform->pPipelineStageCreationFeedbacks)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->pipelineStageCreationFeedbackCount; ++i)
            {
                transform_tohost_VkPipelineCreationFeedbackEXT(resourceTracker, (VkPipelineCreationFeedbackEXT*)(toTransform->pPipelineStageCreationFeedbacks + i));
            }
        }
    }
}

void transform_fromhost_VkPipelineCreationFeedbackCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkPipelineCreationFeedbackCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform->pPipelineCreationFeedback)
    {
        transform_fromhost_VkPipelineCreationFeedbackEXT(resourceTracker, (VkPipelineCreationFeedbackEXT*)(toTransform->pPipelineCreationFeedback));
    }
    if (toTransform)
    {
        if (toTransform->pPipelineStageCreationFeedbacks)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->pipelineStageCreationFeedbackCount; ++i)
            {
                transform_fromhost_VkPipelineCreationFeedbackEXT(resourceTracker, (VkPipelineCreationFeedbackEXT*)(toTransform->pPipelineStageCreationFeedbacks + i));
            }
        }
    }
}

#endif
#ifdef VK_NV_shader_subgroup_partitioned
#endif
#ifdef VK_NV_compute_shader_derivatives
void transform_tohost_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_NV_mesh_shader
void transform_tohost_VkPhysicalDeviceMeshShaderFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceMeshShaderFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceMeshShaderFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceMeshShaderFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceMeshShaderPropertiesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceMeshShaderPropertiesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceMeshShaderPropertiesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceMeshShaderPropertiesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDrawMeshTasksIndirectCommandNV(
    ResourceTracker* resourceTracker,
    VkDrawMeshTasksIndirectCommandNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkDrawMeshTasksIndirectCommandNV(
    ResourceTracker* resourceTracker,
    VkDrawMeshTasksIndirectCommandNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

#endif
#ifdef VK_NV_fragment_shader_barycentric
void transform_tohost_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_NV_shader_image_footprint
void transform_tohost_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderImageFootprintFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderImageFootprintFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_NV_scissor_exclusive
void transform_tohost_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkPipelineViewportExclusiveScissorStateCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pExclusiveScissors)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->exclusiveScissorCount; ++i)
            {
                transform_tohost_VkRect2D(resourceTracker, (VkRect2D*)(toTransform->pExclusiveScissors + i));
            }
        }
    }
}

void transform_fromhost_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkPipelineViewportExclusiveScissorStateCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pExclusiveScissors)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->exclusiveScissorCount; ++i)
            {
                transform_fromhost_VkRect2D(resourceTracker, (VkRect2D*)(toTransform->pExclusiveScissors + i));
            }
        }
    }
}

void transform_tohost_VkPhysicalDeviceExclusiveScissorFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceExclusiveScissorFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceExclusiveScissorFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceExclusiveScissorFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_NV_device_diagnostic_checkpoints
void transform_tohost_VkQueueFamilyCheckpointPropertiesNV(
    ResourceTracker* resourceTracker,
    VkQueueFamilyCheckpointPropertiesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkQueueFamilyCheckpointPropertiesNV(
    ResourceTracker* resourceTracker,
    VkQueueFamilyCheckpointPropertiesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkCheckpointDataNV(
    ResourceTracker* resourceTracker,
    VkCheckpointDataNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkCheckpointDataNV(
    ResourceTracker* resourceTracker,
    VkCheckpointDataNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_INTEL_shader_integer_functions2
void transform_tohost_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_INTEL_performance_query
void transform_tohost_VkPerformanceValueDataINTEL(
    ResourceTracker* resourceTracker,
    VkPerformanceValueDataINTEL* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkPerformanceValueDataINTEL(
    ResourceTracker* resourceTracker,
    VkPerformanceValueDataINTEL* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkPerformanceValueINTEL(
    ResourceTracker* resourceTracker,
    VkPerformanceValueINTEL* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkPerformanceValueDataINTEL(resourceTracker, (VkPerformanceValueDataINTEL*)(&toTransform->data));
}

void transform_fromhost_VkPerformanceValueINTEL(
    ResourceTracker* resourceTracker,
    VkPerformanceValueINTEL* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkPerformanceValueDataINTEL(resourceTracker, (VkPerformanceValueDataINTEL*)(&toTransform->data));
}

void transform_tohost_VkInitializePerformanceApiInfoINTEL(
    ResourceTracker* resourceTracker,
    VkInitializePerformanceApiInfoINTEL* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkInitializePerformanceApiInfoINTEL(
    ResourceTracker* resourceTracker,
    VkInitializePerformanceApiInfoINTEL* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkQueryPoolPerformanceQueryCreateInfoINTEL(
    ResourceTracker* resourceTracker,
    VkQueryPoolPerformanceQueryCreateInfoINTEL* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkQueryPoolPerformanceQueryCreateInfoINTEL(
    ResourceTracker* resourceTracker,
    VkQueryPoolPerformanceQueryCreateInfoINTEL* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPerformanceMarkerInfoINTEL(
    ResourceTracker* resourceTracker,
    VkPerformanceMarkerInfoINTEL* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPerformanceMarkerInfoINTEL(
    ResourceTracker* resourceTracker,
    VkPerformanceMarkerInfoINTEL* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPerformanceStreamMarkerInfoINTEL(
    ResourceTracker* resourceTracker,
    VkPerformanceStreamMarkerInfoINTEL* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPerformanceStreamMarkerInfoINTEL(
    ResourceTracker* resourceTracker,
    VkPerformanceStreamMarkerInfoINTEL* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPerformanceOverrideInfoINTEL(
    ResourceTracker* resourceTracker,
    VkPerformanceOverrideInfoINTEL* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPerformanceOverrideInfoINTEL(
    ResourceTracker* resourceTracker,
    VkPerformanceOverrideInfoINTEL* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPerformanceConfigurationAcquireInfoINTEL(
    ResourceTracker* resourceTracker,
    VkPerformanceConfigurationAcquireInfoINTEL* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPerformanceConfigurationAcquireInfoINTEL(
    ResourceTracker* resourceTracker,
    VkPerformanceConfigurationAcquireInfoINTEL* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_pci_bus_info
void transform_tohost_VkPhysicalDevicePCIBusInfoPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDevicePCIBusInfoPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDevicePCIBusInfoPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDevicePCIBusInfoPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_AMD_display_native_hdr
void transform_tohost_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
    ResourceTracker* resourceTracker,
    VkDisplayNativeHdrSurfaceCapabilitiesAMD* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
    ResourceTracker* resourceTracker,
    VkDisplayNativeHdrSurfaceCapabilitiesAMD* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkSwapchainDisplayNativeHdrCreateInfoAMD(
    ResourceTracker* resourceTracker,
    VkSwapchainDisplayNativeHdrCreateInfoAMD* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkSwapchainDisplayNativeHdrCreateInfoAMD(
    ResourceTracker* resourceTracker,
    VkSwapchainDisplayNativeHdrCreateInfoAMD* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_FUCHSIA_imagepipe_surface
void transform_tohost_VkImagePipeSurfaceCreateInfoFUCHSIA(
    ResourceTracker* resourceTracker,
    VkImagePipeSurfaceCreateInfoFUCHSIA* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkImagePipeSurfaceCreateInfoFUCHSIA(
    ResourceTracker* resourceTracker,
    VkImagePipeSurfaceCreateInfoFUCHSIA* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_metal_surface
void transform_tohost_VkMetalSurfaceCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkMetalSurfaceCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkMetalSurfaceCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkMetalSurfaceCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_fragment_density_map
void transform_tohost_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->minFragmentDensityTexelSize));
    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxFragmentDensityTexelSize));
}

void transform_fromhost_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->minFragmentDensityTexelSize));
    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxFragmentDensityTexelSize));
}

void transform_tohost_VkRenderPassFragmentDensityMapCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkRenderPassFragmentDensityMapCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkAttachmentReference(resourceTracker, (VkAttachmentReference*)(&toTransform->fragmentDensityMapAttachment));
}

void transform_fromhost_VkRenderPassFragmentDensityMapCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkRenderPassFragmentDensityMapCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkAttachmentReference(resourceTracker, (VkAttachmentReference*)(&toTransform->fragmentDensityMapAttachment));
}

#endif
#ifdef VK_EXT_scalar_block_layout
#endif
#ifdef VK_GOOGLE_hlsl_functionality1
#endif
#ifdef VK_GOOGLE_decorate_string
#endif
#ifdef VK_EXT_subgroup_size_control
void transform_tohost_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_AMD_shader_core_properties2
void transform_tohost_VkPhysicalDeviceShaderCoreProperties2AMD(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderCoreProperties2AMD* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceShaderCoreProperties2AMD(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderCoreProperties2AMD* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_AMD_device_coherent_memory
void transform_tohost_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceCoherentMemoryFeaturesAMD* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceCoherentMemoryFeaturesAMD* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_shader_image_atomic_int64
void transform_tohost_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_memory_budget
void transform_tohost_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceMemoryBudgetPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceMemoryBudgetPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_memory_priority
void transform_tohost_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceMemoryPriorityFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceMemoryPriorityFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkMemoryPriorityAllocateInfoEXT(
    ResourceTracker* resourceTracker,
    VkMemoryPriorityAllocateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkMemoryPriorityAllocateInfoEXT(
    ResourceTracker* resourceTracker,
    VkMemoryPriorityAllocateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_NV_dedicated_allocation_image_aliasing
void transform_tohost_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_buffer_device_address
void transform_tohost_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkBufferDeviceAddressCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkBufferDeviceAddressCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkBufferDeviceAddressCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkBufferDeviceAddressCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_tooling_info
void transform_tohost_VkPhysicalDeviceToolPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceToolPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceToolPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceToolPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_separate_stencil_usage
#endif
#ifdef VK_EXT_validation_features
void transform_tohost_VkValidationFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkValidationFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkValidationFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkValidationFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_NV_cooperative_matrix
void transform_tohost_VkCooperativeMatrixPropertiesNV(
    ResourceTracker* resourceTracker,
    VkCooperativeMatrixPropertiesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkCooperativeMatrixPropertiesNV(
    ResourceTracker* resourceTracker,
    VkCooperativeMatrixPropertiesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceCooperativeMatrixFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceCooperativeMatrixFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceCooperativeMatrixPropertiesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceCooperativeMatrixPropertiesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_NV_coverage_reduction_mode
void transform_tohost_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceCoverageReductionModeFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceCoverageReductionModeFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPipelineCoverageReductionStateCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkPipelineCoverageReductionStateCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPipelineCoverageReductionStateCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkPipelineCoverageReductionStateCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkFramebufferMixedSamplesCombinationNV(
    ResourceTracker* resourceTracker,
    VkFramebufferMixedSamplesCombinationNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkFramebufferMixedSamplesCombinationNV(
    ResourceTracker* resourceTracker,
    VkFramebufferMixedSamplesCombinationNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_fragment_shader_interlock
void transform_tohost_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_ycbcr_image_arrays
void transform_tohost_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_full_screen_exclusive
void transform_tohost_VkSurfaceFullScreenExclusiveInfoEXT(
    ResourceTracker* resourceTracker,
    VkSurfaceFullScreenExclusiveInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkSurfaceFullScreenExclusiveInfoEXT(
    ResourceTracker* resourceTracker,
    VkSurfaceFullScreenExclusiveInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
    ResourceTracker* resourceTracker,
    VkSurfaceCapabilitiesFullScreenExclusiveEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
    ResourceTracker* resourceTracker,
    VkSurfaceCapabilitiesFullScreenExclusiveEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkSurfaceFullScreenExclusiveWin32InfoEXT(
    ResourceTracker* resourceTracker,
    VkSurfaceFullScreenExclusiveWin32InfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkSurfaceFullScreenExclusiveWin32InfoEXT(
    ResourceTracker* resourceTracker,
    VkSurfaceFullScreenExclusiveWin32InfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_headless_surface
void transform_tohost_VkHeadlessSurfaceCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkHeadlessSurfaceCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkHeadlessSurfaceCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkHeadlessSurfaceCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_line_rasterization
void transform_tohost_VkPhysicalDeviceLineRasterizationFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceLineRasterizationFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceLineRasterizationFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceLineRasterizationFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceLineRasterizationPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceLineRasterizationPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceLineRasterizationPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceLineRasterizationPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPipelineRasterizationLineStateCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkPipelineRasterizationLineStateCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPipelineRasterizationLineStateCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkPipelineRasterizationLineStateCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_shader_atomic_float
void transform_tohost_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_host_query_reset
#endif
#ifdef VK_EXT_index_type_uint8
void transform_tohost_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceIndexTypeUint8FeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceIndexTypeUint8FeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_extended_dynamic_state
void transform_tohost_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_shader_demote_to_helper_invocation
void transform_tohost_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_NV_device_generated_commands
void transform_tohost_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkGraphicsShaderGroupCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkGraphicsShaderGroupCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pStages)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->stageCount; ++i)
            {
                transform_tohost_VkPipelineShaderStageCreateInfo(resourceTracker, (VkPipelineShaderStageCreateInfo*)(toTransform->pStages + i));
            }
        }
    }
    if (toTransform->pVertexInputState)
    {
        transform_tohost_VkPipelineVertexInputStateCreateInfo(resourceTracker, (VkPipelineVertexInputStateCreateInfo*)(toTransform->pVertexInputState));
    }
    if (toTransform->pTessellationState)
    {
        transform_tohost_VkPipelineTessellationStateCreateInfo(resourceTracker, (VkPipelineTessellationStateCreateInfo*)(toTransform->pTessellationState));
    }
}

void transform_fromhost_VkGraphicsShaderGroupCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkGraphicsShaderGroupCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pStages)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->stageCount; ++i)
            {
                transform_fromhost_VkPipelineShaderStageCreateInfo(resourceTracker, (VkPipelineShaderStageCreateInfo*)(toTransform->pStages + i));
            }
        }
    }
    if (toTransform->pVertexInputState)
    {
        transform_fromhost_VkPipelineVertexInputStateCreateInfo(resourceTracker, (VkPipelineVertexInputStateCreateInfo*)(toTransform->pVertexInputState));
    }
    if (toTransform->pTessellationState)
    {
        transform_fromhost_VkPipelineTessellationStateCreateInfo(resourceTracker, (VkPipelineTessellationStateCreateInfo*)(toTransform->pTessellationState));
    }
}

void transform_tohost_VkGraphicsPipelineShaderGroupsCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkGraphicsPipelineShaderGroupsCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pGroups)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->groupCount; ++i)
            {
                transform_tohost_VkGraphicsShaderGroupCreateInfoNV(resourceTracker, (VkGraphicsShaderGroupCreateInfoNV*)(toTransform->pGroups + i));
            }
        }
    }
}

void transform_fromhost_VkGraphicsPipelineShaderGroupsCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkGraphicsPipelineShaderGroupsCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pGroups)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->groupCount; ++i)
            {
                transform_fromhost_VkGraphicsShaderGroupCreateInfoNV(resourceTracker, (VkGraphicsShaderGroupCreateInfoNV*)(toTransform->pGroups + i));
            }
        }
    }
}

void transform_tohost_VkBindShaderGroupIndirectCommandNV(
    ResourceTracker* resourceTracker,
    VkBindShaderGroupIndirectCommandNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkBindShaderGroupIndirectCommandNV(
    ResourceTracker* resourceTracker,
    VkBindShaderGroupIndirectCommandNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkBindIndexBufferIndirectCommandNV(
    ResourceTracker* resourceTracker,
    VkBindIndexBufferIndirectCommandNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkBindIndexBufferIndirectCommandNV(
    ResourceTracker* resourceTracker,
    VkBindIndexBufferIndirectCommandNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkBindVertexBufferIndirectCommandNV(
    ResourceTracker* resourceTracker,
    VkBindVertexBufferIndirectCommandNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkBindVertexBufferIndirectCommandNV(
    ResourceTracker* resourceTracker,
    VkBindVertexBufferIndirectCommandNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkSetStateFlagsIndirectCommandNV(
    ResourceTracker* resourceTracker,
    VkSetStateFlagsIndirectCommandNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkSetStateFlagsIndirectCommandNV(
    ResourceTracker* resourceTracker,
    VkSetStateFlagsIndirectCommandNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkIndirectCommandsStreamNV(
    ResourceTracker* resourceTracker,
    VkIndirectCommandsStreamNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkIndirectCommandsStreamNV(
    ResourceTracker* resourceTracker,
    VkIndirectCommandsStreamNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkIndirectCommandsLayoutTokenNV(
    ResourceTracker* resourceTracker,
    VkIndirectCommandsLayoutTokenNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkIndirectCommandsLayoutTokenNV(
    ResourceTracker* resourceTracker,
    VkIndirectCommandsLayoutTokenNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkIndirectCommandsLayoutCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkIndirectCommandsLayoutCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pTokens)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->tokenCount; ++i)
            {
                transform_tohost_VkIndirectCommandsLayoutTokenNV(resourceTracker, (VkIndirectCommandsLayoutTokenNV*)(toTransform->pTokens + i));
            }
        }
    }
}

void transform_fromhost_VkIndirectCommandsLayoutCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkIndirectCommandsLayoutCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pTokens)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->tokenCount; ++i)
            {
                transform_fromhost_VkIndirectCommandsLayoutTokenNV(resourceTracker, (VkIndirectCommandsLayoutTokenNV*)(toTransform->pTokens + i));
            }
        }
    }
}

void transform_tohost_VkGeneratedCommandsInfoNV(
    ResourceTracker* resourceTracker,
    VkGeneratedCommandsInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pStreams)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->streamCount; ++i)
            {
                transform_tohost_VkIndirectCommandsStreamNV(resourceTracker, (VkIndirectCommandsStreamNV*)(toTransform->pStreams + i));
            }
        }
    }
}

void transform_fromhost_VkGeneratedCommandsInfoNV(
    ResourceTracker* resourceTracker,
    VkGeneratedCommandsInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pStreams)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->streamCount; ++i)
            {
                transform_fromhost_VkIndirectCommandsStreamNV(resourceTracker, (VkIndirectCommandsStreamNV*)(toTransform->pStreams + i));
            }
        }
    }
}

void transform_tohost_VkGeneratedCommandsMemoryRequirementsInfoNV(
    ResourceTracker* resourceTracker,
    VkGeneratedCommandsMemoryRequirementsInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkGeneratedCommandsMemoryRequirementsInfoNV(
    ResourceTracker* resourceTracker,
    VkGeneratedCommandsMemoryRequirementsInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_texel_buffer_alignment
void transform_tohost_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_QCOM_render_pass_transform
void transform_tohost_VkRenderPassTransformBeginInfoQCOM(
    ResourceTracker* resourceTracker,
    VkRenderPassTransformBeginInfoQCOM* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkRenderPassTransformBeginInfoQCOM(
    ResourceTracker* resourceTracker,
    VkRenderPassTransformBeginInfoQCOM* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
    ResourceTracker* resourceTracker,
    VkCommandBufferInheritanceRenderPassTransformInfoQCOM* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkRect2D(resourceTracker, (VkRect2D*)(&toTransform->renderArea));
}

void transform_fromhost_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
    ResourceTracker* resourceTracker,
    VkCommandBufferInheritanceRenderPassTransformInfoQCOM* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkRect2D(resourceTracker, (VkRect2D*)(&toTransform->renderArea));
}

#endif
#ifdef VK_EXT_device_memory_report
void transform_tohost_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDeviceMemoryReportCallbackDataEXT(
    ResourceTracker* resourceTracker,
    VkDeviceMemoryReportCallbackDataEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDeviceMemoryReportCallbackDataEXT(
    ResourceTracker* resourceTracker,
    VkDeviceMemoryReportCallbackDataEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDeviceDeviceMemoryReportCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkDeviceDeviceMemoryReportCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDeviceDeviceMemoryReportCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkDeviceDeviceMemoryReportCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_robustness2
void transform_tohost_VkPhysicalDeviceRobustness2FeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceRobustness2FeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceRobustness2FeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceRobustness2FeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceRobustness2PropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceRobustness2PropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceRobustness2PropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceRobustness2PropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_custom_border_color
void transform_tohost_VkSamplerCustomBorderColorCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkSamplerCustomBorderColorCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkClearColorValue(resourceTracker, (VkClearColorValue*)(&toTransform->customBorderColor));
}

void transform_fromhost_VkSamplerCustomBorderColorCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkSamplerCustomBorderColorCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkClearColorValue(resourceTracker, (VkClearColorValue*)(&toTransform->customBorderColor));
}

void transform_tohost_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceCustomBorderColorPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceCustomBorderColorPropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceCustomBorderColorFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceCustomBorderColorFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_GOOGLE_user_type
#endif
#ifdef VK_EXT_private_data
void transform_tohost_VkPhysicalDevicePrivateDataFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDevicePrivateDataFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDevicePrivateDataFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDevicePrivateDataFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDevicePrivateDataCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkDevicePrivateDataCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDevicePrivateDataCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkDevicePrivateDataCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPrivateDataSlotCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkPrivateDataSlotCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPrivateDataSlotCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkPrivateDataSlotCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_pipeline_creation_cache_control
void transform_tohost_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_NV_device_diagnostics_config
void transform_tohost_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceDiagnosticsConfigFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceDiagnosticsConfigFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkDeviceDiagnosticsConfigCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkDeviceDiagnosticsConfigCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDeviceDiagnosticsConfigCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkDeviceDiagnosticsConfigCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_QCOM_render_pass_store_ops
#endif
#ifdef VK_NV_fragment_shading_rate_enums
void transform_tohost_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkPipelineFragmentShadingRateEnumStateCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
    ResourceTracker* resourceTracker,
    VkPipelineFragmentShadingRateEnumStateCreateInfoNV* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_fragment_density_map2
void transform_tohost_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_QCOM_rotated_copy_commands
void transform_tohost_VkCopyCommandTransformInfoQCOM(
    ResourceTracker* resourceTracker,
    VkCopyCommandTransformInfoQCOM* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkCopyCommandTransformInfoQCOM(
    ResourceTracker* resourceTracker,
    VkCopyCommandTransformInfoQCOM* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_image_robustness
void transform_tohost_VkPhysicalDeviceImageRobustnessFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceImageRobustnessFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceImageRobustnessFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceImageRobustnessFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_4444_formats
void transform_tohost_VkPhysicalDevice4444FormatsFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDevice4444FormatsFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDevice4444FormatsFeaturesEXT(
    ResourceTracker* resourceTracker,
    VkPhysicalDevice4444FormatsFeaturesEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_EXT_directfb_surface
void transform_tohost_VkDirectFBSurfaceCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkDirectFBSurfaceCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkDirectFBSurfaceCreateInfoEXT(
    ResourceTracker* resourceTracker,
    VkDirectFBSurfaceCreateInfoEXT* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#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(
    ResourceTracker* resourceTracker,
    VkDeviceOrHostAddressKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkDeviceOrHostAddressKHR(
    ResourceTracker* resourceTracker,
    VkDeviceOrHostAddressKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkDeviceOrHostAddressConstKHR(
    ResourceTracker* resourceTracker,
    VkDeviceOrHostAddressConstKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkDeviceOrHostAddressConstKHR(
    ResourceTracker* resourceTracker,
    VkDeviceOrHostAddressConstKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkAccelerationStructureBuildRangeInfoKHR(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureBuildRangeInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkAccelerationStructureBuildRangeInfoKHR(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureBuildRangeInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkAccelerationStructureGeometryTrianglesDataKHR(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureGeometryTrianglesDataKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkDeviceOrHostAddressConstKHR(resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->vertexData));
    transform_tohost_VkDeviceOrHostAddressConstKHR(resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->indexData));
    transform_tohost_VkDeviceOrHostAddressConstKHR(resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->transformData));
}

void transform_fromhost_VkAccelerationStructureGeometryTrianglesDataKHR(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureGeometryTrianglesDataKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkDeviceOrHostAddressConstKHR(resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->vertexData));
    transform_fromhost_VkDeviceOrHostAddressConstKHR(resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->indexData));
    transform_fromhost_VkDeviceOrHostAddressConstKHR(resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->transformData));
}

void transform_tohost_VkAccelerationStructureGeometryAabbsDataKHR(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureGeometryAabbsDataKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkDeviceOrHostAddressConstKHR(resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->data));
}

void transform_fromhost_VkAccelerationStructureGeometryAabbsDataKHR(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureGeometryAabbsDataKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkDeviceOrHostAddressConstKHR(resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->data));
}

void transform_tohost_VkAccelerationStructureGeometryInstancesDataKHR(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureGeometryInstancesDataKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkDeviceOrHostAddressConstKHR(resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->data));
}

void transform_fromhost_VkAccelerationStructureGeometryInstancesDataKHR(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureGeometryInstancesDataKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkDeviceOrHostAddressConstKHR(resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->data));
}

void transform_tohost_VkAccelerationStructureGeometryDataKHR(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureGeometryDataKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_tohost_VkAccelerationStructureGeometryTrianglesDataKHR(resourceTracker, (VkAccelerationStructureGeometryTrianglesDataKHR*)(&toTransform->triangles));
    transform_tohost_VkAccelerationStructureGeometryAabbsDataKHR(resourceTracker, (VkAccelerationStructureGeometryAabbsDataKHR*)(&toTransform->aabbs));
    transform_tohost_VkAccelerationStructureGeometryInstancesDataKHR(resourceTracker, (VkAccelerationStructureGeometryInstancesDataKHR*)(&toTransform->instances));
}

void transform_fromhost_VkAccelerationStructureGeometryDataKHR(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureGeometryDataKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    transform_fromhost_VkAccelerationStructureGeometryTrianglesDataKHR(resourceTracker, (VkAccelerationStructureGeometryTrianglesDataKHR*)(&toTransform->triangles));
    transform_fromhost_VkAccelerationStructureGeometryAabbsDataKHR(resourceTracker, (VkAccelerationStructureGeometryAabbsDataKHR*)(&toTransform->aabbs));
    transform_fromhost_VkAccelerationStructureGeometryInstancesDataKHR(resourceTracker, (VkAccelerationStructureGeometryInstancesDataKHR*)(&toTransform->instances));
}

void transform_tohost_VkAccelerationStructureGeometryKHR(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureGeometryKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkAccelerationStructureGeometryDataKHR(resourceTracker, (VkAccelerationStructureGeometryDataKHR*)(&toTransform->geometry));
}

void transform_fromhost_VkAccelerationStructureGeometryKHR(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureGeometryKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkAccelerationStructureGeometryDataKHR(resourceTracker, (VkAccelerationStructureGeometryDataKHR*)(&toTransform->geometry));
}

void transform_tohost_VkAccelerationStructureBuildGeometryInfoKHR(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureBuildGeometryInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pGeometries)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->geometryCount; ++i)
            {
                transform_tohost_VkAccelerationStructureGeometryKHR(resourceTracker, (VkAccelerationStructureGeometryKHR*)(toTransform->pGeometries + i));
            }
        }
    }
    transform_tohost_VkDeviceOrHostAddressKHR(resourceTracker, (VkDeviceOrHostAddressKHR*)(&toTransform->scratchData));
}

void transform_fromhost_VkAccelerationStructureBuildGeometryInfoKHR(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureBuildGeometryInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pGeometries)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->geometryCount; ++i)
            {
                transform_fromhost_VkAccelerationStructureGeometryKHR(resourceTracker, (VkAccelerationStructureGeometryKHR*)(toTransform->pGeometries + i));
            }
        }
    }
    transform_fromhost_VkDeviceOrHostAddressKHR(resourceTracker, (VkDeviceOrHostAddressKHR*)(&toTransform->scratchData));
}

void transform_tohost_VkAccelerationStructureCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkAccelerationStructureCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkWriteDescriptorSetAccelerationStructureKHR(
    ResourceTracker* resourceTracker,
    VkWriteDescriptorSetAccelerationStructureKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkWriteDescriptorSetAccelerationStructureKHR(
    ResourceTracker* resourceTracker,
    VkWriteDescriptorSetAccelerationStructureKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceAccelerationStructureFeaturesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceAccelerationStructureFeaturesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceAccelerationStructurePropertiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceAccelerationStructurePropertiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkAccelerationStructureDeviceAddressInfoKHR(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureDeviceAddressInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkAccelerationStructureDeviceAddressInfoKHR(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureDeviceAddressInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkAccelerationStructureVersionInfoKHR(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureVersionInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkAccelerationStructureVersionInfoKHR(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureVersionInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkCopyAccelerationStructureToMemoryInfoKHR(
    ResourceTracker* resourceTracker,
    VkCopyAccelerationStructureToMemoryInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkDeviceOrHostAddressKHR(resourceTracker, (VkDeviceOrHostAddressKHR*)(&toTransform->dst));
}

void transform_fromhost_VkCopyAccelerationStructureToMemoryInfoKHR(
    ResourceTracker* resourceTracker,
    VkCopyAccelerationStructureToMemoryInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkDeviceOrHostAddressKHR(resourceTracker, (VkDeviceOrHostAddressKHR*)(&toTransform->dst));
}

void transform_tohost_VkCopyMemoryToAccelerationStructureInfoKHR(
    ResourceTracker* resourceTracker,
    VkCopyMemoryToAccelerationStructureInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_tohost_VkDeviceOrHostAddressConstKHR(resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->src));
}

void transform_fromhost_VkCopyMemoryToAccelerationStructureInfoKHR(
    ResourceTracker* resourceTracker,
    VkCopyMemoryToAccelerationStructureInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    transform_fromhost_VkDeviceOrHostAddressConstKHR(resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->src));
}

void transform_tohost_VkCopyAccelerationStructureInfoKHR(
    ResourceTracker* resourceTracker,
    VkCopyAccelerationStructureInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkCopyAccelerationStructureInfoKHR(
    ResourceTracker* resourceTracker,
    VkCopyAccelerationStructureInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkAccelerationStructureBuildSizesInfoKHR(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureBuildSizesInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkAccelerationStructureBuildSizesInfoKHR(
    ResourceTracker* resourceTracker,
    VkAccelerationStructureBuildSizesInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
#ifdef VK_KHR_ray_tracing_pipeline
void transform_tohost_VkRayTracingShaderGroupCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkRayTracingShaderGroupCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkRayTracingShaderGroupCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkRayTracingShaderGroupCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkRayTracingPipelineInterfaceCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkRayTracingPipelineInterfaceCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkRayTracingPipelineInterfaceCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkRayTracingPipelineInterfaceCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkRayTracingPipelineCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkRayTracingPipelineCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pStages)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->stageCount; ++i)
            {
                transform_tohost_VkPipelineShaderStageCreateInfo(resourceTracker, (VkPipelineShaderStageCreateInfo*)(toTransform->pStages + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pGroups)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->groupCount; ++i)
            {
                transform_tohost_VkRayTracingShaderGroupCreateInfoKHR(resourceTracker, (VkRayTracingShaderGroupCreateInfoKHR*)(toTransform->pGroups + i));
            }
        }
    }
    if (toTransform->pLibraryInfo)
    {
        transform_tohost_VkPipelineLibraryCreateInfoKHR(resourceTracker, (VkPipelineLibraryCreateInfoKHR*)(toTransform->pLibraryInfo));
    }
    if (toTransform->pLibraryInterface)
    {
        transform_tohost_VkRayTracingPipelineInterfaceCreateInfoKHR(resourceTracker, (VkRayTracingPipelineInterfaceCreateInfoKHR*)(toTransform->pLibraryInterface));
    }
    if (toTransform->pDynamicState)
    {
        transform_tohost_VkPipelineDynamicStateCreateInfo(resourceTracker, (VkPipelineDynamicStateCreateInfo*)(toTransform->pDynamicState));
    }
}

void transform_fromhost_VkRayTracingPipelineCreateInfoKHR(
    ResourceTracker* resourceTracker,
    VkRayTracingPipelineCreateInfoKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
    if (toTransform)
    {
        if (toTransform->pStages)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->stageCount; ++i)
            {
                transform_fromhost_VkPipelineShaderStageCreateInfo(resourceTracker, (VkPipelineShaderStageCreateInfo*)(toTransform->pStages + i));
            }
        }
    }
    if (toTransform)
    {
        if (toTransform->pGroups)
        {
            for (uint32_t i = 0; i < (uint32_t)toTransform->groupCount; ++i)
            {
                transform_fromhost_VkRayTracingShaderGroupCreateInfoKHR(resourceTracker, (VkRayTracingShaderGroupCreateInfoKHR*)(toTransform->pGroups + i));
            }
        }
    }
    if (toTransform->pLibraryInfo)
    {
        transform_fromhost_VkPipelineLibraryCreateInfoKHR(resourceTracker, (VkPipelineLibraryCreateInfoKHR*)(toTransform->pLibraryInfo));
    }
    if (toTransform->pLibraryInterface)
    {
        transform_fromhost_VkRayTracingPipelineInterfaceCreateInfoKHR(resourceTracker, (VkRayTracingPipelineInterfaceCreateInfoKHR*)(toTransform->pLibraryInterface));
    }
    if (toTransform->pDynamicState)
    {
        transform_fromhost_VkPipelineDynamicStateCreateInfo(resourceTracker, (VkPipelineDynamicStateCreateInfo*)(toTransform->pDynamicState));
    }
}

void transform_tohost_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceRayTracingPipelineFeaturesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceRayTracingPipelineFeaturesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceRayTracingPipelinePropertiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceRayTracingPipelinePropertiesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_tohost_VkStridedDeviceAddressRegionKHR(
    ResourceTracker* resourceTracker,
    VkStridedDeviceAddressRegionKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkStridedDeviceAddressRegionKHR(
    ResourceTracker* resourceTracker,
    VkStridedDeviceAddressRegionKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_tohost_VkTraceRaysIndirectCommandKHR(
    ResourceTracker* resourceTracker,
    VkTraceRaysIndirectCommandKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

void transform_fromhost_VkTraceRaysIndirectCommandKHR(
    ResourceTracker* resourceTracker,
    VkTraceRaysIndirectCommandKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
}

#endif
#ifdef VK_KHR_ray_query
void transform_tohost_VkPhysicalDeviceRayQueryFeaturesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceRayQueryFeaturesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

void transform_fromhost_VkPhysicalDeviceRayQueryFeaturesKHR(
    ResourceTracker* resourceTracker,
    VkPhysicalDeviceRayQueryFeaturesKHR* toTransform)
{
    (void)resourceTracker;
    (void)toTransform;
    if (toTransform->pNext)
    {
        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
    }
}

#endif
void transform_tohost_extension_struct(
    ResourceTracker* resourceTracker,
    void* structExtension_out)
{
    if (!structExtension_out)
    {
        return;
    }
    uint32_t structType = (uint32_t)goldfish_vk_struct_type(structExtension_out);
    switch(structType)
    {
#ifdef VK_VERSION_1_1
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES:
        {
            transform_tohost_VkPhysicalDeviceSubgroupProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceSubgroupProperties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES:
        {
            transform_tohost_VkPhysicalDevice16BitStorageFeatures(resourceTracker, reinterpret_cast<VkPhysicalDevice16BitStorageFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS:
        {
            transform_tohost_VkMemoryDedicatedRequirements(resourceTracker, reinterpret_cast<VkMemoryDedicatedRequirements*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO:
        {
            transform_tohost_VkMemoryDedicatedAllocateInfo(resourceTracker, reinterpret_cast<VkMemoryDedicatedAllocateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO:
        {
            transform_tohost_VkMemoryAllocateFlagsInfo(resourceTracker, reinterpret_cast<VkMemoryAllocateFlagsInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO:
        {
            transform_tohost_VkDeviceGroupRenderPassBeginInfo(resourceTracker, reinterpret_cast<VkDeviceGroupRenderPassBeginInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO:
        {
            transform_tohost_VkDeviceGroupCommandBufferBeginInfo(resourceTracker, reinterpret_cast<VkDeviceGroupCommandBufferBeginInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO:
        {
            transform_tohost_VkDeviceGroupSubmitInfo(resourceTracker, reinterpret_cast<VkDeviceGroupSubmitInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO:
        {
            transform_tohost_VkDeviceGroupBindSparseInfo(resourceTracker, reinterpret_cast<VkDeviceGroupBindSparseInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO:
        {
            transform_tohost_VkBindBufferMemoryDeviceGroupInfo(resourceTracker, reinterpret_cast<VkBindBufferMemoryDeviceGroupInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO:
        {
            transform_tohost_VkBindImageMemoryDeviceGroupInfo(resourceTracker, reinterpret_cast<VkBindImageMemoryDeviceGroupInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO:
        {
            transform_tohost_VkDeviceGroupDeviceCreateInfo(resourceTracker, reinterpret_cast<VkDeviceGroupDeviceCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
        {
            transform_tohost_VkPhysicalDeviceFeatures2(resourceTracker, reinterpret_cast<VkPhysicalDeviceFeatures2*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES:
        {
            transform_tohost_VkPhysicalDevicePointClippingProperties(resourceTracker, reinterpret_cast<VkPhysicalDevicePointClippingProperties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO:
        {
            transform_tohost_VkRenderPassInputAttachmentAspectCreateInfo(resourceTracker, reinterpret_cast<VkRenderPassInputAttachmentAspectCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO:
        {
            transform_tohost_VkImageViewUsageCreateInfo(resourceTracker, reinterpret_cast<VkImageViewUsageCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO:
        {
            transform_tohost_VkPipelineTessellationDomainOriginStateCreateInfo(resourceTracker, reinterpret_cast<VkPipelineTessellationDomainOriginStateCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO:
        {
            transform_tohost_VkRenderPassMultiviewCreateInfo(resourceTracker, reinterpret_cast<VkRenderPassMultiviewCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES:
        {
            transform_tohost_VkPhysicalDeviceMultiviewFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceMultiviewFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES:
        {
            transform_tohost_VkPhysicalDeviceMultiviewProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceMultiviewProperties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES:
        {
            transform_tohost_VkPhysicalDeviceVariablePointersFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceVariablePointersFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES:
        {
            transform_tohost_VkPhysicalDeviceProtectedMemoryFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES:
        {
            transform_tohost_VkPhysicalDeviceProtectedMemoryProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceProtectedMemoryProperties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO:
        {
            transform_tohost_VkProtectedSubmitInfo(resourceTracker, reinterpret_cast<VkProtectedSubmitInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO:
        {
            transform_tohost_VkSamplerYcbcrConversionInfo(resourceTracker, reinterpret_cast<VkSamplerYcbcrConversionInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO:
        {
            transform_tohost_VkBindImagePlaneMemoryInfo(resourceTracker, reinterpret_cast<VkBindImagePlaneMemoryInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO:
        {
            transform_tohost_VkImagePlaneMemoryRequirementsInfo(resourceTracker, reinterpret_cast<VkImagePlaneMemoryRequirementsInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES:
        {
            transform_tohost_VkPhysicalDeviceSamplerYcbcrConversionFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES:
        {
            transform_tohost_VkSamplerYcbcrConversionImageFormatProperties(resourceTracker, reinterpret_cast<VkSamplerYcbcrConversionImageFormatProperties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO:
        {
            resourceTracker->transformImpl_VkPhysicalDeviceExternalImageFormatInfo_tohost(reinterpret_cast<VkPhysicalDeviceExternalImageFormatInfo*>(structExtension_out), 1);
            transform_tohost_VkPhysicalDeviceExternalImageFormatInfo(resourceTracker, reinterpret_cast<VkPhysicalDeviceExternalImageFormatInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES:
        {
            resourceTracker->transformImpl_VkExternalImageFormatProperties_tohost(reinterpret_cast<VkExternalImageFormatProperties*>(structExtension_out), 1);
            transform_tohost_VkExternalImageFormatProperties(resourceTracker, reinterpret_cast<VkExternalImageFormatProperties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES:
        {
            transform_tohost_VkPhysicalDeviceIDProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceIDProperties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO:
        {
            resourceTracker->transformImpl_VkExternalMemoryImageCreateInfo_tohost(reinterpret_cast<VkExternalMemoryImageCreateInfo*>(structExtension_out), 1);
            transform_tohost_VkExternalMemoryImageCreateInfo(resourceTracker, reinterpret_cast<VkExternalMemoryImageCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO:
        {
            resourceTracker->transformImpl_VkExternalMemoryBufferCreateInfo_tohost(reinterpret_cast<VkExternalMemoryBufferCreateInfo*>(structExtension_out), 1);
            transform_tohost_VkExternalMemoryBufferCreateInfo(resourceTracker, reinterpret_cast<VkExternalMemoryBufferCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO:
        {
            resourceTracker->transformImpl_VkExportMemoryAllocateInfo_tohost(reinterpret_cast<VkExportMemoryAllocateInfo*>(structExtension_out), 1);
            transform_tohost_VkExportMemoryAllocateInfo(resourceTracker, reinterpret_cast<VkExportMemoryAllocateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO:
        {
            transform_tohost_VkExportFenceCreateInfo(resourceTracker, reinterpret_cast<VkExportFenceCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO:
        {
            transform_tohost_VkExportSemaphoreCreateInfo(resourceTracker, reinterpret_cast<VkExportSemaphoreCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES:
        {
            transform_tohost_VkPhysicalDeviceMaintenance3Properties(resourceTracker, reinterpret_cast<VkPhysicalDeviceMaintenance3Properties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES:
        {
            transform_tohost_VkPhysicalDeviceShaderDrawParametersFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderDrawParametersFeatures*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_VERSION_1_2
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES:
        {
            transform_tohost_VkPhysicalDeviceVulkan11Features(resourceTracker, reinterpret_cast<VkPhysicalDeviceVulkan11Features*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES:
        {
            transform_tohost_VkPhysicalDeviceVulkan11Properties(resourceTracker, reinterpret_cast<VkPhysicalDeviceVulkan11Properties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES:
        {
            transform_tohost_VkPhysicalDeviceVulkan12Features(resourceTracker, reinterpret_cast<VkPhysicalDeviceVulkan12Features*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES:
        {
            transform_tohost_VkPhysicalDeviceVulkan12Properties(resourceTracker, reinterpret_cast<VkPhysicalDeviceVulkan12Properties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO:
        {
            transform_tohost_VkImageFormatListCreateInfo(resourceTracker, reinterpret_cast<VkImageFormatListCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES:
        {
            transform_tohost_VkPhysicalDevice8BitStorageFeatures(resourceTracker, reinterpret_cast<VkPhysicalDevice8BitStorageFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES:
        {
            transform_tohost_VkPhysicalDeviceDriverProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceDriverProperties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES:
        {
            transform_tohost_VkPhysicalDeviceShaderAtomicInt64Features(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES:
        {
            transform_tohost_VkPhysicalDeviceShaderFloat16Int8Features(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES:
        {
            transform_tohost_VkPhysicalDeviceFloatControlsProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceFloatControlsProperties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO:
        {
            transform_tohost_VkDescriptorSetLayoutBindingFlagsCreateInfo(resourceTracker, reinterpret_cast<VkDescriptorSetLayoutBindingFlagsCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES:
        {
            transform_tohost_VkPhysicalDeviceDescriptorIndexingFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES:
        {
            transform_tohost_VkPhysicalDeviceDescriptorIndexingProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceDescriptorIndexingProperties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO:
        {
            transform_tohost_VkDescriptorSetVariableDescriptorCountAllocateInfo(resourceTracker, reinterpret_cast<VkDescriptorSetVariableDescriptorCountAllocateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT:
        {
            transform_tohost_VkDescriptorSetVariableDescriptorCountLayoutSupport(resourceTracker, reinterpret_cast<VkDescriptorSetVariableDescriptorCountLayoutSupport*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE:
        {
            transform_tohost_VkSubpassDescriptionDepthStencilResolve(resourceTracker, reinterpret_cast<VkSubpassDescriptionDepthStencilResolve*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES:
        {
            transform_tohost_VkPhysicalDeviceDepthStencilResolveProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceDepthStencilResolveProperties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES:
        {
            transform_tohost_VkPhysicalDeviceScalarBlockLayoutFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO:
        {
            transform_tohost_VkImageStencilUsageCreateInfo(resourceTracker, reinterpret_cast<VkImageStencilUsageCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO:
        {
            transform_tohost_VkSamplerReductionModeCreateInfo(resourceTracker, reinterpret_cast<VkSamplerReductionModeCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES:
        {
            transform_tohost_VkPhysicalDeviceSamplerFilterMinmaxProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceSamplerFilterMinmaxProperties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES:
        {
            transform_tohost_VkPhysicalDeviceVulkanMemoryModelFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES:
        {
            transform_tohost_VkPhysicalDeviceImagelessFramebufferFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceImagelessFramebufferFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO:
        {
            transform_tohost_VkFramebufferAttachmentsCreateInfo(resourceTracker, reinterpret_cast<VkFramebufferAttachmentsCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO:
        {
            transform_tohost_VkRenderPassAttachmentBeginInfo(resourceTracker, reinterpret_cast<VkRenderPassAttachmentBeginInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES:
        {
            transform_tohost_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES:
        {
            transform_tohost_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES:
        {
            transform_tohost_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT:
        {
            transform_tohost_VkAttachmentReferenceStencilLayout(resourceTracker, reinterpret_cast<VkAttachmentReferenceStencilLayout*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT:
        {
            transform_tohost_VkAttachmentDescriptionStencilLayout(resourceTracker, reinterpret_cast<VkAttachmentDescriptionStencilLayout*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES:
        {
            transform_tohost_VkPhysicalDeviceHostQueryResetFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceHostQueryResetFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES:
        {
            transform_tohost_VkPhysicalDeviceTimelineSemaphoreFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES:
        {
            transform_tohost_VkPhysicalDeviceTimelineSemaphoreProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreProperties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO:
        {
            transform_tohost_VkSemaphoreTypeCreateInfo(resourceTracker, reinterpret_cast<VkSemaphoreTypeCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO:
        {
            transform_tohost_VkTimelineSemaphoreSubmitInfo(resourceTracker, reinterpret_cast<VkTimelineSemaphoreSubmitInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES:
        {
            transform_tohost_VkPhysicalDeviceBufferDeviceAddressFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO:
        {
            transform_tohost_VkBufferOpaqueCaptureAddressCreateInfo(resourceTracker, reinterpret_cast<VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO:
        {
            transform_tohost_VkMemoryOpaqueCaptureAddressAllocateInfo(resourceTracker, reinterpret_cast<VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_swapchain
        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR:
        {
            transform_tohost_VkImageSwapchainCreateInfoKHR(resourceTracker, reinterpret_cast<VkImageSwapchainCreateInfoKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR:
        {
            transform_tohost_VkBindImageMemorySwapchainInfoKHR(resourceTracker, reinterpret_cast<VkBindImageMemorySwapchainInfoKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR:
        {
            transform_tohost_VkDeviceGroupPresentInfoKHR(resourceTracker, reinterpret_cast<VkDeviceGroupPresentInfoKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR:
        {
            transform_tohost_VkDeviceGroupSwapchainCreateInfoKHR(resourceTracker, reinterpret_cast<VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_display_swapchain
        case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR:
        {
            transform_tohost_VkDisplayPresentInfoKHR(resourceTracker, reinterpret_cast<VkDisplayPresentInfoKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_external_memory_win32
        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
        {
            transform_tohost_VkImportMemoryWin32HandleInfoKHR(resourceTracker, reinterpret_cast<VkImportMemoryWin32HandleInfoKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
        {
            transform_tohost_VkExportMemoryWin32HandleInfoKHR(resourceTracker, reinterpret_cast<VkExportMemoryWin32HandleInfoKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_external_memory_fd
        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR:
        {
            transform_tohost_VkImportMemoryFdInfoKHR(resourceTracker, reinterpret_cast<VkImportMemoryFdInfoKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_win32_keyed_mutex
        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR:
        {
            transform_tohost_VkWin32KeyedMutexAcquireReleaseInfoKHR(resourceTracker, reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_external_semaphore_win32
        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR:
        {
            transform_tohost_VkExportSemaphoreWin32HandleInfoKHR(resourceTracker, reinterpret_cast<VkExportSemaphoreWin32HandleInfoKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR:
        {
            transform_tohost_VkD3D12FenceSubmitInfoKHR(resourceTracker, reinterpret_cast<VkD3D12FenceSubmitInfoKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_push_descriptor
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR:
        {
            transform_tohost_VkPhysicalDevicePushDescriptorPropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePushDescriptorPropertiesKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_incremental_present
        case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR:
        {
            transform_tohost_VkPresentRegionsKHR(resourceTracker, reinterpret_cast<VkPresentRegionsKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_shared_presentable_image
        case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR:
        {
            transform_tohost_VkSharedPresentSurfaceCapabilitiesKHR(resourceTracker, reinterpret_cast<VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_external_fence_win32
        case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR:
        {
            transform_tohost_VkExportFenceWin32HandleInfoKHR(resourceTracker, reinterpret_cast<VkExportFenceWin32HandleInfoKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_performance_query
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR:
        {
            transform_tohost_VkPhysicalDevicePerformanceQueryFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePerformanceQueryFeaturesKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR:
        {
            transform_tohost_VkPhysicalDevicePerformanceQueryPropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePerformanceQueryPropertiesKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR:
        {
            transform_tohost_VkQueryPoolPerformanceCreateInfoKHR(resourceTracker, reinterpret_cast<VkQueryPoolPerformanceCreateInfoKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR:
        {
            transform_tohost_VkPerformanceQuerySubmitInfoKHR(resourceTracker, reinterpret_cast<VkPerformanceQuerySubmitInfoKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_portability_subset
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR:
        {
            transform_tohost_VkPhysicalDevicePortabilitySubsetFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR:
        {
            transform_tohost_VkPhysicalDevicePortabilitySubsetPropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_shader_clock
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR:
        {
            transform_tohost_VkPhysicalDeviceShaderClockFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_shader_terminate_invocation
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR:
        {
            transform_tohost_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_fragment_shading_rate
        case VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR:
        {
            transform_tohost_VkFragmentShadingRateAttachmentInfoKHR(resourceTracker, reinterpret_cast<VkFragmentShadingRateAttachmentInfoKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR:
        {
            transform_tohost_VkPipelineFragmentShadingRateStateCreateInfoKHR(resourceTracker, reinterpret_cast<VkPipelineFragmentShadingRateStateCreateInfoKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR:
        {
            transform_tohost_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR:
        {
            transform_tohost_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_surface_protected_capabilities
        case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR:
        {
            transform_tohost_VkSurfaceProtectedCapabilitiesKHR(resourceTracker, reinterpret_cast<VkSurfaceProtectedCapabilitiesKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_pipeline_executable_properties
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR:
        {
            transform_tohost_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_ANDROID_native_buffer
        case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID:
        {
            transform_tohost_VkNativeBufferANDROID(resourceTracker, reinterpret_cast<VkNativeBufferANDROID*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_debug_report
        case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT:
        {
            transform_tohost_VkDebugReportCallbackCreateInfoEXT(resourceTracker, reinterpret_cast<VkDebugReportCallbackCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_AMD_rasterization_order
        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD:
        {
            transform_tohost_VkPipelineRasterizationStateRasterizationOrderAMD(resourceTracker, reinterpret_cast<VkPipelineRasterizationStateRasterizationOrderAMD*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_dedicated_allocation
        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV:
        {
            transform_tohost_VkDedicatedAllocationImageCreateInfoNV(resourceTracker, reinterpret_cast<VkDedicatedAllocationImageCreateInfoNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV:
        {
            transform_tohost_VkDedicatedAllocationBufferCreateInfoNV(resourceTracker, reinterpret_cast<VkDedicatedAllocationBufferCreateInfoNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV:
        {
            transform_tohost_VkDedicatedAllocationMemoryAllocateInfoNV(resourceTracker, reinterpret_cast<VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_transform_feedback
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDeviceTransformFeedbackFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT:
        {
            transform_tohost_VkPhysicalDeviceTransformFeedbackPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT:
        {
            transform_tohost_VkPipelineRasterizationStateStreamCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineRasterizationStateStreamCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_AMD_texture_gather_bias_lod
        case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD:
        {
            transform_tohost_VkTextureLODGatherFormatPropertiesAMD(resourceTracker, reinterpret_cast<VkTextureLODGatherFormatPropertiesAMD*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_corner_sampled_image
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV:
        {
            transform_tohost_VkPhysicalDeviceCornerSampledImageFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceCornerSampledImageFeaturesNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_external_memory
        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV:
        {
            transform_tohost_VkExternalMemoryImageCreateInfoNV(resourceTracker, reinterpret_cast<VkExternalMemoryImageCreateInfoNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV:
        {
            transform_tohost_VkExportMemoryAllocateInfoNV(resourceTracker, reinterpret_cast<VkExportMemoryAllocateInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_external_memory_win32
        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV:
        {
            transform_tohost_VkImportMemoryWin32HandleInfoNV(resourceTracker, reinterpret_cast<VkImportMemoryWin32HandleInfoNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV:
        {
            transform_tohost_VkExportMemoryWin32HandleInfoNV(resourceTracker, reinterpret_cast<VkExportMemoryWin32HandleInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_win32_keyed_mutex
        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV:
        {
            transform_tohost_VkWin32KeyedMutexAcquireReleaseInfoNV(resourceTracker, reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_validation_flags
        case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT:
        {
            transform_tohost_VkValidationFlagsEXT(resourceTracker, reinterpret_cast<VkValidationFlagsEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_texture_compression_astc_hdr
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_astc_decode_mode
        case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT:
        {
            transform_tohost_VkImageViewASTCDecodeModeEXT(resourceTracker, reinterpret_cast<VkImageViewASTCDecodeModeEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDeviceASTCDecodeFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_conditional_rendering
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDeviceConditionalRenderingFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT:
        {
            transform_tohost_VkCommandBufferInheritanceConditionalRenderingInfoEXT(resourceTracker, reinterpret_cast<VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_clip_space_w_scaling
        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV:
        {
            transform_tohost_VkPipelineViewportWScalingStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineViewportWScalingStateCreateInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_display_control
        case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT:
        {
            transform_tohost_VkSwapchainCounterCreateInfoEXT(resourceTracker, reinterpret_cast<VkSwapchainCounterCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_GOOGLE_display_timing
        case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE:
        {
            transform_tohost_VkPresentTimesInfoGOOGLE(resourceTracker, reinterpret_cast<VkPresentTimesInfoGOOGLE*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NVX_multiview_per_view_attributes
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX:
        {
            transform_tohost_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(resourceTracker, reinterpret_cast<VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_viewport_swizzle
        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV:
        {
            transform_tohost_VkPipelineViewportSwizzleStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_discard_rectangles
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT:
        {
            transform_tohost_VkPhysicalDeviceDiscardRectanglePropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT:
        {
            transform_tohost_VkPipelineDiscardRectangleStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineDiscardRectangleStateCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_conservative_rasterization
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT:
        {
            transform_tohost_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT:
        {
            transform_tohost_VkPipelineRasterizationConservativeStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineRasterizationConservativeStateCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_depth_clip_enable
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDeviceDepthClipEnableFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT:
        {
            transform_tohost_VkPipelineRasterizationDepthClipStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_debug_utils
        case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT:
        {
            transform_tohost_VkDebugUtilsMessengerCreateInfoEXT(resourceTracker, reinterpret_cast<VkDebugUtilsMessengerCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_ANDROID_external_memory_android_hardware_buffer
        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID:
        {
            transform_tohost_VkAndroidHardwareBufferUsageANDROID(resourceTracker, reinterpret_cast<VkAndroidHardwareBufferUsageANDROID*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID:
        {
            transform_tohost_VkAndroidHardwareBufferFormatPropertiesANDROID(resourceTracker, reinterpret_cast<VkAndroidHardwareBufferFormatPropertiesANDROID*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID:
        {
            transform_tohost_VkImportAndroidHardwareBufferInfoANDROID(resourceTracker, reinterpret_cast<VkImportAndroidHardwareBufferInfoANDROID*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID:
        {
            transform_tohost_VkExternalFormatANDROID(resourceTracker, reinterpret_cast<VkExternalFormatANDROID*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_inline_uniform_block
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT:
        {
            transform_tohost_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT:
        {
            transform_tohost_VkWriteDescriptorSetInlineUniformBlockEXT(resourceTracker, reinterpret_cast<VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT:
        {
            transform_tohost_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(resourceTracker, reinterpret_cast<VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_sample_locations
        case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT:
        {
            transform_tohost_VkSampleLocationsInfoEXT(resourceTracker, reinterpret_cast<VkSampleLocationsInfoEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT:
        {
            transform_tohost_VkRenderPassSampleLocationsBeginInfoEXT(resourceTracker, reinterpret_cast<VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT:
        {
            transform_tohost_VkPipelineSampleLocationsStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineSampleLocationsStateCreateInfoEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT:
        {
            transform_tohost_VkPhysicalDeviceSampleLocationsPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceSampleLocationsPropertiesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_blend_operation_advanced
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT:
        {
            transform_tohost_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT:
        {
            transform_tohost_VkPipelineColorBlendAdvancedStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_fragment_coverage_to_color
        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV:
        {
            transform_tohost_VkPipelineCoverageToColorStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_framebuffer_mixed_samples
        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV:
        {
            transform_tohost_VkPipelineCoverageModulationStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineCoverageModulationStateCreateInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_shader_sm_builtins
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV:
        {
            transform_tohost_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV:
        {
            transform_tohost_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_image_drm_format_modifier
        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT:
        {
            transform_tohost_VkDrmFormatModifierPropertiesListEXT(resourceTracker, reinterpret_cast<VkDrmFormatModifierPropertiesListEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT:
        {
            transform_tohost_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT:
        {
            transform_tohost_VkImageDrmFormatModifierListCreateInfoEXT(resourceTracker, reinterpret_cast<VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT:
        {
            transform_tohost_VkImageDrmFormatModifierExplicitCreateInfoEXT(resourceTracker, reinterpret_cast<VkImageDrmFormatModifierExplicitCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_validation_cache
        case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT:
        {
            transform_tohost_VkShaderModuleValidationCacheCreateInfoEXT(resourceTracker, reinterpret_cast<VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_shading_rate_image
        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV:
        {
            transform_tohost_VkPipelineViewportShadingRateImageStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineViewportShadingRateImageStateCreateInfoNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV:
        {
            transform_tohost_VkPhysicalDeviceShadingRateImageFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV:
        {
            transform_tohost_VkPhysicalDeviceShadingRateImagePropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceShadingRateImagePropertiesNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV:
        {
            transform_tohost_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_ray_tracing
        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV:
        {
            transform_tohost_VkWriteDescriptorSetAccelerationStructureNV(resourceTracker, reinterpret_cast<VkWriteDescriptorSetAccelerationStructureNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV:
        {
            transform_tohost_VkPhysicalDeviceRayTracingPropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_representative_fragment_test
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV:
        {
            transform_tohost_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV:
        {
            transform_tohost_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_filter_cubic
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT:
        {
            transform_tohost_VkPhysicalDeviceImageViewImageFormatInfoEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceImageViewImageFormatInfoEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT:
        {
            transform_tohost_VkFilterCubicImageViewImageFormatPropertiesEXT(resourceTracker, reinterpret_cast<VkFilterCubicImageViewImageFormatPropertiesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_global_priority
        case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT:
        {
            transform_tohost_VkDeviceQueueGlobalPriorityCreateInfoEXT(resourceTracker, reinterpret_cast<VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_external_memory_host
        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT:
        {
            transform_tohost_VkImportMemoryHostPointerInfoEXT(resourceTracker, reinterpret_cast<VkImportMemoryHostPointerInfoEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT:
        {
            transform_tohost_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_AMD_pipeline_compiler_control
        case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD:
        {
            transform_tohost_VkPipelineCompilerControlCreateInfoAMD(resourceTracker, reinterpret_cast<VkPipelineCompilerControlCreateInfoAMD*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_AMD_shader_core_properties
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD:
        {
            transform_tohost_VkPhysicalDeviceShaderCorePropertiesAMD(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_AMD_memory_overallocation_behavior
        case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD:
        {
            transform_tohost_VkDeviceMemoryOverallocationCreateInfoAMD(resourceTracker, reinterpret_cast<VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_vertex_attribute_divisor
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT:
        {
            transform_tohost_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT:
        {
            transform_tohost_VkPipelineVertexInputDivisorStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineVertexInputDivisorStateCreateInfoEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_GGP_frame_token
        case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP:
        {
            transform_tohost_VkPresentFrameTokenGGP(resourceTracker, reinterpret_cast<VkPresentFrameTokenGGP*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_pipeline_creation_feedback
        case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT:
        {
            transform_tohost_VkPipelineCreationFeedbackCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_compute_shader_derivatives
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV:
        {
            transform_tohost_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_mesh_shader
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV:
        {
            transform_tohost_VkPhysicalDeviceMeshShaderFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV:
        {
            transform_tohost_VkPhysicalDeviceMeshShaderPropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_fragment_shader_barycentric
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV:
        {
            transform_tohost_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_shader_image_footprint
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV:
        {
            transform_tohost_VkPhysicalDeviceShaderImageFootprintFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_scissor_exclusive
        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV:
        {
            transform_tohost_VkPipelineViewportExclusiveScissorStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV:
        {
            transform_tohost_VkPhysicalDeviceExclusiveScissorFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceExclusiveScissorFeaturesNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_device_diagnostic_checkpoints
        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV:
        {
            transform_tohost_VkQueueFamilyCheckpointPropertiesNV(resourceTracker, reinterpret_cast<VkQueueFamilyCheckpointPropertiesNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_INTEL_shader_integer_functions2
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL:
        {
            transform_tohost_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_INTEL_performance_query
        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL:
        {
            transform_tohost_VkQueryPoolPerformanceQueryCreateInfoINTEL(resourceTracker, reinterpret_cast<VkQueryPoolPerformanceQueryCreateInfoINTEL*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_pci_bus_info
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT:
        {
            transform_tohost_VkPhysicalDevicePCIBusInfoPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_AMD_display_native_hdr
        case VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD:
        {
            transform_tohost_VkDisplayNativeHdrSurfaceCapabilitiesAMD(resourceTracker, reinterpret_cast<VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD:
        {
            transform_tohost_VkSwapchainDisplayNativeHdrCreateInfoAMD(resourceTracker, reinterpret_cast<VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_fragment_density_map
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT:
        {
            transform_tohost_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT:
        {
            transform_tohost_VkRenderPassFragmentDensityMapCreateInfoEXT(resourceTracker, reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_subgroup_size_control
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT:
        {
            transform_tohost_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT:
        {
            transform_tohost_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_AMD_shader_core_properties2
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD:
        {
            transform_tohost_VkPhysicalDeviceShaderCoreProperties2AMD(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_AMD_device_coherent_memory
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD:
        {
            transform_tohost_VkPhysicalDeviceCoherentMemoryFeaturesAMD(resourceTracker, reinterpret_cast<VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_shader_image_atomic_int64
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_memory_budget
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT:
        {
            transform_tohost_VkPhysicalDeviceMemoryBudgetPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_memory_priority
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDeviceMemoryPriorityFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT:
        {
            transform_tohost_VkMemoryPriorityAllocateInfoEXT(resourceTracker, reinterpret_cast<VkMemoryPriorityAllocateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_dedicated_allocation_image_aliasing
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV:
        {
            transform_tohost_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_buffer_device_address
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT:
        {
            transform_tohost_VkBufferDeviceAddressCreateInfoEXT(resourceTracker, reinterpret_cast<VkBufferDeviceAddressCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_validation_features
        case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT:
        {
            transform_tohost_VkValidationFeaturesEXT(resourceTracker, reinterpret_cast<VkValidationFeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_cooperative_matrix
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV:
        {
            transform_tohost_VkPhysicalDeviceCooperativeMatrixFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV:
        {
            transform_tohost_VkPhysicalDeviceCooperativeMatrixPropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_coverage_reduction_mode
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV:
        {
            transform_tohost_VkPhysicalDeviceCoverageReductionModeFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV:
        {
            transform_tohost_VkPipelineCoverageReductionStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineCoverageReductionStateCreateInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_fragment_shader_interlock
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_ycbcr_image_arrays
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_full_screen_exclusive
        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT:
        {
            transform_tohost_VkSurfaceFullScreenExclusiveInfoEXT(resourceTracker, reinterpret_cast<VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT:
        {
            transform_tohost_VkSurfaceCapabilitiesFullScreenExclusiveEXT(resourceTracker, reinterpret_cast<VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT:
        {
            transform_tohost_VkSurfaceFullScreenExclusiveWin32InfoEXT(resourceTracker, reinterpret_cast<VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_line_rasterization
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDeviceLineRasterizationFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceLineRasterizationFeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT:
        {
            transform_tohost_VkPhysicalDeviceLineRasterizationPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceLineRasterizationPropertiesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT:
        {
            transform_tohost_VkPipelineRasterizationLineStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineRasterizationLineStateCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_shader_atomic_float
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_index_type_uint8
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_extended_dynamic_state
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_shader_demote_to_helper_invocation
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_device_generated_commands
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV:
        {
            transform_tohost_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV:
        {
            transform_tohost_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV:
        {
            transform_tohost_VkGraphicsPipelineShaderGroupsCreateInfoNV(resourceTracker, reinterpret_cast<VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_texel_buffer_alignment
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT:
        {
            transform_tohost_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_QCOM_render_pass_transform
        case VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM:
        {
            transform_tohost_VkRenderPassTransformBeginInfoQCOM(resourceTracker, reinterpret_cast<VkRenderPassTransformBeginInfoQCOM*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM:
        {
            transform_tohost_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(resourceTracker, reinterpret_cast<VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_device_memory_report
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT:
        {
            transform_tohost_VkDeviceDeviceMemoryReportCreateInfoEXT(resourceTracker, reinterpret_cast<VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_robustness2
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDeviceRobustness2FeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT:
        {
            transform_tohost_VkPhysicalDeviceRobustness2PropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_custom_border_color
        case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT:
        {
            transform_tohost_VkSamplerCustomBorderColorCreateInfoEXT(resourceTracker, reinterpret_cast<VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT:
        {
            transform_tohost_VkPhysicalDeviceCustomBorderColorPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDeviceCustomBorderColorFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_private_data
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDevicePrivateDataFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT:
        {
            transform_tohost_VkDevicePrivateDataCreateInfoEXT(resourceTracker, reinterpret_cast<VkDevicePrivateDataCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_pipeline_creation_cache_control
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_device_diagnostics_config
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV:
        {
            transform_tohost_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV:
        {
            transform_tohost_VkDeviceDiagnosticsConfigCreateInfoNV(resourceTracker, reinterpret_cast<VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_fragment_shading_rate_enums
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV:
        {
            transform_tohost_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV:
        {
            transform_tohost_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV:
        {
            transform_tohost_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_fragment_density_map2
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT:
        {
            transform_tohost_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_QCOM_rotated_copy_commands
        case VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM:
        {
            transform_tohost_VkCopyCommandTransformInfoQCOM(resourceTracker, reinterpret_cast<VkCopyCommandTransformInfoQCOM*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_image_robustness
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDeviceImageRobustnessFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceImageRobustnessFeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_4444_formats
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT:
        {
            transform_tohost_VkPhysicalDevice4444FormatsFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension_out));
            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:
        {
            transform_tohost_VkWriteDescriptorSetAccelerationStructureKHR(resourceTracker, reinterpret_cast<VkWriteDescriptorSetAccelerationStructureKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR:
        {
            transform_tohost_VkPhysicalDeviceAccelerationStructureFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR:
        {
            transform_tohost_VkPhysicalDeviceAccelerationStructurePropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_ray_tracing_pipeline
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR:
        {
            transform_tohost_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR:
        {
            transform_tohost_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_ray_query
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR:
        {
            transform_tohost_VkPhysicalDeviceRayQueryFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension_out));
            break;
        }
#endif
        default:
        {
            return;
        }
    }
}

void transform_fromhost_extension_struct(
    ResourceTracker* resourceTracker,
    void* structExtension_out)
{
    if (!structExtension_out)
    {
        return;
    }
    uint32_t structType = (uint32_t)goldfish_vk_struct_type(structExtension_out);
    switch(structType)
    {
#ifdef VK_VERSION_1_1
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES:
        {
            transform_fromhost_VkPhysicalDeviceSubgroupProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceSubgroupProperties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES:
        {
            transform_fromhost_VkPhysicalDevice16BitStorageFeatures(resourceTracker, reinterpret_cast<VkPhysicalDevice16BitStorageFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS:
        {
            transform_fromhost_VkMemoryDedicatedRequirements(resourceTracker, reinterpret_cast<VkMemoryDedicatedRequirements*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO:
        {
            transform_fromhost_VkMemoryDedicatedAllocateInfo(resourceTracker, reinterpret_cast<VkMemoryDedicatedAllocateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO:
        {
            transform_fromhost_VkMemoryAllocateFlagsInfo(resourceTracker, reinterpret_cast<VkMemoryAllocateFlagsInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO:
        {
            transform_fromhost_VkDeviceGroupRenderPassBeginInfo(resourceTracker, reinterpret_cast<VkDeviceGroupRenderPassBeginInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO:
        {
            transform_fromhost_VkDeviceGroupCommandBufferBeginInfo(resourceTracker, reinterpret_cast<VkDeviceGroupCommandBufferBeginInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO:
        {
            transform_fromhost_VkDeviceGroupSubmitInfo(resourceTracker, reinterpret_cast<VkDeviceGroupSubmitInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO:
        {
            transform_fromhost_VkDeviceGroupBindSparseInfo(resourceTracker, reinterpret_cast<VkDeviceGroupBindSparseInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO:
        {
            transform_fromhost_VkBindBufferMemoryDeviceGroupInfo(resourceTracker, reinterpret_cast<VkBindBufferMemoryDeviceGroupInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO:
        {
            transform_fromhost_VkBindImageMemoryDeviceGroupInfo(resourceTracker, reinterpret_cast<VkBindImageMemoryDeviceGroupInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO:
        {
            transform_fromhost_VkDeviceGroupDeviceCreateInfo(resourceTracker, reinterpret_cast<VkDeviceGroupDeviceCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
        {
            transform_fromhost_VkPhysicalDeviceFeatures2(resourceTracker, reinterpret_cast<VkPhysicalDeviceFeatures2*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES:
        {
            transform_fromhost_VkPhysicalDevicePointClippingProperties(resourceTracker, reinterpret_cast<VkPhysicalDevicePointClippingProperties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO:
        {
            transform_fromhost_VkRenderPassInputAttachmentAspectCreateInfo(resourceTracker, reinterpret_cast<VkRenderPassInputAttachmentAspectCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO:
        {
            transform_fromhost_VkImageViewUsageCreateInfo(resourceTracker, reinterpret_cast<VkImageViewUsageCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO:
        {
            transform_fromhost_VkPipelineTessellationDomainOriginStateCreateInfo(resourceTracker, reinterpret_cast<VkPipelineTessellationDomainOriginStateCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO:
        {
            transform_fromhost_VkRenderPassMultiviewCreateInfo(resourceTracker, reinterpret_cast<VkRenderPassMultiviewCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES:
        {
            transform_fromhost_VkPhysicalDeviceMultiviewFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceMultiviewFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES:
        {
            transform_fromhost_VkPhysicalDeviceMultiviewProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceMultiviewProperties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES:
        {
            transform_fromhost_VkPhysicalDeviceVariablePointersFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceVariablePointersFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES:
        {
            transform_fromhost_VkPhysicalDeviceProtectedMemoryFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES:
        {
            transform_fromhost_VkPhysicalDeviceProtectedMemoryProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceProtectedMemoryProperties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO:
        {
            transform_fromhost_VkProtectedSubmitInfo(resourceTracker, reinterpret_cast<VkProtectedSubmitInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO:
        {
            transform_fromhost_VkSamplerYcbcrConversionInfo(resourceTracker, reinterpret_cast<VkSamplerYcbcrConversionInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO:
        {
            transform_fromhost_VkBindImagePlaneMemoryInfo(resourceTracker, reinterpret_cast<VkBindImagePlaneMemoryInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO:
        {
            transform_fromhost_VkImagePlaneMemoryRequirementsInfo(resourceTracker, reinterpret_cast<VkImagePlaneMemoryRequirementsInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES:
        {
            transform_fromhost_VkPhysicalDeviceSamplerYcbcrConversionFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES:
        {
            transform_fromhost_VkSamplerYcbcrConversionImageFormatProperties(resourceTracker, reinterpret_cast<VkSamplerYcbcrConversionImageFormatProperties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO:
        {
            resourceTracker->transformImpl_VkPhysicalDeviceExternalImageFormatInfo_fromhost(reinterpret_cast<VkPhysicalDeviceExternalImageFormatInfo*>(structExtension_out), 1);
            transform_fromhost_VkPhysicalDeviceExternalImageFormatInfo(resourceTracker, reinterpret_cast<VkPhysicalDeviceExternalImageFormatInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES:
        {
            resourceTracker->transformImpl_VkExternalImageFormatProperties_fromhost(reinterpret_cast<VkExternalImageFormatProperties*>(structExtension_out), 1);
            transform_fromhost_VkExternalImageFormatProperties(resourceTracker, reinterpret_cast<VkExternalImageFormatProperties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES:
        {
            transform_fromhost_VkPhysicalDeviceIDProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceIDProperties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO:
        {
            resourceTracker->transformImpl_VkExternalMemoryImageCreateInfo_fromhost(reinterpret_cast<VkExternalMemoryImageCreateInfo*>(structExtension_out), 1);
            transform_fromhost_VkExternalMemoryImageCreateInfo(resourceTracker, reinterpret_cast<VkExternalMemoryImageCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO:
        {
            resourceTracker->transformImpl_VkExternalMemoryBufferCreateInfo_fromhost(reinterpret_cast<VkExternalMemoryBufferCreateInfo*>(structExtension_out), 1);
            transform_fromhost_VkExternalMemoryBufferCreateInfo(resourceTracker, reinterpret_cast<VkExternalMemoryBufferCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO:
        {
            resourceTracker->transformImpl_VkExportMemoryAllocateInfo_fromhost(reinterpret_cast<VkExportMemoryAllocateInfo*>(structExtension_out), 1);
            transform_fromhost_VkExportMemoryAllocateInfo(resourceTracker, reinterpret_cast<VkExportMemoryAllocateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO:
        {
            transform_fromhost_VkExportFenceCreateInfo(resourceTracker, reinterpret_cast<VkExportFenceCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO:
        {
            transform_fromhost_VkExportSemaphoreCreateInfo(resourceTracker, reinterpret_cast<VkExportSemaphoreCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES:
        {
            transform_fromhost_VkPhysicalDeviceMaintenance3Properties(resourceTracker, reinterpret_cast<VkPhysicalDeviceMaintenance3Properties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES:
        {
            transform_fromhost_VkPhysicalDeviceShaderDrawParametersFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderDrawParametersFeatures*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_VERSION_1_2
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES:
        {
            transform_fromhost_VkPhysicalDeviceVulkan11Features(resourceTracker, reinterpret_cast<VkPhysicalDeviceVulkan11Features*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES:
        {
            transform_fromhost_VkPhysicalDeviceVulkan11Properties(resourceTracker, reinterpret_cast<VkPhysicalDeviceVulkan11Properties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES:
        {
            transform_fromhost_VkPhysicalDeviceVulkan12Features(resourceTracker, reinterpret_cast<VkPhysicalDeviceVulkan12Features*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES:
        {
            transform_fromhost_VkPhysicalDeviceVulkan12Properties(resourceTracker, reinterpret_cast<VkPhysicalDeviceVulkan12Properties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO:
        {
            transform_fromhost_VkImageFormatListCreateInfo(resourceTracker, reinterpret_cast<VkImageFormatListCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES:
        {
            transform_fromhost_VkPhysicalDevice8BitStorageFeatures(resourceTracker, reinterpret_cast<VkPhysicalDevice8BitStorageFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES:
        {
            transform_fromhost_VkPhysicalDeviceDriverProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceDriverProperties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES:
        {
            transform_fromhost_VkPhysicalDeviceShaderAtomicInt64Features(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES:
        {
            transform_fromhost_VkPhysicalDeviceShaderFloat16Int8Features(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES:
        {
            transform_fromhost_VkPhysicalDeviceFloatControlsProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceFloatControlsProperties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO:
        {
            transform_fromhost_VkDescriptorSetLayoutBindingFlagsCreateInfo(resourceTracker, reinterpret_cast<VkDescriptorSetLayoutBindingFlagsCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES:
        {
            transform_fromhost_VkPhysicalDeviceDescriptorIndexingFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES:
        {
            transform_fromhost_VkPhysicalDeviceDescriptorIndexingProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceDescriptorIndexingProperties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO:
        {
            transform_fromhost_VkDescriptorSetVariableDescriptorCountAllocateInfo(resourceTracker, reinterpret_cast<VkDescriptorSetVariableDescriptorCountAllocateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT:
        {
            transform_fromhost_VkDescriptorSetVariableDescriptorCountLayoutSupport(resourceTracker, reinterpret_cast<VkDescriptorSetVariableDescriptorCountLayoutSupport*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE:
        {
            transform_fromhost_VkSubpassDescriptionDepthStencilResolve(resourceTracker, reinterpret_cast<VkSubpassDescriptionDepthStencilResolve*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES:
        {
            transform_fromhost_VkPhysicalDeviceDepthStencilResolveProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceDepthStencilResolveProperties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES:
        {
            transform_fromhost_VkPhysicalDeviceScalarBlockLayoutFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO:
        {
            transform_fromhost_VkImageStencilUsageCreateInfo(resourceTracker, reinterpret_cast<VkImageStencilUsageCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO:
        {
            transform_fromhost_VkSamplerReductionModeCreateInfo(resourceTracker, reinterpret_cast<VkSamplerReductionModeCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES:
        {
            transform_fromhost_VkPhysicalDeviceSamplerFilterMinmaxProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceSamplerFilterMinmaxProperties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES:
        {
            transform_fromhost_VkPhysicalDeviceVulkanMemoryModelFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES:
        {
            transform_fromhost_VkPhysicalDeviceImagelessFramebufferFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceImagelessFramebufferFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO:
        {
            transform_fromhost_VkFramebufferAttachmentsCreateInfo(resourceTracker, reinterpret_cast<VkFramebufferAttachmentsCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO:
        {
            transform_fromhost_VkRenderPassAttachmentBeginInfo(resourceTracker, reinterpret_cast<VkRenderPassAttachmentBeginInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES:
        {
            transform_fromhost_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES:
        {
            transform_fromhost_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES:
        {
            transform_fromhost_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT:
        {
            transform_fromhost_VkAttachmentReferenceStencilLayout(resourceTracker, reinterpret_cast<VkAttachmentReferenceStencilLayout*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT:
        {
            transform_fromhost_VkAttachmentDescriptionStencilLayout(resourceTracker, reinterpret_cast<VkAttachmentDescriptionStencilLayout*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES:
        {
            transform_fromhost_VkPhysicalDeviceHostQueryResetFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceHostQueryResetFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES:
        {
            transform_fromhost_VkPhysicalDeviceTimelineSemaphoreFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES:
        {
            transform_fromhost_VkPhysicalDeviceTimelineSemaphoreProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreProperties*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO:
        {
            transform_fromhost_VkSemaphoreTypeCreateInfo(resourceTracker, reinterpret_cast<VkSemaphoreTypeCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO:
        {
            transform_fromhost_VkTimelineSemaphoreSubmitInfo(resourceTracker, reinterpret_cast<VkTimelineSemaphoreSubmitInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES:
        {
            transform_fromhost_VkPhysicalDeviceBufferDeviceAddressFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeatures*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO:
        {
            transform_fromhost_VkBufferOpaqueCaptureAddressCreateInfo(resourceTracker, reinterpret_cast<VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO:
        {
            transform_fromhost_VkMemoryOpaqueCaptureAddressAllocateInfo(resourceTracker, reinterpret_cast<VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_swapchain
        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR:
        {
            transform_fromhost_VkImageSwapchainCreateInfoKHR(resourceTracker, reinterpret_cast<VkImageSwapchainCreateInfoKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR:
        {
            transform_fromhost_VkBindImageMemorySwapchainInfoKHR(resourceTracker, reinterpret_cast<VkBindImageMemorySwapchainInfoKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR:
        {
            transform_fromhost_VkDeviceGroupPresentInfoKHR(resourceTracker, reinterpret_cast<VkDeviceGroupPresentInfoKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR:
        {
            transform_fromhost_VkDeviceGroupSwapchainCreateInfoKHR(resourceTracker, reinterpret_cast<VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_display_swapchain
        case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR:
        {
            transform_fromhost_VkDisplayPresentInfoKHR(resourceTracker, reinterpret_cast<VkDisplayPresentInfoKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_external_memory_win32
        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
        {
            transform_fromhost_VkImportMemoryWin32HandleInfoKHR(resourceTracker, reinterpret_cast<VkImportMemoryWin32HandleInfoKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
        {
            transform_fromhost_VkExportMemoryWin32HandleInfoKHR(resourceTracker, reinterpret_cast<VkExportMemoryWin32HandleInfoKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_external_memory_fd
        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR:
        {
            transform_fromhost_VkImportMemoryFdInfoKHR(resourceTracker, reinterpret_cast<VkImportMemoryFdInfoKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_win32_keyed_mutex
        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR:
        {
            transform_fromhost_VkWin32KeyedMutexAcquireReleaseInfoKHR(resourceTracker, reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_external_semaphore_win32
        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR:
        {
            transform_fromhost_VkExportSemaphoreWin32HandleInfoKHR(resourceTracker, reinterpret_cast<VkExportSemaphoreWin32HandleInfoKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR:
        {
            transform_fromhost_VkD3D12FenceSubmitInfoKHR(resourceTracker, reinterpret_cast<VkD3D12FenceSubmitInfoKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_push_descriptor
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR:
        {
            transform_fromhost_VkPhysicalDevicePushDescriptorPropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePushDescriptorPropertiesKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_incremental_present
        case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR:
        {
            transform_fromhost_VkPresentRegionsKHR(resourceTracker, reinterpret_cast<VkPresentRegionsKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_shared_presentable_image
        case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR:
        {
            transform_fromhost_VkSharedPresentSurfaceCapabilitiesKHR(resourceTracker, reinterpret_cast<VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_external_fence_win32
        case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR:
        {
            transform_fromhost_VkExportFenceWin32HandleInfoKHR(resourceTracker, reinterpret_cast<VkExportFenceWin32HandleInfoKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_performance_query
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR:
        {
            transform_fromhost_VkPhysicalDevicePerformanceQueryFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePerformanceQueryFeaturesKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR:
        {
            transform_fromhost_VkPhysicalDevicePerformanceQueryPropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePerformanceQueryPropertiesKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR:
        {
            transform_fromhost_VkQueryPoolPerformanceCreateInfoKHR(resourceTracker, reinterpret_cast<VkQueryPoolPerformanceCreateInfoKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR:
        {
            transform_fromhost_VkPerformanceQuerySubmitInfoKHR(resourceTracker, reinterpret_cast<VkPerformanceQuerySubmitInfoKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_portability_subset
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR:
        {
            transform_fromhost_VkPhysicalDevicePortabilitySubsetFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR:
        {
            transform_fromhost_VkPhysicalDevicePortabilitySubsetPropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_shader_clock
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR:
        {
            transform_fromhost_VkPhysicalDeviceShaderClockFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_shader_terminate_invocation
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR:
        {
            transform_fromhost_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_fragment_shading_rate
        case VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR:
        {
            transform_fromhost_VkFragmentShadingRateAttachmentInfoKHR(resourceTracker, reinterpret_cast<VkFragmentShadingRateAttachmentInfoKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR:
        {
            transform_fromhost_VkPipelineFragmentShadingRateStateCreateInfoKHR(resourceTracker, reinterpret_cast<VkPipelineFragmentShadingRateStateCreateInfoKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR:
        {
            transform_fromhost_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR:
        {
            transform_fromhost_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_surface_protected_capabilities
        case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR:
        {
            transform_fromhost_VkSurfaceProtectedCapabilitiesKHR(resourceTracker, reinterpret_cast<VkSurfaceProtectedCapabilitiesKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_pipeline_executable_properties
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR:
        {
            transform_fromhost_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_ANDROID_native_buffer
        case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID:
        {
            transform_fromhost_VkNativeBufferANDROID(resourceTracker, reinterpret_cast<VkNativeBufferANDROID*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_debug_report
        case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT:
        {
            transform_fromhost_VkDebugReportCallbackCreateInfoEXT(resourceTracker, reinterpret_cast<VkDebugReportCallbackCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_AMD_rasterization_order
        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD:
        {
            transform_fromhost_VkPipelineRasterizationStateRasterizationOrderAMD(resourceTracker, reinterpret_cast<VkPipelineRasterizationStateRasterizationOrderAMD*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_dedicated_allocation
        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV:
        {
            transform_fromhost_VkDedicatedAllocationImageCreateInfoNV(resourceTracker, reinterpret_cast<VkDedicatedAllocationImageCreateInfoNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV:
        {
            transform_fromhost_VkDedicatedAllocationBufferCreateInfoNV(resourceTracker, reinterpret_cast<VkDedicatedAllocationBufferCreateInfoNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV:
        {
            transform_fromhost_VkDedicatedAllocationMemoryAllocateInfoNV(resourceTracker, reinterpret_cast<VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_transform_feedback
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceTransformFeedbackFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceTransformFeedbackPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT:
        {
            transform_fromhost_VkPipelineRasterizationStateStreamCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineRasterizationStateStreamCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_AMD_texture_gather_bias_lod
        case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD:
        {
            transform_fromhost_VkTextureLODGatherFormatPropertiesAMD(resourceTracker, reinterpret_cast<VkTextureLODGatherFormatPropertiesAMD*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_corner_sampled_image
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV:
        {
            transform_fromhost_VkPhysicalDeviceCornerSampledImageFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceCornerSampledImageFeaturesNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_external_memory
        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV:
        {
            transform_fromhost_VkExternalMemoryImageCreateInfoNV(resourceTracker, reinterpret_cast<VkExternalMemoryImageCreateInfoNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV:
        {
            transform_fromhost_VkExportMemoryAllocateInfoNV(resourceTracker, reinterpret_cast<VkExportMemoryAllocateInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_external_memory_win32
        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV:
        {
            transform_fromhost_VkImportMemoryWin32HandleInfoNV(resourceTracker, reinterpret_cast<VkImportMemoryWin32HandleInfoNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV:
        {
            transform_fromhost_VkExportMemoryWin32HandleInfoNV(resourceTracker, reinterpret_cast<VkExportMemoryWin32HandleInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_win32_keyed_mutex
        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV:
        {
            transform_fromhost_VkWin32KeyedMutexAcquireReleaseInfoNV(resourceTracker, reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_validation_flags
        case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT:
        {
            transform_fromhost_VkValidationFlagsEXT(resourceTracker, reinterpret_cast<VkValidationFlagsEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_texture_compression_astc_hdr
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_astc_decode_mode
        case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT:
        {
            transform_fromhost_VkImageViewASTCDecodeModeEXT(resourceTracker, reinterpret_cast<VkImageViewASTCDecodeModeEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceASTCDecodeFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_conditional_rendering
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceConditionalRenderingFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT:
        {
            transform_fromhost_VkCommandBufferInheritanceConditionalRenderingInfoEXT(resourceTracker, reinterpret_cast<VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_clip_space_w_scaling
        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV:
        {
            transform_fromhost_VkPipelineViewportWScalingStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineViewportWScalingStateCreateInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_display_control
        case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT:
        {
            transform_fromhost_VkSwapchainCounterCreateInfoEXT(resourceTracker, reinterpret_cast<VkSwapchainCounterCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_GOOGLE_display_timing
        case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE:
        {
            transform_fromhost_VkPresentTimesInfoGOOGLE(resourceTracker, reinterpret_cast<VkPresentTimesInfoGOOGLE*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NVX_multiview_per_view_attributes
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX:
        {
            transform_fromhost_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(resourceTracker, reinterpret_cast<VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_viewport_swizzle
        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV:
        {
            transform_fromhost_VkPipelineViewportSwizzleStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_discard_rectangles
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceDiscardRectanglePropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT:
        {
            transform_fromhost_VkPipelineDiscardRectangleStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineDiscardRectangleStateCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_conservative_rasterization
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT:
        {
            transform_fromhost_VkPipelineRasterizationConservativeStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineRasterizationConservativeStateCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_depth_clip_enable
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceDepthClipEnableFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT:
        {
            transform_fromhost_VkPipelineRasterizationDepthClipStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_debug_utils
        case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT:
        {
            transform_fromhost_VkDebugUtilsMessengerCreateInfoEXT(resourceTracker, reinterpret_cast<VkDebugUtilsMessengerCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_ANDROID_external_memory_android_hardware_buffer
        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID:
        {
            transform_fromhost_VkAndroidHardwareBufferUsageANDROID(resourceTracker, reinterpret_cast<VkAndroidHardwareBufferUsageANDROID*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID:
        {
            transform_fromhost_VkAndroidHardwareBufferFormatPropertiesANDROID(resourceTracker, reinterpret_cast<VkAndroidHardwareBufferFormatPropertiesANDROID*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID:
        {
            transform_fromhost_VkImportAndroidHardwareBufferInfoANDROID(resourceTracker, reinterpret_cast<VkImportAndroidHardwareBufferInfoANDROID*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID:
        {
            transform_fromhost_VkExternalFormatANDROID(resourceTracker, reinterpret_cast<VkExternalFormatANDROID*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_inline_uniform_block
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT:
        {
            transform_fromhost_VkWriteDescriptorSetInlineUniformBlockEXT(resourceTracker, reinterpret_cast<VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT:
        {
            transform_fromhost_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(resourceTracker, reinterpret_cast<VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_sample_locations
        case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT:
        {
            transform_fromhost_VkSampleLocationsInfoEXT(resourceTracker, reinterpret_cast<VkSampleLocationsInfoEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT:
        {
            transform_fromhost_VkRenderPassSampleLocationsBeginInfoEXT(resourceTracker, reinterpret_cast<VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT:
        {
            transform_fromhost_VkPipelineSampleLocationsStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineSampleLocationsStateCreateInfoEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceSampleLocationsPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceSampleLocationsPropertiesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_blend_operation_advanced
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT:
        {
            transform_fromhost_VkPipelineColorBlendAdvancedStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_fragment_coverage_to_color
        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV:
        {
            transform_fromhost_VkPipelineCoverageToColorStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_framebuffer_mixed_samples
        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV:
        {
            transform_fromhost_VkPipelineCoverageModulationStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineCoverageModulationStateCreateInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_shader_sm_builtins
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV:
        {
            transform_fromhost_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV:
        {
            transform_fromhost_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_image_drm_format_modifier
        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT:
        {
            transform_fromhost_VkDrmFormatModifierPropertiesListEXT(resourceTracker, reinterpret_cast<VkDrmFormatModifierPropertiesListEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT:
        {
            transform_fromhost_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT:
        {
            transform_fromhost_VkImageDrmFormatModifierListCreateInfoEXT(resourceTracker, reinterpret_cast<VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT:
        {
            transform_fromhost_VkImageDrmFormatModifierExplicitCreateInfoEXT(resourceTracker, reinterpret_cast<VkImageDrmFormatModifierExplicitCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_validation_cache
        case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT:
        {
            transform_fromhost_VkShaderModuleValidationCacheCreateInfoEXT(resourceTracker, reinterpret_cast<VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_shading_rate_image
        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV:
        {
            transform_fromhost_VkPipelineViewportShadingRateImageStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineViewportShadingRateImageStateCreateInfoNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV:
        {
            transform_fromhost_VkPhysicalDeviceShadingRateImageFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV:
        {
            transform_fromhost_VkPhysicalDeviceShadingRateImagePropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceShadingRateImagePropertiesNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV:
        {
            transform_fromhost_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_ray_tracing
        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV:
        {
            transform_fromhost_VkWriteDescriptorSetAccelerationStructureNV(resourceTracker, reinterpret_cast<VkWriteDescriptorSetAccelerationStructureNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV:
        {
            transform_fromhost_VkPhysicalDeviceRayTracingPropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_representative_fragment_test
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV:
        {
            transform_fromhost_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV:
        {
            transform_fromhost_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_filter_cubic
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT:
        {
            transform_fromhost_VkPhysicalDeviceImageViewImageFormatInfoEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceImageViewImageFormatInfoEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT:
        {
            transform_fromhost_VkFilterCubicImageViewImageFormatPropertiesEXT(resourceTracker, reinterpret_cast<VkFilterCubicImageViewImageFormatPropertiesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_global_priority
        case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT:
        {
            transform_fromhost_VkDeviceQueueGlobalPriorityCreateInfoEXT(resourceTracker, reinterpret_cast<VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_external_memory_host
        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT:
        {
            transform_fromhost_VkImportMemoryHostPointerInfoEXT(resourceTracker, reinterpret_cast<VkImportMemoryHostPointerInfoEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_AMD_pipeline_compiler_control
        case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD:
        {
            transform_fromhost_VkPipelineCompilerControlCreateInfoAMD(resourceTracker, reinterpret_cast<VkPipelineCompilerControlCreateInfoAMD*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_AMD_shader_core_properties
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD:
        {
            transform_fromhost_VkPhysicalDeviceShaderCorePropertiesAMD(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_AMD_memory_overallocation_behavior
        case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD:
        {
            transform_fromhost_VkDeviceMemoryOverallocationCreateInfoAMD(resourceTracker, reinterpret_cast<VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_vertex_attribute_divisor
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT:
        {
            transform_fromhost_VkPipelineVertexInputDivisorStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineVertexInputDivisorStateCreateInfoEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_GGP_frame_token
        case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP:
        {
            transform_fromhost_VkPresentFrameTokenGGP(resourceTracker, reinterpret_cast<VkPresentFrameTokenGGP*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_pipeline_creation_feedback
        case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT:
        {
            transform_fromhost_VkPipelineCreationFeedbackCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_compute_shader_derivatives
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV:
        {
            transform_fromhost_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_mesh_shader
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV:
        {
            transform_fromhost_VkPhysicalDeviceMeshShaderFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV:
        {
            transform_fromhost_VkPhysicalDeviceMeshShaderPropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_fragment_shader_barycentric
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV:
        {
            transform_fromhost_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_shader_image_footprint
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV:
        {
            transform_fromhost_VkPhysicalDeviceShaderImageFootprintFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_scissor_exclusive
        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV:
        {
            transform_fromhost_VkPipelineViewportExclusiveScissorStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV:
        {
            transform_fromhost_VkPhysicalDeviceExclusiveScissorFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceExclusiveScissorFeaturesNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_device_diagnostic_checkpoints
        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV:
        {
            transform_fromhost_VkQueueFamilyCheckpointPropertiesNV(resourceTracker, reinterpret_cast<VkQueueFamilyCheckpointPropertiesNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_INTEL_shader_integer_functions2
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL:
        {
            transform_fromhost_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_INTEL_performance_query
        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL:
        {
            transform_fromhost_VkQueryPoolPerformanceQueryCreateInfoINTEL(resourceTracker, reinterpret_cast<VkQueryPoolPerformanceQueryCreateInfoINTEL*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_pci_bus_info
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT:
        {
            transform_fromhost_VkPhysicalDevicePCIBusInfoPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_AMD_display_native_hdr
        case VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD:
        {
            transform_fromhost_VkDisplayNativeHdrSurfaceCapabilitiesAMD(resourceTracker, reinterpret_cast<VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD:
        {
            transform_fromhost_VkSwapchainDisplayNativeHdrCreateInfoAMD(resourceTracker, reinterpret_cast<VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_fragment_density_map
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT:
        {
            transform_fromhost_VkRenderPassFragmentDensityMapCreateInfoEXT(resourceTracker, reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_subgroup_size_control
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT:
        {
            transform_fromhost_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_AMD_shader_core_properties2
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD:
        {
            transform_fromhost_VkPhysicalDeviceShaderCoreProperties2AMD(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_AMD_device_coherent_memory
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD:
        {
            transform_fromhost_VkPhysicalDeviceCoherentMemoryFeaturesAMD(resourceTracker, reinterpret_cast<VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_shader_image_atomic_int64
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_memory_budget
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceMemoryBudgetPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_memory_priority
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceMemoryPriorityFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT:
        {
            transform_fromhost_VkMemoryPriorityAllocateInfoEXT(resourceTracker, reinterpret_cast<VkMemoryPriorityAllocateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_dedicated_allocation_image_aliasing
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV:
        {
            transform_fromhost_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_buffer_device_address
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT:
        {
            transform_fromhost_VkBufferDeviceAddressCreateInfoEXT(resourceTracker, reinterpret_cast<VkBufferDeviceAddressCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_validation_features
        case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT:
        {
            transform_fromhost_VkValidationFeaturesEXT(resourceTracker, reinterpret_cast<VkValidationFeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_cooperative_matrix
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV:
        {
            transform_fromhost_VkPhysicalDeviceCooperativeMatrixFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV:
        {
            transform_fromhost_VkPhysicalDeviceCooperativeMatrixPropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_coverage_reduction_mode
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV:
        {
            transform_fromhost_VkPhysicalDeviceCoverageReductionModeFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV:
        {
            transform_fromhost_VkPipelineCoverageReductionStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineCoverageReductionStateCreateInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_fragment_shader_interlock
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_ycbcr_image_arrays
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_full_screen_exclusive
        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT:
        {
            transform_fromhost_VkSurfaceFullScreenExclusiveInfoEXT(resourceTracker, reinterpret_cast<VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT:
        {
            transform_fromhost_VkSurfaceCapabilitiesFullScreenExclusiveEXT(resourceTracker, reinterpret_cast<VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT:
        {
            transform_fromhost_VkSurfaceFullScreenExclusiveWin32InfoEXT(resourceTracker, reinterpret_cast<VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_line_rasterization
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceLineRasterizationFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceLineRasterizationFeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceLineRasterizationPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceLineRasterizationPropertiesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT:
        {
            transform_fromhost_VkPipelineRasterizationLineStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineRasterizationLineStateCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_shader_atomic_float
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_index_type_uint8
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_extended_dynamic_state
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_shader_demote_to_helper_invocation
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_device_generated_commands
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV:
        {
            transform_fromhost_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV:
        {
            transform_fromhost_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV:
        {
            transform_fromhost_VkGraphicsPipelineShaderGroupsCreateInfoNV(resourceTracker, reinterpret_cast<VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_texel_buffer_alignment
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_QCOM_render_pass_transform
        case VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM:
        {
            transform_fromhost_VkRenderPassTransformBeginInfoQCOM(resourceTracker, reinterpret_cast<VkRenderPassTransformBeginInfoQCOM*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM:
        {
            transform_fromhost_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(resourceTracker, reinterpret_cast<VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_device_memory_report
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT:
        {
            transform_fromhost_VkDeviceDeviceMemoryReportCreateInfoEXT(resourceTracker, reinterpret_cast<VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_robustness2
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceRobustness2FeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceRobustness2PropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_custom_border_color
        case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT:
        {
            transform_fromhost_VkSamplerCustomBorderColorCreateInfoEXT(resourceTracker, reinterpret_cast<VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceCustomBorderColorPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceCustomBorderColorFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_private_data
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDevicePrivateDataFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT:
        {
            transform_fromhost_VkDevicePrivateDataCreateInfoEXT(resourceTracker, reinterpret_cast<VkDevicePrivateDataCreateInfoEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_pipeline_creation_cache_control
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_device_diagnostics_config
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV:
        {
            transform_fromhost_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV:
        {
            transform_fromhost_VkDeviceDiagnosticsConfigCreateInfoNV(resourceTracker, reinterpret_cast<VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_NV_fragment_shading_rate_enums
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV:
        {
            transform_fromhost_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV:
        {
            transform_fromhost_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV:
        {
            transform_fromhost_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_fragment_density_map2
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_QCOM_rotated_copy_commands
        case VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM:
        {
            transform_fromhost_VkCopyCommandTransformInfoQCOM(resourceTracker, reinterpret_cast<VkCopyCommandTransformInfoQCOM*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_image_robustness
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDeviceImageRobustnessFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceImageRobustnessFeaturesEXT*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_EXT_4444_formats
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT:
        {
            transform_fromhost_VkPhysicalDevice4444FormatsFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension_out));
            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:
        {
            transform_fromhost_VkWriteDescriptorSetAccelerationStructureKHR(resourceTracker, reinterpret_cast<VkWriteDescriptorSetAccelerationStructureKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR:
        {
            transform_fromhost_VkPhysicalDeviceAccelerationStructureFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR:
        {
            transform_fromhost_VkPhysicalDeviceAccelerationStructurePropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_ray_tracing_pipeline
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR:
        {
            transform_fromhost_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(structExtension_out));
            break;
        }
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR:
        {
            transform_fromhost_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(structExtension_out));
            break;
        }
#endif
#ifdef VK_KHR_ray_query
        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR:
        {
            transform_fromhost_VkPhysicalDeviceRayQueryFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension_out));
            break;
        }
#endif
        default:
        {
            return;
        }
    }
}


} // namespace goldfish_vk
