// =====================================================================================================================
//  fennec, a free and open source game engine
//  Copyright © 2025 - 2026  Medusa Slockbower
//
//  This program is free software: you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation, either version 3 of the License, or
//  (at your option) any later version.
//
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//
//  You should have received a copy of the GNU General Public License
//  along with this program.  If not, see <https://www.gnu.org/licenses/>.
// =====================================================================================================================

///
/// \file fennec/renderers/vulkan/lib/physical_device_features.h
/// \brief
///
///
/// \details
/// \author Medusa Slockbower
///
/// \copyright Copyright © 2025 Medusa Slockbower ([GPLv3](https://www.gnu.org/licenses/gpl-3.0.en.html))
///
///


#ifndef FENNEC_RENDERERS_VULKAN_LIB_PHYSICAL_DEVICE_FEATURES_H
#define FENNEC_RENDERERS_VULKAN_LIB_PHYSICAL_DEVICE_FEATURES_H

#include <volk.h>

#include <fennec/renderers/vulkan/lib/physical_device_properties.h>

namespace fennec::vk
{

// Device Features =====================================================================================================

///
/// \brief Core 1.1 Features
struct device_features_11 : private VkPhysicalDeviceVulkan11Features,

                            // Vulkan 1.1 Features
                            private VkPhysicalDevice16BitStorageFeatures,
                            private VkPhysicalDeviceMultiviewFeatures,
                            private VkPhysicalDeviceVariablePointersFeatures,
                            private VkPhysicalDeviceProtectedMemoryFeatures,
                            private VkPhysicalDeviceSamplerYcbcrConversionFeatures,
                            private VkPhysicalDeviceShaderDrawParametersFeatures {

// Public References ---------------------------------------------------------------------------------------------------
public:

    /// \name Features
    /// @{

    VkBool32* storageBuffer16BitAccess;           //!< Storage Buffer 16-Bit Access
    VkBool32* uniformAndStorageBuffer16BitAccess; //!< Uniform And Storage Buffer 16-Bit Access
    VkBool32* storagePushConstant16;              //!< Storage Push Constant 16
    VkBool32* storageInputOutput16;               //!< Storage Input Output 16
    VkBool32* multiview;                          //!< Multiview
    VkBool32* multiviewGeometryShader;            //!< Multiview Geometry Shader
    VkBool32* multiviewTessellationShader;        //!< Multiview Tessellation Shader
    VkBool32* variablePointersStorageBuffer;      //!< Variable Pointers Storage Buffer
    VkBool32* variablePointers;                   //!< Variable Pointers
    VkBool32* protectedMemory;                    //!< Protected Memory
    VkBool32* samplerYcbcrConversion;             //!< Sampler Ycbcr Conversion
    VkBool32* shaderDrawParameters;               //!< Shader Draw Parameters
    VkBool32  useCore;                            //!< Use Core

    /// @}


// Methods -------------------------------------------------------------------------------------------------------------
public:

    ///
    /// \brief Default Constructor
    /// \details Version information is necessary for this structure to fill itself in properly, so the default
    ///          constructor is not allowed.
    device_features_11() = delete;

    ///
    /// \brief Features Constructor
    /// \param properties Properties structure to poll necessary information
    device_features_11(const device_properties& properties)
        : VkPhysicalDeviceVulkan11Features { }
        , VkPhysicalDevice16BitStorageFeatures { }
        , VkPhysicalDeviceMultiviewFeatures { }
        , VkPhysicalDeviceVariablePointersFeatures { }
        , VkPhysicalDeviceProtectedMemoryFeatures { }
        , VkPhysicalDeviceSamplerYcbcrConversionFeatures { }
        , VkPhysicalDeviceShaderDrawParametersFeatures { }
        , storageBuffer16BitAccess { nullptr }
        , uniformAndStorageBuffer16BitAccess { nullptr }
        , storagePushConstant16 { nullptr }
        , storageInputOutput16 { nullptr }
        , multiview { nullptr }
        , multiviewGeometryShader { nullptr }
        , multiviewTessellationShader { nullptr }
        , variablePointersStorageBuffer { nullptr }
        , variablePointers { nullptr }
        , protectedMemory { nullptr }
        , samplerYcbcrConversion { nullptr }
        , shaderDrawParameters { nullptr }
        , useCore { properties.core10->apiVersion >= VK_API_VERSION_1_1 } {

        _clear();
        _link();

    }

    ///
    /// \brief Copy Constructor
    /// \param features The features structure to copy
    device_features_11(const device_features_11& features)
        : VkPhysicalDeviceVulkan11Features { features }
        , VkPhysicalDevice16BitStorageFeatures { features }
        , VkPhysicalDeviceMultiviewFeatures { features }
        , VkPhysicalDeviceVariablePointersFeatures { features }
        , VkPhysicalDeviceProtectedMemoryFeatures { features }
        , VkPhysicalDeviceSamplerYcbcrConversionFeatures { features }
        , VkPhysicalDeviceShaderDrawParametersFeatures { features }
        , storageBuffer16BitAccess { nullptr }
        , uniformAndStorageBuffer16BitAccess { nullptr }
        , storagePushConstant16 { nullptr }
        , storageInputOutput16 { nullptr }
        , multiview { nullptr }
        , multiviewGeometryShader { nullptr }
        , multiviewTessellationShader { nullptr }
        , variablePointersStorageBuffer { nullptr }
        , variablePointers { nullptr }
        , protectedMemory { nullptr }
        , samplerYcbcrConversion { nullptr }
        , shaderDrawParameters { nullptr }
        , useCore { features.useCore } {

        _link();
    }

    ///
    /// \brief Copy Assignment
    /// \param features The features to copy
    /// \returns A reference to \emph{this}
    device_features_11& operator=(const device_features_11& features) {
        if (this == &features) {
            return *this;
        }

        // Copy data
        VkPhysicalDeviceVulkan11Features::operator=(features);
        VkPhysicalDevice16BitStorageFeatures::operator=(features);
        VkPhysicalDeviceMultiviewFeatures::operator=(features);
        VkPhysicalDeviceVariablePointersFeatures::operator=(features);
        VkPhysicalDeviceProtectedMemoryFeatures::operator=(features);
        VkPhysicalDeviceSamplerYcbcrConversionFeatures::operator=(features);
        VkPhysicalDeviceShaderDrawParametersFeatures::operator=(features);
        useCore = features.useCore;

        _link();

        return *this;
    }

    ///
    /// \brief Chain an extension structure
    /// \param next
    void chain(void* next) {
        if (useCore) {
            VkPhysicalDeviceVulkan11Features::pNext = next;
        } else {
            VkPhysicalDeviceShaderDrawParametersFeatures::pNext = next;
        }
    }

    ///
    /// \brief Implicit casting for chaining
    operator void*() {
        if (useCore) {
            return static_cast<VkPhysicalDeviceVulkan11Features*>(this);
        } else {
            return static_cast<VkPhysicalDevice16BitStorageFeatures*>(this);
        }
    }


// Helpers -------------------------------------------------------------------------------------------------------------
private:

    void _clear() {
        // Clear out the struct
        fennec::memset(this, 0, sizeof(*this));

        // Set the structure types
        VkPhysicalDeviceVulkan11Features::sType               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES;
        VkPhysicalDevice16BitStorageFeatures::sType           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES;
        VkPhysicalDeviceMultiviewFeatures::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES;
        VkPhysicalDeviceVariablePointersFeatures::sType       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES;
        VkPhysicalDeviceProtectedMemoryFeatures::sType        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES;
        VkPhysicalDeviceSamplerYcbcrConversionFeatures::sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES;
        VkPhysicalDeviceShaderDrawParametersFeatures::sType   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES;
    }

    void _link() {

        // Check if we are Version 1.1 or later
        if (useCore) {

            // Link to core structure
            storageBuffer16BitAccess           = &(VkPhysicalDeviceVulkan11Features::storageBuffer16BitAccess);
            uniformAndStorageBuffer16BitAccess = &(VkPhysicalDeviceVulkan11Features::uniformAndStorageBuffer16BitAccess);
            storagePushConstant16              = &(VkPhysicalDeviceVulkan11Features::storagePushConstant16);
            storageInputOutput16               = &(VkPhysicalDeviceVulkan11Features::storageInputOutput16);
            multiview                          = &(VkPhysicalDeviceVulkan11Features::multiview);
            multiviewGeometryShader            = &(VkPhysicalDeviceVulkan11Features::multiviewGeometryShader);
            multiviewTessellationShader        = &(VkPhysicalDeviceVulkan11Features::multiviewTessellationShader);
            variablePointersStorageBuffer      = &(VkPhysicalDeviceVulkan11Features::variablePointersStorageBuffer);
            variablePointers                   = &(VkPhysicalDeviceVulkan11Features::variablePointers);
            protectedMemory                    = &(VkPhysicalDeviceVulkan11Features::protectedMemory);
            samplerYcbcrConversion             = &(VkPhysicalDeviceVulkan11Features::samplerYcbcrConversion);
            shaderDrawParameters               = &(VkPhysicalDeviceVulkan11Features::shaderDrawParameters);

            VkPhysicalDeviceVulkan11Features::pNext = nullptr;

            return;
        }


        // Link to features structures
        storageBuffer16BitAccess           = &(VkPhysicalDevice16BitStorageFeatures::storageBuffer16BitAccess);
        uniformAndStorageBuffer16BitAccess = &(VkPhysicalDevice16BitStorageFeatures::uniformAndStorageBuffer16BitAccess);
        storagePushConstant16              = &(VkPhysicalDevice16BitStorageFeatures::storagePushConstant16);
        storageInputOutput16               = &(VkPhysicalDevice16BitStorageFeatures::storageInputOutput16);
        multiview                          = &(VkPhysicalDeviceMultiviewFeatures::multiview);
        multiviewGeometryShader            = &(VkPhysicalDeviceMultiviewFeatures::multiviewGeometryShader);
        multiviewTessellationShader        = &(VkPhysicalDeviceMultiviewFeatures::multiviewTessellationShader);
        variablePointersStorageBuffer      = &(VkPhysicalDeviceVariablePointersFeatures::variablePointersStorageBuffer);
        variablePointers                   = &(VkPhysicalDeviceVariablePointersFeatures::variablePointers);
        protectedMemory                    = &(VkPhysicalDeviceProtectedMemoryFeatures::protectedMemory);
        samplerYcbcrConversion             = &(VkPhysicalDeviceSamplerYcbcrConversionFeatures::samplerYcbcrConversion);
        shaderDrawParameters               = &(VkPhysicalDeviceShaderDrawParametersFeatures::shaderDrawParameters);


        // Daisy chain
        VkPhysicalDevice16BitStorageFeatures::pNext           = static_cast<VkPhysicalDeviceMultiviewFeatures*>(this);
        VkPhysicalDeviceMultiviewFeatures::pNext              = static_cast<VkPhysicalDeviceVariablePointersFeatures*>(this);
        VkPhysicalDeviceVariablePointersFeatures::pNext       = static_cast<VkPhysicalDeviceProtectedMemoryFeatures*>(this);
        VkPhysicalDeviceProtectedMemoryFeatures::pNext        = static_cast<VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(this);
        VkPhysicalDeviceSamplerYcbcrConversionFeatures::pNext = static_cast<VkPhysicalDeviceShaderDrawParametersFeatures*>(this);
        VkPhysicalDeviceShaderDrawParametersFeatures::pNext   = nullptr;
    }
};

///
/// \brief Core 1.2 Features
struct device_features_12 : private VkPhysicalDeviceVulkan12Features,
                            private VkPhysicalDevice8BitStorageFeatures,
                            private VkPhysicalDeviceShaderAtomicInt64Features,
                            private VkPhysicalDeviceShaderFloat16Int8Features,
                            private VkPhysicalDeviceDescriptorIndexingFeatures,
                            private VkPhysicalDeviceScalarBlockLayoutFeatures,
                            private VkPhysicalDeviceImagelessFramebufferFeatures,
                            private VkPhysicalDeviceUniformBufferStandardLayoutFeatures,
                            private VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures,
                            private VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures,
                            private VkPhysicalDeviceHostQueryResetFeatures,
                            private VkPhysicalDeviceTimelineSemaphoreFeatures,
                            private VkPhysicalDeviceBufferDeviceAddressFeatures,
                            private VkPhysicalDeviceVulkanMemoryModelFeatures {

// Public References ---------------------------------------------------------------------------------------------------
public:

    /// \name Features
    /// @{

    VkBool32* samplerMirrorClampToEdge;                           //!< Sampler Mirror Clamp To Edge
    VkBool32* drawIndirectCount;                                  //!< Draw Indirect Count
    VkBool32* storageBuffer8BitAccess;                            //!< Storage Buffer 8-Bit Access
    VkBool32* uniformAndStorageBuffer8BitAccess;                  //!< Uniform And Storage Buffer 8-Bit Access
    VkBool32* storagePushConstant8;                               //!< Storage Push Constant 8
    VkBool32* shaderBufferInt64Atomics;                           //!< Shader Buffer Int64 Atomics
    VkBool32* shaderSharedInt64Atomics;                           //!< Shader Shared Int64 Atomics
    VkBool32* shaderFloat16;                                      //!< Shader Float16
    VkBool32* shaderInt8;                                         //!< Shader Int8
    VkBool32* descriptorIndexing;                                 //!< Descriptor Indexing
    VkBool32* shaderInputAttachmentArrayDynamicIndexing;          //!< Shader Input Attachment Array Dynamic Indexing
    VkBool32* shaderUniformTexelBufferArrayDynamicIndexing;       //!< Shader Uniform Texel Buffer Array Dynamic Indexing
    VkBool32* shaderStorageTexelBufferArrayDynamicIndexing;       //!< Shader Storage Texel Buffer Array Dynamic Indexing
    VkBool32* shaderUniformBufferArrayNonUniformIndexing;         //!< Shader Uniform Buffer Array Non-Uniform Indexing
    VkBool32* shaderSampledImageArrayNonUniformIndexing;          //!< Shader Sampled Image Array Non-Uniform Indexing
    VkBool32* shaderStorageBufferArrayNonUniformIndexing;         //!< Shader Storage Buffer Array Non-Uniform Indexing
    VkBool32* shaderStorageImageArrayNonUniformIndexing;          //!< Shader Storage Image Array Non-Uniform Indexing
    VkBool32* shaderInputAttachmentArrayNonUniformIndexing;       //!< Shader Input Attachment Array Non-Uniform Indexing
    VkBool32* shaderUniformTexelBufferArrayNonUniformIndexing;    //!< Shader Uniform Texel Buffer Array Non-Uniform Indexing
    VkBool32* shaderStorageTexelBufferArrayNonUniformIndexing;    //!< Shader Storage Texel Buffer Array Non-Uniform Indexing
    VkBool32* descriptorBindingUniformBufferUpdateAfterBind;      //!< Descriptor Binding Uniform Buffer Update After Bind
    VkBool32* descriptorBindingSampledImageUpdateAfterBind;       //!< Descriptor Binding Sampled Image Update After Bind
    VkBool32* descriptorBindingStorageImageUpdateAfterBind;       //!< Descriptor Binding Storage Image Update After Bind
    VkBool32* descriptorBindingStorageBufferUpdateAfterBind;      //!< Descriptor Binding Storage Buffer Update After Bind
    VkBool32* descriptorBindingUniformTexelBufferUpdateAfterBind; //!< Descriptor Binding Uniform Texel Buffer Update After Bind
    VkBool32* descriptorBindingStorageTexelBufferUpdateAfterBind; //!< Descriptor Binding Storage Texel Buffer Update After Bind
    VkBool32* descriptorBindingUpdateUnusedWhilePending;          //!< Descriptor Binding Update Unused While Pending
    VkBool32* descriptorBindingPartiallyBound;                    //!< Descriptor Binding Partially Bound
    VkBool32* descriptorBindingVariableDescriptorCount;           //!< Descriptor Binding Variable Descriptor Count
    VkBool32* runtimeDescriptorArray;                             //!< Runtime Descriptor Array
    VkBool32* samplerFilterMinmax;                                //!< Sampler Filter Minmax
    VkBool32* scalarBlockLayout;                                  //!< Scalar Block Layout
    VkBool32* imagelessFramebuffer;                               //!< Imageless Framebuffer
    VkBool32* uniformBufferStandardLayout;                        //!< Uniform Buffer Standard Layout
    VkBool32* shaderSubgroupExtendedTypes;                        //!< Shader Subgroup Extended Types
    VkBool32* separateDepthStencilLayouts;                        //!< Separate Depth Stencil Layouts
    VkBool32* hostQueryReset;                                     //!< Host Query Reset
    VkBool32* timelineSemaphore;                                  //!< Timeline Semaphore
    VkBool32* bufferDeviceAddress;                                //!< Buffer Device Address
    VkBool32* bufferDeviceAddressCaptureReplay;                   //!< Buffer Device Address Capture Replay
    VkBool32* bufferDeviceAddressMultiDevice;                     //!< Buffer Device Address Multi Device
    VkBool32* vulkanMemoryModel;                                  //!< Vulkan Memory Model
    VkBool32* vulkanMemoryModelDeviceScope;                       //!< Vulkan Memory Model Device Scope
    VkBool32* vulkanMemoryModelAvailabilityVisibilityChains;      //!< Vulkan Memory Model Availability Visibility Chains
    VkBool32* shaderOutputViewportIndex;                          //!< Shader Output Viewport Index
    VkBool32* shaderOutputLayer;                                  //!< Shader Output Layer
    VkBool32* subgroupBroadcastDynamicId;                         //!< Subgroup Broadcast Dynamic ID
    VkBool32  useCore;                                            //!< Use Core

    /// @}


// Methods -------------------------------------------------------------------------------------------------------------
public:

    ///
    /// \brief Default Constructor
    /// \details Version information is necessary for this structure to fill itself in properly, so the default
    ///          constructor is not allowed.
    device_features_12() = delete;

    ///
    /// \brief Features Constructor
    /// \param properties Properties structure to poll necessary information
    device_features_12(const device_properties& properties)
        : VkPhysicalDeviceVulkan12Features { }
        , VkPhysicalDevice8BitStorageFeatures { }
        , VkPhysicalDeviceShaderAtomicInt64Features { }
        , VkPhysicalDeviceShaderFloat16Int8Features { }
        , VkPhysicalDeviceDescriptorIndexingFeatures { }
        , VkPhysicalDeviceScalarBlockLayoutFeatures { }
        , VkPhysicalDeviceImagelessFramebufferFeatures { }
        , VkPhysicalDeviceUniformBufferStandardLayoutFeatures { }
        , VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures { }
        , VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures { }
        , VkPhysicalDeviceHostQueryResetFeatures { }
        , VkPhysicalDeviceTimelineSemaphoreFeatures { }
        , VkPhysicalDeviceBufferDeviceAddressFeatures { }
        , VkPhysicalDeviceVulkanMemoryModelFeatures { }
        , samplerMirrorClampToEdge { nullptr }
        , drawIndirectCount { nullptr }
        , storageBuffer8BitAccess { nullptr }
        , uniformAndStorageBuffer8BitAccess { nullptr }
        , storagePushConstant8 { nullptr }
        , shaderBufferInt64Atomics { nullptr }
        , shaderSharedInt64Atomics { nullptr }
        , shaderFloat16 { nullptr }
        , shaderInt8 { nullptr }
        , descriptorIndexing { nullptr }
        , shaderInputAttachmentArrayDynamicIndexing { nullptr }
        , shaderUniformTexelBufferArrayDynamicIndexing { nullptr }
        , shaderStorageTexelBufferArrayDynamicIndexing { nullptr }
        , shaderUniformBufferArrayNonUniformIndexing { nullptr }
        , shaderSampledImageArrayNonUniformIndexing { nullptr }
        , shaderStorageBufferArrayNonUniformIndexing { nullptr }
        , shaderStorageImageArrayNonUniformIndexing { nullptr }
        , shaderInputAttachmentArrayNonUniformIndexing { nullptr }
        , shaderUniformTexelBufferArrayNonUniformIndexing { nullptr }
        , shaderStorageTexelBufferArrayNonUniformIndexing { nullptr }
        , descriptorBindingUniformBufferUpdateAfterBind { nullptr }
        , descriptorBindingSampledImageUpdateAfterBind { nullptr }
        , descriptorBindingStorageImageUpdateAfterBind { nullptr }
        , descriptorBindingStorageBufferUpdateAfterBind { nullptr }
        , descriptorBindingUniformTexelBufferUpdateAfterBind { nullptr }
        , descriptorBindingStorageTexelBufferUpdateAfterBind { nullptr }
        , descriptorBindingUpdateUnusedWhilePending { nullptr }
        , descriptorBindingPartiallyBound { nullptr }
        , descriptorBindingVariableDescriptorCount { nullptr }
        , runtimeDescriptorArray { nullptr }
        , samplerFilterMinmax { nullptr }
        , scalarBlockLayout { nullptr }
        , imagelessFramebuffer { nullptr }
        , uniformBufferStandardLayout { nullptr }
        , shaderSubgroupExtendedTypes { nullptr }
        , separateDepthStencilLayouts { nullptr }
        , hostQueryReset { nullptr }
        , timelineSemaphore { nullptr }
        , bufferDeviceAddress { nullptr }
        , bufferDeviceAddressCaptureReplay { nullptr }
        , bufferDeviceAddressMultiDevice { nullptr }
        , vulkanMemoryModel { nullptr }
        , vulkanMemoryModelDeviceScope { nullptr }
        , vulkanMemoryModelAvailabilityVisibilityChains { nullptr }
        , shaderOutputViewportIndex { nullptr }
        , shaderOutputLayer { nullptr }
        , subgroupBroadcastDynamicId { nullptr }
        , useCore { properties.core10->apiVersion >= VK_API_VERSION_1_2 } {

        _clear();
        _link();
    }

    ///
    /// \brief Copy Constructor
    /// \param features The features structure to copy
    device_features_12(const device_features_12& features)
        : VkPhysicalDeviceVulkan12Features { features }
        , VkPhysicalDevice8BitStorageFeatures { features }
        , VkPhysicalDeviceShaderAtomicInt64Features { features }
        , VkPhysicalDeviceShaderFloat16Int8Features { features }
        , VkPhysicalDeviceDescriptorIndexingFeatures { features }
        , VkPhysicalDeviceScalarBlockLayoutFeatures { features }
        , VkPhysicalDeviceImagelessFramebufferFeatures { features }
        , VkPhysicalDeviceUniformBufferStandardLayoutFeatures { features }
        , VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures { features }
        , VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures { features }
        , VkPhysicalDeviceHostQueryResetFeatures { features }
        , VkPhysicalDeviceTimelineSemaphoreFeatures { features }
        , VkPhysicalDeviceBufferDeviceAddressFeatures { features }
        , VkPhysicalDeviceVulkanMemoryModelFeatures { features }
        , samplerMirrorClampToEdge { nullptr }
        , drawIndirectCount { nullptr }
        , storageBuffer8BitAccess { nullptr }
        , uniformAndStorageBuffer8BitAccess { nullptr }
        , storagePushConstant8 { nullptr }
        , shaderBufferInt64Atomics { nullptr }
        , shaderSharedInt64Atomics { nullptr }
        , shaderFloat16 { nullptr }
        , shaderInt8 { nullptr }
        , descriptorIndexing { nullptr }
        , shaderInputAttachmentArrayDynamicIndexing { nullptr }
        , shaderUniformTexelBufferArrayDynamicIndexing { nullptr }
        , shaderStorageTexelBufferArrayDynamicIndexing { nullptr }
        , shaderUniformBufferArrayNonUniformIndexing { nullptr }
        , shaderSampledImageArrayNonUniformIndexing { nullptr }
        , shaderStorageBufferArrayNonUniformIndexing { nullptr }
        , shaderStorageImageArrayNonUniformIndexing { nullptr }
        , shaderInputAttachmentArrayNonUniformIndexing { nullptr }
        , shaderUniformTexelBufferArrayNonUniformIndexing { nullptr }
        , shaderStorageTexelBufferArrayNonUniformIndexing { nullptr }
        , descriptorBindingUniformBufferUpdateAfterBind { nullptr }
        , descriptorBindingSampledImageUpdateAfterBind { nullptr }
        , descriptorBindingStorageImageUpdateAfterBind { nullptr }
        , descriptorBindingStorageBufferUpdateAfterBind { nullptr }
        , descriptorBindingUniformTexelBufferUpdateAfterBind { nullptr }
        , descriptorBindingStorageTexelBufferUpdateAfterBind { nullptr }
        , descriptorBindingUpdateUnusedWhilePending { nullptr }
        , descriptorBindingPartiallyBound { nullptr }
        , descriptorBindingVariableDescriptorCount { nullptr }
        , runtimeDescriptorArray { nullptr }
        , samplerFilterMinmax { nullptr }
        , scalarBlockLayout { nullptr }
        , imagelessFramebuffer { nullptr }
        , uniformBufferStandardLayout { nullptr }
        , shaderSubgroupExtendedTypes { nullptr }
        , separateDepthStencilLayouts { nullptr }
        , hostQueryReset { nullptr }
        , timelineSemaphore { nullptr }
        , bufferDeviceAddress { nullptr }
        , bufferDeviceAddressCaptureReplay { nullptr }
        , bufferDeviceAddressMultiDevice { nullptr }
        , vulkanMemoryModel { nullptr }
        , vulkanMemoryModelDeviceScope { nullptr }
        , vulkanMemoryModelAvailabilityVisibilityChains { nullptr }
        , shaderOutputViewportIndex { nullptr }
        , shaderOutputLayer { nullptr }
        , subgroupBroadcastDynamicId { nullptr }
        , useCore { features.useCore } {

        _link();
    }

    ///
    /// \brief Copy Constructor
    /// \param features The features structure to copy
    /// \returns A reference to \emph{self}
    device_features_12& operator=(const device_features_12& features) {
        if (this == &features) {
            return *this;
        }

        // Copy data
        VkPhysicalDeviceVulkan12Features::operator=(features);
        VkPhysicalDevice8BitStorageFeatures::operator=(features);
        VkPhysicalDeviceShaderAtomicInt64Features::operator=(features);
        VkPhysicalDeviceShaderFloat16Int8Features::operator=(features);
        VkPhysicalDeviceDescriptorIndexingFeatures::operator=(features);
        VkPhysicalDeviceScalarBlockLayoutFeatures::operator=(features);
        VkPhysicalDeviceImagelessFramebufferFeatures::operator=(features);
        VkPhysicalDeviceUniformBufferStandardLayoutFeatures::operator=(features);
        VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures::operator=(features);
        VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures::operator=(features);
        VkPhysicalDeviceHostQueryResetFeatures::operator=(features);
        VkPhysicalDeviceTimelineSemaphoreFeatures::operator=(features);
        VkPhysicalDeviceBufferDeviceAddressFeatures::operator=(features);
        VkPhysicalDeviceVulkanMemoryModelFeatures::operator=(features);
        useCore = features.useCore;

        _link();

        return *this;
    }

    ///
    /// \brief Chain an extension structure
    /// \param next
    void chain(void* next) {
        if (useCore) {
            VkPhysicalDeviceVulkan12Features::pNext = next;
        } else {
            VkPhysicalDeviceVulkanMemoryModelFeatures::pNext = next;
        }
    }

    ///
    /// \brief Implicit casting for chaining
    operator void*() {
        if (useCore) {
            return static_cast<VkPhysicalDeviceVulkan12Features*>(this);
        } else {
            return static_cast<VkPhysicalDevice8BitStorageFeatures*>(this);
        }
    }


// Helpers -------------------------------------------------------------------------------------------------------------
private:

    void _clear() {

        // Clear out the struct
        fennec::memset(this, 0, sizeof(*this));

        // Set structure types
        VkPhysicalDeviceVulkan12Features::sType                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES;
        VkPhysicalDevice8BitStorageFeatures::sType                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES;
        VkPhysicalDeviceShaderAtomicInt64Features::sType           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES;
        VkPhysicalDeviceShaderFloat16Int8Features::sType           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES;
        VkPhysicalDeviceDescriptorIndexingFeatures::sType          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES;
        VkPhysicalDeviceScalarBlockLayoutFeatures::sType           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES;
        VkPhysicalDeviceImagelessFramebufferFeatures::sType        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES;
        VkPhysicalDeviceUniformBufferStandardLayoutFeatures::sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES;
        VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures::sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES;
        VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures::sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES;
        VkPhysicalDeviceHostQueryResetFeatures::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES;
        VkPhysicalDeviceTimelineSemaphoreFeatures::sType           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES;
        VkPhysicalDeviceBufferDeviceAddressFeatures::sType         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES;
        VkPhysicalDeviceVulkanMemoryModelFeatures::sType           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES;
    }

    void _link() {



        // Check if we are Version 1.2 or later.
        if (useCore) {

            // Link to Core structure
            samplerMirrorClampToEdge                           = &(VkPhysicalDeviceVulkan12Features::samplerMirrorClampToEdge);
            drawIndirectCount                                  = &(VkPhysicalDeviceVulkan12Features::drawIndirectCount);
            storageBuffer8BitAccess                            = &(VkPhysicalDeviceVulkan12Features::storageBuffer8BitAccess);
            uniformAndStorageBuffer8BitAccess                  = &(VkPhysicalDeviceVulkan12Features::uniformAndStorageBuffer8BitAccess);
            storagePushConstant8                               = &(VkPhysicalDeviceVulkan12Features::storagePushConstant8);
            shaderBufferInt64Atomics                           = &(VkPhysicalDeviceVulkan12Features::shaderBufferInt64Atomics);
            shaderSharedInt64Atomics                           = &(VkPhysicalDeviceVulkan12Features::shaderSharedInt64Atomics);
            shaderFloat16                                      = &(VkPhysicalDeviceVulkan12Features::shaderFloat16);
            shaderInt8                                         = &(VkPhysicalDeviceVulkan12Features::shaderInt8);
            descriptorIndexing                                 = &(VkPhysicalDeviceVulkan12Features::descriptorIndexing);
            shaderInputAttachmentArrayDynamicIndexing          = &(VkPhysicalDeviceVulkan12Features::shaderInputAttachmentArrayDynamicIndexing);
            shaderUniformTexelBufferArrayDynamicIndexing       = &(VkPhysicalDeviceVulkan12Features::shaderUniformTexelBufferArrayDynamicIndexing);
            shaderStorageTexelBufferArrayDynamicIndexing       = &(VkPhysicalDeviceVulkan12Features::shaderStorageTexelBufferArrayDynamicIndexing);
            shaderUniformBufferArrayNonUniformIndexing         = &(VkPhysicalDeviceVulkan12Features::shaderUniformBufferArrayNonUniformIndexing);
            shaderSampledImageArrayNonUniformIndexing          = &(VkPhysicalDeviceVulkan12Features::shaderSampledImageArrayNonUniformIndexing);
            shaderStorageBufferArrayNonUniformIndexing         = &(VkPhysicalDeviceVulkan12Features::shaderStorageBufferArrayNonUniformIndexing);
            shaderStorageImageArrayNonUniformIndexing          = &(VkPhysicalDeviceVulkan12Features::shaderStorageImageArrayNonUniformIndexing);
            shaderInputAttachmentArrayNonUniformIndexing       = &(VkPhysicalDeviceVulkan12Features::shaderInputAttachmentArrayNonUniformIndexing);
            shaderUniformTexelBufferArrayNonUniformIndexing    = &(VkPhysicalDeviceVulkan12Features::shaderUniformTexelBufferArrayNonUniformIndexing);
            shaderStorageTexelBufferArrayNonUniformIndexing    = &(VkPhysicalDeviceVulkan12Features::shaderStorageTexelBufferArrayNonUniformIndexing);
            descriptorBindingUniformBufferUpdateAfterBind      = &(VkPhysicalDeviceVulkan12Features::descriptorBindingUniformBufferUpdateAfterBind);
            descriptorBindingSampledImageUpdateAfterBind       = &(VkPhysicalDeviceVulkan12Features::descriptorBindingSampledImageUpdateAfterBind);
            descriptorBindingStorageImageUpdateAfterBind       = &(VkPhysicalDeviceVulkan12Features::descriptorBindingStorageImageUpdateAfterBind);
            descriptorBindingStorageBufferUpdateAfterBind      = &(VkPhysicalDeviceVulkan12Features::descriptorBindingStorageBufferUpdateAfterBind);
            descriptorBindingUniformTexelBufferUpdateAfterBind = &(VkPhysicalDeviceVulkan12Features::descriptorBindingUniformTexelBufferUpdateAfterBind);
            descriptorBindingStorageTexelBufferUpdateAfterBind = &(VkPhysicalDeviceVulkan12Features::descriptorBindingStorageTexelBufferUpdateAfterBind);
            descriptorBindingUpdateUnusedWhilePending          = &(VkPhysicalDeviceVulkan12Features::descriptorBindingUpdateUnusedWhilePending);
            descriptorBindingPartiallyBound                    = &(VkPhysicalDeviceVulkan12Features::descriptorBindingPartiallyBound);
            descriptorBindingVariableDescriptorCount           = &(VkPhysicalDeviceVulkan12Features::descriptorBindingVariableDescriptorCount);
            runtimeDescriptorArray                             = &(VkPhysicalDeviceVulkan12Features::runtimeDescriptorArray);
            samplerFilterMinmax                                = &(VkPhysicalDeviceVulkan12Features::samplerFilterMinmax);
            scalarBlockLayout                                  = &(VkPhysicalDeviceVulkan12Features::scalarBlockLayout);
            imagelessFramebuffer                               = &(VkPhysicalDeviceVulkan12Features::imagelessFramebuffer);
            uniformBufferStandardLayout                        = &(VkPhysicalDeviceVulkan12Features::uniformBufferStandardLayout);
            shaderSubgroupExtendedTypes                        = &(VkPhysicalDeviceVulkan12Features::shaderSubgroupExtendedTypes);
            separateDepthStencilLayouts                        = &(VkPhysicalDeviceVulkan12Features::separateDepthStencilLayouts);
            hostQueryReset                                     = &(VkPhysicalDeviceVulkan12Features::hostQueryReset);
            timelineSemaphore                                  = &(VkPhysicalDeviceVulkan12Features::timelineSemaphore);
            bufferDeviceAddress                                = &(VkPhysicalDeviceVulkan12Features::bufferDeviceAddress);
            bufferDeviceAddressCaptureReplay                   = &(VkPhysicalDeviceVulkan12Features::bufferDeviceAddressCaptureReplay);
            bufferDeviceAddressMultiDevice                     = &(VkPhysicalDeviceVulkan12Features::bufferDeviceAddressMultiDevice);
            vulkanMemoryModel                                  = &(VkPhysicalDeviceVulkan12Features::vulkanMemoryModel);
            vulkanMemoryModelDeviceScope                       = &(VkPhysicalDeviceVulkan12Features::vulkanMemoryModelDeviceScope);
            vulkanMemoryModelAvailabilityVisibilityChains      = &(VkPhysicalDeviceVulkan12Features::vulkanMemoryModelAvailabilityVisibilityChains);
            shaderOutputViewportIndex                          = &(VkPhysicalDeviceVulkan12Features::shaderOutputViewportIndex);
            shaderOutputLayer                                  = &(VkPhysicalDeviceVulkan12Features::shaderOutputLayer);
            subgroupBroadcastDynamicId                         = &(VkPhysicalDeviceVulkan12Features::subgroupBroadcastDynamicId);

            VkPhysicalDeviceVulkan12Features::pNext = nullptr;

            return;
        }


        // Link to Feature structures
        storageBuffer8BitAccess                            = &(VkPhysicalDevice8BitStorageFeatures::storageBuffer8BitAccess);
        uniformAndStorageBuffer8BitAccess                  = &(VkPhysicalDevice8BitStorageFeatures::uniformAndStorageBuffer8BitAccess);
        storagePushConstant8                               = &(VkPhysicalDevice8BitStorageFeatures::storagePushConstant8);
        shaderBufferInt64Atomics                           = &(VkPhysicalDeviceShaderAtomicInt64Features::shaderBufferInt64Atomics);
        shaderSharedInt64Atomics                           = &(VkPhysicalDeviceShaderAtomicInt64Features::shaderSharedInt64Atomics);
        shaderFloat16                                      = &(VkPhysicalDeviceShaderFloat16Int8Features::shaderFloat16);
        shaderInt8                                         = &(VkPhysicalDeviceShaderFloat16Int8Features::shaderInt8);
        shaderInputAttachmentArrayDynamicIndexing          = &(VkPhysicalDeviceDescriptorIndexingFeatures::shaderInputAttachmentArrayDynamicIndexing);
        shaderUniformTexelBufferArrayDynamicIndexing       = &(VkPhysicalDeviceDescriptorIndexingFeatures::shaderUniformTexelBufferArrayDynamicIndexing);
        shaderStorageTexelBufferArrayDynamicIndexing       = &(VkPhysicalDeviceDescriptorIndexingFeatures::shaderStorageTexelBufferArrayDynamicIndexing);
        shaderUniformBufferArrayNonUniformIndexing         = &(VkPhysicalDeviceDescriptorIndexingFeatures::shaderUniformBufferArrayNonUniformIndexing);
        shaderSampledImageArrayNonUniformIndexing          = &(VkPhysicalDeviceDescriptorIndexingFeatures::shaderSampledImageArrayNonUniformIndexing);
        shaderStorageBufferArrayNonUniformIndexing         = &(VkPhysicalDeviceDescriptorIndexingFeatures::shaderStorageBufferArrayNonUniformIndexing);
        shaderStorageImageArrayNonUniformIndexing          = &(VkPhysicalDeviceDescriptorIndexingFeatures::shaderStorageImageArrayNonUniformIndexing);
        shaderInputAttachmentArrayNonUniformIndexing       = &(VkPhysicalDeviceDescriptorIndexingFeatures::shaderInputAttachmentArrayNonUniformIndexing);
        shaderUniformTexelBufferArrayNonUniformIndexing    = &(VkPhysicalDeviceDescriptorIndexingFeatures::shaderUniformTexelBufferArrayNonUniformIndexing);
        shaderStorageTexelBufferArrayNonUniformIndexing    = &(VkPhysicalDeviceDescriptorIndexingFeatures::shaderStorageTexelBufferArrayNonUniformIndexing);
        descriptorBindingUniformBufferUpdateAfterBind      = &(VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingUniformBufferUpdateAfterBind);
        descriptorBindingSampledImageUpdateAfterBind       = &(VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingSampledImageUpdateAfterBind);
        descriptorBindingStorageImageUpdateAfterBind       = &(VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingStorageImageUpdateAfterBind);
        descriptorBindingStorageBufferUpdateAfterBind      = &(VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingStorageBufferUpdateAfterBind);
        descriptorBindingUniformTexelBufferUpdateAfterBind = &(VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingUniformTexelBufferUpdateAfterBind);
        descriptorBindingStorageTexelBufferUpdateAfterBind = &(VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingStorageTexelBufferUpdateAfterBind);
        descriptorBindingUpdateUnusedWhilePending          = &(VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingUpdateUnusedWhilePending);
        descriptorBindingPartiallyBound                    = &(VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingPartiallyBound);
        descriptorBindingVariableDescriptorCount           = &(VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingVariableDescriptorCount);
        runtimeDescriptorArray                             = &(VkPhysicalDeviceDescriptorIndexingFeatures::runtimeDescriptorArray);
        scalarBlockLayout                                  = &(VkPhysicalDeviceScalarBlockLayoutFeatures::scalarBlockLayout);
        imagelessFramebuffer                               = &(VkPhysicalDeviceImagelessFramebufferFeatures::imagelessFramebuffer);
        uniformBufferStandardLayout                        = &(VkPhysicalDeviceUniformBufferStandardLayoutFeatures::uniformBufferStandardLayout);
        shaderSubgroupExtendedTypes                        = &(VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures::shaderSubgroupExtendedTypes);
        separateDepthStencilLayouts                        = &(VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures::separateDepthStencilLayouts);
        hostQueryReset                                     = &(VkPhysicalDeviceHostQueryResetFeatures::hostQueryReset);
        timelineSemaphore                                  = &(VkPhysicalDeviceTimelineSemaphoreFeatures::timelineSemaphore);
        bufferDeviceAddress                                = &(VkPhysicalDeviceBufferDeviceAddressFeatures::bufferDeviceAddress);
        bufferDeviceAddressCaptureReplay                   = &(VkPhysicalDeviceBufferDeviceAddressFeatures::bufferDeviceAddressCaptureReplay);
        bufferDeviceAddressMultiDevice                     = &(VkPhysicalDeviceBufferDeviceAddressFeatures::bufferDeviceAddressMultiDevice);
        vulkanMemoryModel                                  = &(VkPhysicalDeviceVulkanMemoryModelFeatures::vulkanMemoryModel);
        vulkanMemoryModelDeviceScope                       = &(VkPhysicalDeviceVulkanMemoryModelFeatures::vulkanMemoryModelDeviceScope);
        vulkanMemoryModelAvailabilityVisibilityChains      = &(VkPhysicalDeviceVulkanMemoryModelFeatures::vulkanMemoryModelAvailabilityVisibilityChains);

        // These features are only available in 1.2 Core
//      samplerMirrorClampToEdge                           = &(VkPhysicalDeviceVulkan12Features::samplerMirrorClampToEdge);
//      drawIndirectCount                                  = &(VkPhysicalDeviceVulkan12Features::drawIndirectCount);
//      samplerFilterMinmax                                = &(VkPhysicalDeviceVulkan12Features::samplerFilterMinmax);
//      shaderOutputViewportIndex                          = &(VkPhysicalDeviceVulkan12Features::shaderOutputViewportIndex);
//      shaderOutputLayer                                  = &(VkPhysicalDeviceVulkan12Features::shaderOutputLayer);
//      subgroupBroadcastDynamicId                         = &(VkPhysicalDeviceVulkan12Features::subgroupBroadcastDynamicId);


        // Daisy chain
        VkPhysicalDevice8BitStorageFeatures::pNext                 = static_cast<VkPhysicalDeviceShaderAtomicInt64Features*>(this);
        VkPhysicalDeviceShaderAtomicInt64Features::pNext           = static_cast<VkPhysicalDeviceShaderFloat16Int8Features*>(this);
        VkPhysicalDeviceShaderFloat16Int8Features::pNext           = static_cast<VkPhysicalDeviceDescriptorIndexingFeatures*>(this);
        VkPhysicalDeviceDescriptorIndexingFeatures::pNext          = static_cast<VkPhysicalDeviceScalarBlockLayoutFeatures*>(this);
        VkPhysicalDeviceScalarBlockLayoutFeatures::pNext           = static_cast<VkPhysicalDeviceImagelessFramebufferFeatures*>(this);
        VkPhysicalDeviceImagelessFramebufferFeatures::pNext        = static_cast<VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(this);
        VkPhysicalDeviceUniformBufferStandardLayoutFeatures::pNext = static_cast<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(this);
        VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures::pNext = static_cast<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(this);
        VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures::pNext = static_cast<VkPhysicalDeviceHostQueryResetFeatures*>(this);
        VkPhysicalDeviceHostQueryResetFeatures::pNext              = static_cast<VkPhysicalDeviceTimelineSemaphoreFeatures*>(this);
        VkPhysicalDeviceTimelineSemaphoreFeatures::pNext           = static_cast<VkPhysicalDeviceBufferDeviceAddressFeatures*>(this);
        VkPhysicalDeviceBufferDeviceAddressFeatures::pNext         = static_cast<VkPhysicalDeviceVulkanMemoryModelFeatures*>(this);
        VkPhysicalDeviceVulkanMemoryModelFeatures::pNext           = nullptr;
    }
};

///
/// \brief Core 1.3 Features
struct device_features_13 : private VkPhysicalDeviceVulkan13Features,
                            private VkPhysicalDeviceImageRobustnessFeatures,
                            private VkPhysicalDeviceInlineUniformBlockFeatures,
                            private VkPhysicalDevicePipelineCreationCacheControlFeatures,
                            private VkPhysicalDevicePrivateDataFeatures,
                            private VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures,
                            private VkPhysicalDeviceShaderTerminateInvocationFeatures,
                            private VkPhysicalDeviceSubgroupSizeControlFeatures,
                            private VkPhysicalDeviceSynchronization2Features,
                            private VkPhysicalDeviceTextureCompressionASTCHDRFeatures,
                            private VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures,
                            private VkPhysicalDeviceDynamicRenderingFeatures,
                            private VkPhysicalDeviceShaderIntegerDotProductFeatures,
                            private VkPhysicalDeviceMaintenance4Features {

// Public References ---------------------------------------------------------------------------------------------------
public:

    /// \name Features
    /// @{

    VkBool32* robustImageAccess;                                  //!< Robust Image Access
    VkBool32* inlineUniformBlock;                                 //!< Inline Uniform Block
    VkBool32* descriptorBindingInlineUniformBlockUpdateAfterBind; //!< Descriptor Binding Inline Uniform Block Update After Bind
    VkBool32* pipelineCreationCacheControl;                       //!< Pipeline Creation Cache Control
    VkBool32* privateData;                                        //!< Private Data
    VkBool32* shaderDemoteToHelperInvocation;                     //!< Shader Demote To Helper Invocation
    VkBool32* shaderTerminateInvocation;                          //!< Shader Terminate Invocation
    VkBool32* subgroupSizeControl;                                //!< Subgroup Size Control
    VkBool32* computeFullSubgroups;                               //!< Compute Full Subgroups
    VkBool32* synchronization2;                                   //!< Synchronization 2
    VkBool32* textureCompressionASTC_HDR;                         //!< Texture Compression Astc Hdr
    VkBool32* shaderZeroInitializeWorkgroupMemory;                //!< Shader Zero Initialize Workgroup Memory
    VkBool32* dynamicRendering;                                   //!< Dynamic Rendering
    VkBool32* shaderIntegerDotProduct;                            //!< Shader Integer Dot Product
    VkBool32* maintenance4;                                       //!< Maintenance 4
    VkBool32  useCore;                                            //!< Use Core

    /// @}


// Methods -------------------------------------------------------------------------------------------------------------
public:

    ///
    /// \brief Default Constructor
    /// \details Version information is necessary for this structure to fill itself in properly, so the default
    ///          constructor is not allowed.
    device_features_13() = delete;

    ///
    /// \brief Features Constructor
    /// \param properties Properties structure to poll necessary information
    device_features_13(const device_properties& properties)
        : VkPhysicalDeviceVulkan13Features { }
        , VkPhysicalDeviceImageRobustnessFeatures { }
        , VkPhysicalDeviceInlineUniformBlockFeatures { }
        , VkPhysicalDevicePipelineCreationCacheControlFeatures { }
        , VkPhysicalDevicePrivateDataFeatures { }
        , VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures { }
        , VkPhysicalDeviceShaderTerminateInvocationFeatures { }
        , VkPhysicalDeviceSubgroupSizeControlFeatures { }
        , VkPhysicalDeviceSynchronization2Features { }
        , VkPhysicalDeviceTextureCompressionASTCHDRFeatures { }
        , VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures { }
        , VkPhysicalDeviceDynamicRenderingFeatures { }
        , VkPhysicalDeviceShaderIntegerDotProductFeatures { }
        , VkPhysicalDeviceMaintenance4Features { }
        , robustImageAccess { nullptr }
        , inlineUniformBlock { nullptr }
        , descriptorBindingInlineUniformBlockUpdateAfterBind { nullptr }
        , pipelineCreationCacheControl { nullptr }
        , privateData { nullptr }
        , shaderDemoteToHelperInvocation { nullptr }
        , shaderTerminateInvocation { nullptr }
        , subgroupSizeControl { nullptr }
        , computeFullSubgroups { nullptr }
        , synchronization2 { nullptr }
        , textureCompressionASTC_HDR { nullptr }
        , shaderZeroInitializeWorkgroupMemory { nullptr }
        , dynamicRendering { nullptr }
        , shaderIntegerDotProduct { nullptr }
        , maintenance4 { nullptr }
        , useCore { properties.core10->apiVersion >= VK_API_VERSION_1_3 } {

        _clear();
        _link();
    }

    ///
    /// \brief Copy Constructor
    /// \param features The features structure to copy
    device_features_13(const device_features_13& features)
        : VkPhysicalDeviceVulkan13Features { features }
        , VkPhysicalDeviceImageRobustnessFeatures { features }
        , VkPhysicalDeviceInlineUniformBlockFeatures { features }
        , VkPhysicalDevicePipelineCreationCacheControlFeatures { features }
        , VkPhysicalDevicePrivateDataFeatures { features }
        , VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures { features }
        , VkPhysicalDeviceShaderTerminateInvocationFeatures { features }
        , VkPhysicalDeviceSubgroupSizeControlFeatures { features }
        , VkPhysicalDeviceSynchronization2Features { features }
        , VkPhysicalDeviceTextureCompressionASTCHDRFeatures { features }
        , VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures { features }
        , VkPhysicalDeviceDynamicRenderingFeatures { features }
        , VkPhysicalDeviceShaderIntegerDotProductFeatures { features }
        , VkPhysicalDeviceMaintenance4Features { features }
        , robustImageAccess { nullptr }
        , inlineUniformBlock { nullptr }
        , descriptorBindingInlineUniformBlockUpdateAfterBind { nullptr }
        , pipelineCreationCacheControl { nullptr }
        , privateData { nullptr }
        , shaderDemoteToHelperInvocation { nullptr }
        , shaderTerminateInvocation { nullptr }
        , subgroupSizeControl { nullptr }
        , computeFullSubgroups { nullptr }
        , synchronization2 { nullptr }
        , textureCompressionASTC_HDR { nullptr }
        , shaderZeroInitializeWorkgroupMemory { nullptr }
        , dynamicRendering { nullptr }
        , shaderIntegerDotProduct { nullptr }
        , maintenance4 { nullptr }
        , useCore { features.useCore } {

        _link();
    }

    ///
    /// \brief Copy Constructor
    /// \param features The features structure to copy
    /// \returns A reference to \emph{self}
    device_features_13& operator=(const device_features_13& features) {
        if (this == &features) {
            return *this;
        }

        // Copy data
        VkPhysicalDeviceVulkan13Features::operator=(features);
        VkPhysicalDeviceImageRobustnessFeatures::operator=(features);
        VkPhysicalDeviceInlineUniformBlockFeatures::operator=(features);
        VkPhysicalDevicePipelineCreationCacheControlFeatures::operator=(features);
        VkPhysicalDevicePrivateDataFeatures::operator=(features);
        VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures::operator=(features);
        VkPhysicalDeviceShaderTerminateInvocationFeatures::operator=(features);
        VkPhysicalDeviceSubgroupSizeControlFeatures::operator=(features);
        VkPhysicalDeviceSynchronization2Features::operator=(features);
        VkPhysicalDeviceTextureCompressionASTCHDRFeatures::operator=(features);
        VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures::operator=(features);
        VkPhysicalDeviceDynamicRenderingFeatures::operator=(features);
        VkPhysicalDeviceShaderIntegerDotProductFeatures::operator=(features);
        VkPhysicalDeviceMaintenance4Features::operator=(features);
        useCore = features.useCore;

        _link();

        return *this;
    }

    ///
    /// \brief Chain an extension structure
    /// \param next
    void chain(void* next) {
        if (useCore) {
            VkPhysicalDeviceVulkan13Features::pNext = next;
        } else {
            VkPhysicalDeviceMaintenance4Features::pNext = next;
        }
    }

    ///
    /// \brief Implicit casting for chaining
    operator void*() {
        if (useCore) {
            return static_cast<VkPhysicalDeviceVulkan13Features*>(this);
        } else {
            return static_cast<VkPhysicalDeviceImageRobustnessFeatures*>(this);
        }
    }


// Helpers -------------------------------------------------------------------------------------------------------------
private:

    void _clear() {

        // Clear out the struct
        fennec::memset(this, 0, sizeof(*this));

        // Set structure types
        VkPhysicalDeviceVulkan13Features::sType                       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES;
        VkPhysicalDeviceImageRobustnessFeatures::sType                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES;
        VkPhysicalDeviceInlineUniformBlockFeatures::sType             = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES;
        VkPhysicalDevicePipelineCreationCacheControlFeatures::sType   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES;
        VkPhysicalDevicePrivateDataFeatures::sType                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES;
        VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures::sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES;
        VkPhysicalDeviceShaderTerminateInvocationFeatures::sType      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES;
        VkPhysicalDeviceSubgroupSizeControlFeatures::sType            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES;
        VkPhysicalDeviceSynchronization2Features::sType               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES;
        VkPhysicalDeviceTextureCompressionASTCHDRFeatures::sType      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES;
        VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures::sType  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES;
        VkPhysicalDeviceDynamicRenderingFeatures::sType               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES;
        VkPhysicalDeviceShaderIntegerDotProductFeatures::sType        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES;
        VkPhysicalDeviceMaintenance4Features::sType                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES;
    }

    void _link() {

        // Check if we are Version 1.3 or later.
        if (useCore) {

            // Link to Core structure
            robustImageAccess                                  = &(VkPhysicalDeviceVulkan13Features::robustImageAccess);
            inlineUniformBlock                                 = &(VkPhysicalDeviceVulkan13Features::inlineUniformBlock);
            descriptorBindingInlineUniformBlockUpdateAfterBind = &(VkPhysicalDeviceVulkan13Features::descriptorBindingInlineUniformBlockUpdateAfterBind);
            pipelineCreationCacheControl                       = &(VkPhysicalDeviceVulkan13Features::pipelineCreationCacheControl);
            privateData                                        = &(VkPhysicalDeviceVulkan13Features::privateData);
            shaderDemoteToHelperInvocation                     = &(VkPhysicalDeviceVulkan13Features::shaderDemoteToHelperInvocation);
            shaderTerminateInvocation                          = &(VkPhysicalDeviceVulkan13Features::shaderTerminateInvocation);
            subgroupSizeControl                                = &(VkPhysicalDeviceVulkan13Features::subgroupSizeControl);
            computeFullSubgroups                               = &(VkPhysicalDeviceVulkan13Features::computeFullSubgroups);
            synchronization2                                   = &(VkPhysicalDeviceVulkan13Features::synchronization2);
            textureCompressionASTC_HDR                         = &(VkPhysicalDeviceVulkan13Features::textureCompressionASTC_HDR);
            shaderZeroInitializeWorkgroupMemory                = &(VkPhysicalDeviceVulkan13Features::shaderZeroInitializeWorkgroupMemory);
            dynamicRendering                                   = &(VkPhysicalDeviceVulkan13Features::dynamicRendering);
            shaderIntegerDotProduct                            = &(VkPhysicalDeviceVulkan13Features::shaderIntegerDotProduct);
            maintenance4                                       = &(VkPhysicalDeviceVulkan13Features::maintenance4);

            VkPhysicalDeviceVulkan13Features::pNext = nullptr;

            return;
        }


        // Link to Feature structures
        robustImageAccess                                  = &(VkPhysicalDeviceImageRobustnessFeatures::robustImageAccess);
        inlineUniformBlock                                 = &(VkPhysicalDeviceInlineUniformBlockFeatures::inlineUniformBlock);
        descriptorBindingInlineUniformBlockUpdateAfterBind = &(VkPhysicalDeviceInlineUniformBlockFeatures::descriptorBindingInlineUniformBlockUpdateAfterBind);
        pipelineCreationCacheControl                       = &(VkPhysicalDevicePipelineCreationCacheControlFeatures::pipelineCreationCacheControl);
        privateData                                        = &(VkPhysicalDevicePrivateDataFeatures::privateData);
        shaderDemoteToHelperInvocation                     = &(VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures::shaderDemoteToHelperInvocation);
        shaderTerminateInvocation                          = &(VkPhysicalDeviceShaderTerminateInvocationFeatures::shaderTerminateInvocation);
        subgroupSizeControl                                = &(VkPhysicalDeviceSubgroupSizeControlFeatures::subgroupSizeControl);
        computeFullSubgroups                               = &(VkPhysicalDeviceSubgroupSizeControlFeatures::computeFullSubgroups);
        synchronization2                                   = &(VkPhysicalDeviceSynchronization2Features::synchronization2);
        textureCompressionASTC_HDR                         = &(VkPhysicalDeviceTextureCompressionASTCHDRFeatures::textureCompressionASTC_HDR);
        shaderZeroInitializeWorkgroupMemory                = &(VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures::shaderZeroInitializeWorkgroupMemory);
        dynamicRendering                                   = &(VkPhysicalDeviceDynamicRenderingFeatures::dynamicRendering);
        shaderIntegerDotProduct                            = &(VkPhysicalDeviceShaderIntegerDotProductFeatures::shaderIntegerDotProduct);
        maintenance4                                       = &(VkPhysicalDeviceMaintenance4Features::maintenance4);


        // Daisy Chain
        VkPhysicalDeviceVulkan13Features::pNext                       = static_cast<VkPhysicalDeviceImageRobustnessFeatures*>(this);
        VkPhysicalDeviceImageRobustnessFeatures::pNext                = static_cast<VkPhysicalDeviceInlineUniformBlockFeatures*>(this);
        VkPhysicalDeviceInlineUniformBlockFeatures::pNext             = static_cast<VkPhysicalDevicePipelineCreationCacheControlFeatures*>(this);
        VkPhysicalDevicePipelineCreationCacheControlFeatures::pNext   = static_cast<VkPhysicalDevicePrivateDataFeatures*>(this);
        VkPhysicalDevicePrivateDataFeatures::pNext                    = static_cast<VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures*>(this);
        VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures::pNext = static_cast<VkPhysicalDeviceShaderTerminateInvocationFeatures*>(this);
        VkPhysicalDeviceShaderTerminateInvocationFeatures::pNext      = static_cast<VkPhysicalDeviceSubgroupSizeControlFeatures*>(this);
        VkPhysicalDeviceSubgroupSizeControlFeatures::pNext            = static_cast<VkPhysicalDeviceSynchronization2Features*>(this);
        VkPhysicalDeviceSynchronization2Features::pNext               = static_cast<VkPhysicalDeviceTextureCompressionASTCHDRFeatures*>(this);
        VkPhysicalDeviceTextureCompressionASTCHDRFeatures::pNext      = static_cast<VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures*>(this);
        VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures::pNext  = static_cast<VkPhysicalDeviceDynamicRenderingFeatures*>(this);
        VkPhysicalDeviceDynamicRenderingFeatures::pNext               = static_cast<VkPhysicalDeviceShaderIntegerDotProductFeatures*>(this);
        VkPhysicalDeviceShaderIntegerDotProductFeatures::pNext        = static_cast<VkPhysicalDeviceMaintenance4Features*>(this);
        VkPhysicalDeviceMaintenance4Features::pNext                   = nullptr;
    }
};

///
/// \brief Core 1.4 Features
struct device_features_14 : private VkPhysicalDeviceVulkan14Features,
                            private VkPhysicalDeviceGlobalPriorityQueryFeatures,
                            private VkPhysicalDeviceShaderSubgroupRotateFeatures,
                            private VkPhysicalDeviceShaderFloatControls2Features,
                            private VkPhysicalDeviceShaderExpectAssumeFeatures,
                            private VkPhysicalDeviceLineRasterizationFeatures,
                            private VkPhysicalDeviceVertexAttributeDivisorFeatures,
                            private VkPhysicalDeviceIndexTypeUint8Features,
                            private VkPhysicalDeviceDynamicRenderingLocalReadFeatures,
                            private VkPhysicalDeviceMaintenance5Features,
                            private VkPhysicalDeviceMaintenance6Features,
                            private VkPhysicalDevicePipelineProtectedAccessFeatures,
                            private VkPhysicalDevicePipelineRobustnessFeatures,
                            private VkPhysicalDeviceHostImageCopyFeatures {

// Public References ---------------------------------------------------------------------------------------------------
public:

    /// \name Features
    /// @{

    VkBool32* globalPriorityQuery;                    //!< Global Priority Query
    VkBool32* shaderSubgroupRotate;                   //!< Shader Subgroup Rotate
    VkBool32* shaderSubgroupRotateClustered;          //!< Shader Subgroup Rotate Clustered
    VkBool32* shaderFloatControls2;                   //!< Shader Float Controls 2
    VkBool32* shaderExpectAssume;                     //!< Shader Expect Assume
    VkBool32* rectangularLines;                       //!< Rectangular Lines
    VkBool32* bresenhamLines;                         //!< Bresenham Lines
    VkBool32* smoothLines;                            //!< Smooth Lines
    VkBool32* stippledRectangularLines;               //!< Stippled Rectangular Lines
    VkBool32* stippledBresenhamLines;                 //!< Stippled Bresenham Lines
    VkBool32* stippledSmoothLines;                    //!< Stippled Smooth Lines
    VkBool32* vertexAttributeInstanceRateDivisor;     //!< Vertex Attribute Instance Rate Divisor
    VkBool32* vertexAttributeInstanceRateZeroDivisor; //!< Vertex Attribute Instance Rate Zero Divisor
    VkBool32* indexTypeUint8;                         //!< Index Type Uint8
    VkBool32* dynamicRenderingLocalRead;              //!< Dynamic Rendering Local Read
    VkBool32* maintenance5;                           //!< Maintenance 5
    VkBool32* maintenance6;                           //!< Maintenance 6
    VkBool32* pipelineProtectedAccess;                //!< Pipeline Protected Access
    VkBool32* pipelineRobustness;                     //!< Pipeline Robustness
    VkBool32* hostImageCopy;                          //!< Host Image Copy
    VkBool32* pushDescriptor;                         //!< Push Descriptor
    VkBool32  useCore;                                //!< Use Core

    /// @}


// Methods -------------------------------------------------------------------------------------------------------------
public:

    ///
    /// \brief Default Constructor
    /// \details Version information is necessary for this structure to fill itself in properly, so the default
    ///          constructor is not allowed.
    device_features_14() = delete;

    ///
    /// \brief Features Constructor
    /// \param properties Properties structure to poll necessary information
    device_features_14(const device_properties& properties)
        : VkPhysicalDeviceVulkan14Features { }
        , VkPhysicalDeviceGlobalPriorityQueryFeatures { }
        , VkPhysicalDeviceShaderSubgroupRotateFeatures { }
        , VkPhysicalDeviceShaderFloatControls2Features { }
        , VkPhysicalDeviceShaderExpectAssumeFeatures { }
        , VkPhysicalDeviceLineRasterizationFeatures { }
        , VkPhysicalDeviceVertexAttributeDivisorFeatures { }
        , VkPhysicalDeviceIndexTypeUint8Features { }
        , VkPhysicalDeviceDynamicRenderingLocalReadFeatures { }
        , VkPhysicalDeviceMaintenance5Features { }
        , VkPhysicalDeviceMaintenance6Features { }
        , VkPhysicalDevicePipelineProtectedAccessFeatures { }
        , VkPhysicalDevicePipelineRobustnessFeatures { }
        , VkPhysicalDeviceHostImageCopyFeatures { }
        , globalPriorityQuery { nullptr }
        , shaderSubgroupRotate { nullptr }
        , shaderSubgroupRotateClustered { nullptr }
        , shaderFloatControls2 { nullptr }
        , shaderExpectAssume { nullptr }
        , rectangularLines { nullptr }
        , bresenhamLines { nullptr }
        , smoothLines { nullptr }
        , stippledRectangularLines { nullptr }
        , stippledBresenhamLines { nullptr }
        , stippledSmoothLines { nullptr }
        , vertexAttributeInstanceRateDivisor { nullptr }
        , vertexAttributeInstanceRateZeroDivisor { nullptr }
        , indexTypeUint8 { nullptr }
        , dynamicRenderingLocalRead { nullptr }
        , maintenance5 { nullptr }
        , maintenance6 { nullptr }
        , pipelineProtectedAccess { nullptr }
        , pipelineRobustness { nullptr }
        , hostImageCopy { nullptr }
        , pushDescriptor { nullptr }
        , useCore { properties.core10->apiVersion >= VK_API_VERSION_1_4 } {

        _link();
    }

    ///
    /// \brief Copy Constructor
    /// \param features The features structure to copy
    device_features_14(const device_features_14& features)
        : VkPhysicalDeviceVulkan14Features { features }
        , VkPhysicalDeviceGlobalPriorityQueryFeatures { features }
        , VkPhysicalDeviceShaderSubgroupRotateFeatures { features }
        , VkPhysicalDeviceShaderFloatControls2Features { features }
        , VkPhysicalDeviceShaderExpectAssumeFeatures { features }
        , VkPhysicalDeviceLineRasterizationFeatures { features }
        , VkPhysicalDeviceVertexAttributeDivisorFeatures { features }
        , VkPhysicalDeviceIndexTypeUint8Features { features }
        , VkPhysicalDeviceDynamicRenderingLocalReadFeatures { features }
        , VkPhysicalDeviceMaintenance5Features { features }
        , VkPhysicalDeviceMaintenance6Features { features }
        , VkPhysicalDevicePipelineProtectedAccessFeatures { features }
        , VkPhysicalDevicePipelineRobustnessFeatures { features }
        , VkPhysicalDeviceHostImageCopyFeatures { features }
        , globalPriorityQuery { nullptr }
        , shaderSubgroupRotate { nullptr }
        , shaderSubgroupRotateClustered { nullptr }
        , shaderFloatControls2 { nullptr }
        , shaderExpectAssume { nullptr }
        , rectangularLines { nullptr }
        , bresenhamLines { nullptr }
        , smoothLines { nullptr }
        , stippledRectangularLines { nullptr }
        , stippledBresenhamLines { nullptr }
        , stippledSmoothLines { nullptr }
        , vertexAttributeInstanceRateDivisor { nullptr }
        , vertexAttributeInstanceRateZeroDivisor { nullptr }
        , indexTypeUint8 { nullptr }
        , dynamicRenderingLocalRead { nullptr }
        , maintenance5 { nullptr }
        , maintenance6 { nullptr }
        , pipelineProtectedAccess { nullptr }
        , pipelineRobustness { nullptr }
        , hostImageCopy { nullptr }
        , pushDescriptor { nullptr } {

        _link();
    }

    ///
    /// \brief Copy Assignment
    /// \param features The features to copy
    /// \returns A reference to \emph{this}
    device_features_14& operator=(const device_features_14& features) {
        if (this == &features) {
            return *this;
        }

        // Copy data
        VkPhysicalDeviceVulkan14Features::operator=(features);
        VkPhysicalDeviceGlobalPriorityQueryFeatures::operator=(features);
        VkPhysicalDeviceShaderSubgroupRotateFeatures::operator=(features);
        VkPhysicalDeviceShaderFloatControls2Features::operator=(features);
        VkPhysicalDeviceShaderExpectAssumeFeatures::operator=(features);
        VkPhysicalDeviceLineRasterizationFeatures::operator=(features);
        VkPhysicalDeviceVertexAttributeDivisorFeatures::operator=(features);
        VkPhysicalDeviceIndexTypeUint8Features::operator=(features);
        VkPhysicalDeviceDynamicRenderingLocalReadFeatures::operator=(features);
        VkPhysicalDeviceMaintenance5Features::operator=(features);
        VkPhysicalDeviceMaintenance6Features::operator=(features);
        VkPhysicalDevicePipelineProtectedAccessFeatures::operator=(features);
        VkPhysicalDevicePipelineRobustnessFeatures::operator=(features);
        VkPhysicalDeviceHostImageCopyFeatures::operator=(features);
        useCore = features.useCore;

        _link();

        return *this;
    }

    ///
    /// \brief Chain an extension structure
    /// \param next
    void chain(void* next) {
        if (useCore) {
            VkPhysicalDeviceVulkan14Features::pNext = next;
        } else {
            VkPhysicalDeviceHostImageCopyFeatures::pNext = next;
        }
    }

    ///
    /// \brief Implicit casting for chaining
    operator void*() {
        if (useCore) {
            return static_cast<VkPhysicalDeviceVulkan14Features*>(this);
        } else {
            return static_cast<VkPhysicalDeviceGlobalPriorityQueryFeatures*>(this);
        }
    }


// Helpers -------------------------------------------------------------------------------------------------------------
private:

    void _clear() {

        // Clear out the struct
        fennec::memset(this, 0, sizeof(*this));


        // Set the structure types
        VkPhysicalDeviceVulkan14Features::sType                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_4_FEATURES;
        VkPhysicalDeviceGlobalPriorityQueryFeatures::sType       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES;
        VkPhysicalDeviceShaderSubgroupRotateFeatures::sType      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES;
        VkPhysicalDeviceShaderFloatControls2Features::sType      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT_CONTROLS_2_FEATURES;
        VkPhysicalDeviceShaderExpectAssumeFeatures::sType        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES;
        VkPhysicalDeviceLineRasterizationFeatures::sType         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES;
        VkPhysicalDeviceVertexAttributeDivisorFeatures::sType    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES;
        VkPhysicalDeviceIndexTypeUint8Features::sType            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES;
        VkPhysicalDeviceDynamicRenderingLocalReadFeatures::sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_LOCAL_READ_FEATURES;
        VkPhysicalDeviceMaintenance5Features::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES;
        VkPhysicalDeviceMaintenance6Features::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES;
        VkPhysicalDevicePipelineProtectedAccessFeatures::sType   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES;
        VkPhysicalDevicePipelineRobustnessFeatures::sType        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES;
        VkPhysicalDeviceHostImageCopyFeatures::sType             = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES;
    }

    void _link() {

        // Check if we are Version 1.4 or later.
        if (useCore) {

            // Link to Core structure
            globalPriorityQuery                    = &(VkPhysicalDeviceVulkan14Features::globalPriorityQuery);
            shaderSubgroupRotate                   = &(VkPhysicalDeviceVulkan14Features::shaderSubgroupRotate);
            shaderSubgroupRotateClustered          = &(VkPhysicalDeviceVulkan14Features::shaderSubgroupRotateClustered);
            shaderFloatControls2                   = &(VkPhysicalDeviceVulkan14Features::shaderFloatControls2);
            shaderExpectAssume                     = &(VkPhysicalDeviceVulkan14Features::shaderExpectAssume);
            rectangularLines                       = &(VkPhysicalDeviceVulkan14Features::rectangularLines);
            bresenhamLines                         = &(VkPhysicalDeviceVulkan14Features::bresenhamLines);
            smoothLines                            = &(VkPhysicalDeviceVulkan14Features::smoothLines);
            stippledRectangularLines               = &(VkPhysicalDeviceVulkan14Features::stippledRectangularLines);
            stippledBresenhamLines                 = &(VkPhysicalDeviceVulkan14Features::stippledBresenhamLines);
            stippledSmoothLines                    = &(VkPhysicalDeviceVulkan14Features::stippledSmoothLines);
            vertexAttributeInstanceRateDivisor     = &(VkPhysicalDeviceVulkan14Features::vertexAttributeInstanceRateDivisor);
            vertexAttributeInstanceRateZeroDivisor = &(VkPhysicalDeviceVulkan14Features::vertexAttributeInstanceRateZeroDivisor);
            indexTypeUint8                         = &(VkPhysicalDeviceVulkan14Features::indexTypeUint8);
            dynamicRenderingLocalRead              = &(VkPhysicalDeviceVulkan14Features::dynamicRenderingLocalRead);
            maintenance5                           = &(VkPhysicalDeviceVulkan14Features::maintenance5);
            maintenance6                           = &(VkPhysicalDeviceVulkan14Features::maintenance6);
            pipelineProtectedAccess                = &(VkPhysicalDeviceVulkan14Features::pipelineProtectedAccess);
            pipelineRobustness                     = &(VkPhysicalDeviceVulkan14Features::pipelineRobustness);
            hostImageCopy                          = &(VkPhysicalDeviceVulkan14Features::hostImageCopy);
            pushDescriptor                         = &(VkPhysicalDeviceVulkan14Features::pushDescriptor);

            VkPhysicalDeviceVulkan14Features::pNext = nullptr;

            return;
        }


        // Link to Feature structures
        globalPriorityQuery                    = &(VkPhysicalDeviceGlobalPriorityQueryFeatures::globalPriorityQuery);
        shaderSubgroupRotate                   = &(VkPhysicalDeviceShaderSubgroupRotateFeatures::shaderSubgroupRotate);
        shaderSubgroupRotateClustered          = &(VkPhysicalDeviceShaderSubgroupRotateFeatures::shaderSubgroupRotateClustered);
        shaderFloatControls2                   = &(VkPhysicalDeviceShaderFloatControls2Features::shaderFloatControls2);
        shaderExpectAssume                     = &(VkPhysicalDeviceShaderExpectAssumeFeatures::shaderExpectAssume);
        rectangularLines                       = &(VkPhysicalDeviceLineRasterizationFeatures::rectangularLines);
        bresenhamLines                         = &(VkPhysicalDeviceLineRasterizationFeatures::bresenhamLines);
        smoothLines                            = &(VkPhysicalDeviceLineRasterizationFeatures::smoothLines);
        stippledRectangularLines               = &(VkPhysicalDeviceLineRasterizationFeatures::stippledRectangularLines);
        stippledBresenhamLines                 = &(VkPhysicalDeviceLineRasterizationFeatures::stippledBresenhamLines);
        stippledSmoothLines                    = &(VkPhysicalDeviceLineRasterizationFeatures::stippledSmoothLines);
        vertexAttributeInstanceRateDivisor     = &(VkPhysicalDeviceVertexAttributeDivisorFeatures::vertexAttributeInstanceRateDivisor);
        vertexAttributeInstanceRateZeroDivisor = &(VkPhysicalDeviceVertexAttributeDivisorFeatures::vertexAttributeInstanceRateZeroDivisor);
        indexTypeUint8                         = &(VkPhysicalDeviceIndexTypeUint8Features::indexTypeUint8);
        dynamicRenderingLocalRead              = &(VkPhysicalDeviceDynamicRenderingLocalReadFeatures::dynamicRenderingLocalRead);
        maintenance5                           = &(VkPhysicalDeviceMaintenance5Features::maintenance5);
        maintenance6                           = &(VkPhysicalDeviceMaintenance6Features::maintenance6);
        pipelineProtectedAccess                = &(VkPhysicalDevicePipelineProtectedAccessFeatures::pipelineProtectedAccess);
        pipelineRobustness                     = &(VkPhysicalDevicePipelineRobustnessFeatures::pipelineRobustness);
        hostImageCopy                          = &(VkPhysicalDeviceHostImageCopyFeatures::hostImageCopy);

        // These features are only available in 1.4 Core
//      pushDescriptor                         = &(VkPhysicalDeviceVulkan14Features::pushDescriptor);


        // Daisy chain
        VkPhysicalDeviceGlobalPriorityQueryFeatures::pNext       = static_cast<VkPhysicalDeviceShaderSubgroupRotateFeatures*>(this);
        VkPhysicalDeviceShaderSubgroupRotateFeatures::pNext      = static_cast<VkPhysicalDeviceShaderFloatControls2Features*>(this);
        VkPhysicalDeviceShaderFloatControls2Features::pNext      = static_cast<VkPhysicalDeviceShaderExpectAssumeFeatures*>(this);
        VkPhysicalDeviceShaderExpectAssumeFeatures::pNext        = static_cast<VkPhysicalDeviceLineRasterizationFeatures*>(this);
        VkPhysicalDeviceLineRasterizationFeatures::pNext         = static_cast<VkPhysicalDeviceVertexAttributeDivisorFeatures*>(this);
        VkPhysicalDeviceVertexAttributeDivisorFeatures::pNext    = static_cast<VkPhysicalDeviceIndexTypeUint8Features*>(this);
        VkPhysicalDeviceIndexTypeUint8Features::pNext            = static_cast<VkPhysicalDeviceDynamicRenderingLocalReadFeatures*>(this);
        VkPhysicalDeviceDynamicRenderingLocalReadFeatures::pNext = static_cast<VkPhysicalDeviceMaintenance5Features*>(this);
        VkPhysicalDeviceMaintenance5Features::pNext              = static_cast<VkPhysicalDeviceMaintenance6Features*>(this);
        VkPhysicalDeviceMaintenance6Features::pNext              = static_cast<VkPhysicalDevicePipelineProtectedAccessFeatures*>(this);
        VkPhysicalDevicePipelineProtectedAccessFeatures::pNext   = static_cast<VkPhysicalDevicePipelineRobustnessFeatures*>(this);
        VkPhysicalDevicePipelineRobustnessFeatures::pNext        = static_cast<VkPhysicalDeviceHostImageCopyFeatures*>(this);
        VkPhysicalDeviceHostImageCopyFeatures::pNext             = nullptr;
    }
};

///
/// \brief KHR Features
struct device_features_khr : private VkPhysicalDeviceAccelerationStructureFeaturesKHR,
                             private VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR,
                             private VkPhysicalDeviceCooperativeMatrixFeaturesKHR,
                             private VkPhysicalDeviceDepthClampZeroOneFeaturesKHR,
                             private VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR,
                             private VkPhysicalDeviceFragmentShadingRateFeaturesKHR,
                             private VkPhysicalDeviceMaintenance7FeaturesKHR,
                             private VkPhysicalDeviceMaintenance8FeaturesKHR,
                             private VkPhysicalDeviceMaintenance9FeaturesKHR,
                             private VkPhysicalDevicePerformanceQueryFeaturesKHR,
                             private VkPhysicalDevicePipelineBinaryFeaturesKHR,
                             private VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR,
                             private VkPhysicalDevicePresentIdFeaturesKHR,
                             private VkPhysicalDevicePresentId2FeaturesKHR,
                             private VkPhysicalDevicePresentModeFifoLatestReadyFeaturesKHR,
                             private VkPhysicalDevicePresentWaitFeaturesKHR,
                             private VkPhysicalDevicePresentWait2FeaturesKHR,
                             private VkPhysicalDeviceRayQueryFeaturesKHR,
                             private VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR,
                             private VkPhysicalDeviceRayTracingPipelineFeaturesKHR,
                             private VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR,
                             private VkPhysicalDeviceRobustness2FeaturesKHR,
                             private VkPhysicalDeviceShaderBfloat16FeaturesKHR,
                             private VkPhysicalDeviceShaderClockFeaturesKHR,
                             private VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR,
                             private VkPhysicalDeviceShaderQuadControlFeaturesKHR,
                             private VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR,
                             private VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR,
                             private VkPhysicalDeviceSwapchainMaintenance1FeaturesKHR,
                             private VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR,
                             private VkPhysicalDeviceVideoDecodeVP9FeaturesKHR,
                             private VkPhysicalDeviceVideoEncodeAV1FeaturesKHR,
                             private VkPhysicalDeviceVideoEncodeIntraRefreshFeaturesKHR,
                             private VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR,
                             private VkPhysicalDeviceVideoMaintenance1FeaturesKHR,
                             private VkPhysicalDeviceVideoMaintenance2FeaturesKHR,
                             private VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR {

// Public References ---------------------------------------------------------------------------------------------------
public:

    /// \name Features
    /// @{

    VkBool32* accelerationStructure;                                 //!< Acceleration Structure
    VkBool32* accelerationStructureCaptureReplay;                    //!< Acceleration Structure Capture Replay
    VkBool32* accelerationStructureIndirectBuild;                    //!< Acceleration Structure Indirect Build
    VkBool32* accelerationStructureHostCommands;                     //!< Acceleration Structure Host Commands
    VkBool32* descriptorBindingAccelerationStructureUpdateAfterBind; //!< Descriptor Binding Acceleration Structure Update After Bind
    VkBool32* computeDerivativeGroupQuads;                           //!< Compute Derivative Group Quads
    VkBool32* computeDerivativeGroupLinear;                          //!< Compute Derivative Group Linear
    VkBool32* cooperativeMatrix;                                     //!< Cooperative Matrix
    VkBool32* cooperativeMatrixRobustBufferAccess;                   //!< Cooperative Matrix Robust Buffer Access
    VkBool32* depthClampZeroOne;                                     //!< Depth Clamp Zero One
    VkBool32* fragmentShaderBarycentric;                             //!< Fragment Shader Barycentric
    VkBool32* pipelineFragmentShadingRate;                           //!< Pipeline Fragment Shading Rate
    VkBool32* primitiveFragmentShadingRate;                          //!< Primitive Fragment Shading Rate
    VkBool32* attachmentFragmentShadingRate;                         //!< Attachment Fragment Shading Rate
    VkBool32* maintenance7;                                          //!< Maintenance7
    VkBool32* maintenance8;                                          //!< Maintenance8
    VkBool32* maintenance9;                                          //!< Maintenance9
    VkBool32* performanceCounterQueryPools;                          //!< Performance Counter Query Pools
    VkBool32* performanceCounterMultipleQueryPools;                  //!< Performance Counter Multiple Query Pools
    VkBool32* pipelineBinaries;                                      //!< Pipeline Binaries
    VkBool32* pipelineExecutableInfo;                                //!< Pipeline Executable Info
    VkBool32* presentId;                                             //!< Present Id
    VkBool32* presentId2;                                            //!< Present Id 2
    VkBool32* presentModeFifoLatestReady;                            //!< Present Mode Fifo Latest Ready
    VkBool32* presentWait;                                           //!< Present Wait
    VkBool32* presentWait2;                                          //!< Present Wait 2
    VkBool32* rayQuery;                                              //!< Ray Query
    VkBool32* rayTracingMaintenance1;                                //!< Ray Tracing Maintenance1
    VkBool32* rayTracingPipelineTraceRaysIndirect2;                  //!< Ray Tracing Pipeline Trace Rays Indirect2
    VkBool32* rayTracingPipeline;                                    //!< Ray Tracing Pipeline
    VkBool32* rayTracingPipelineShaderGroupHandleCaptureReplay;      //!< Ray Tracing Pipeline Shader Group Handle Capture Replay
    VkBool32* rayTracingPipelineShaderGroupHandleCaptureReplayMixed; //!< Ray Tracing Pipeline Shader Group Handle Capture Replay Mixed
    VkBool32* rayTracingPipelineTraceRaysIndirect;                   //!< Ray Tracing Pipeline Trace Rays Indirect
    VkBool32* rayTraversalPrimitiveCulling;                          //!< Ray Traversal Primitive Culling
    VkBool32* rayTracingPositionFetch;                               //!< Ray Tracing Position Fetch
    VkBool32* robustBufferAccess2;                                   //!< Robust Buffer Access 2
    VkBool32* robustImageAccess2;                                    //!< Robust Image Access 2
    VkBool32* nullDescriptor;                                        //!< Null Descriptor
    VkBool32* shaderBFloat16Type;                                    //!< Shader B Float16 Type
    VkBool32* shaderBFloat16DotProduct;                              //!< Shader B Float16 Dot Product
    VkBool32* shaderBFloat16CooperativeMatrix;                       //!< Shader B Float16 Cooperative Matrix
    VkBool32* shaderSubgroupClock;                                   //!< Shader Subgroup Clock
    VkBool32* shaderDeviceClock;                                     //!< Shader Device Clock
    VkBool32* shaderMaximalReconvergence;                            //!< Shader Maximal Reconvergence
    VkBool32* shaderQuadControl;                                     //!< Shader Quad Control
    VkBool32* shaderRelaxedExtendedInstruction;                      //!< Shader Relaxed Extended Instruction
    VkBool32* shaderSubgroupUniformControlFlow;                      //!< Shader Subgroup Uniform Control Flow
    VkBool32* swapchainMaintenance1;                                 //!< Swapchain Maintenance 1
    VkBool32* unifiedImageLayouts;                                   //!< Unified Image Layouts
    VkBool32* unifiedImageLayoutsVideo;                              //!< Unified Image Layouts Video
    VkBool32* videoDecodeVP9;                                        //!< Video Decode Vp9
    VkBool32* videoEncodeAV1;                                        //!< Video Encode Av1
    VkBool32* videoEncodeIntraRefresh;                               //!< Video Encode Intra Refresh
    VkBool32* videoEncodeQuantizationMap;                            //!< Video Encode Quantization Map
    VkBool32* videoMaintenance1;                                     //!< Video Maintenance1
    VkBool32* videoMaintenance2;                                     //!< Video Maintenance2
    VkBool32* workgroupMemoryExplicitLayout;                         //!< Workgroup Memory Explicit Layout
    VkBool32* workgroupMemoryExplicitLayoutScalarBlockLayout;        //!< Workgroup Memory Explicit Layout Scalar Block Layout
    VkBool32* workgroupMemoryExplicitLayout8BitAccess;               //!< Workgroup Memory Explicit Layout 8-Bit Access
    VkBool32* workgroupMemoryExplicitLayout16BitAccess;              //!< Workgroup Memory Explicit Layout 16-Bit Access

    /// @}


// Methods -------------------------------------------------------------------------------------------------------------
public:

    ///
    /// \brief Features Constructor
    device_features_khr()
        : VkPhysicalDeviceAccelerationStructureFeaturesKHR { }
        , VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR { }
        , VkPhysicalDeviceCooperativeMatrixFeaturesKHR { }
        , VkPhysicalDeviceDepthClampZeroOneFeaturesKHR { }
        , VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR { }
        , VkPhysicalDeviceFragmentShadingRateFeaturesKHR { }
        , VkPhysicalDeviceMaintenance7FeaturesKHR { }
        , VkPhysicalDeviceMaintenance8FeaturesKHR { }
        , VkPhysicalDeviceMaintenance9FeaturesKHR { }
        , VkPhysicalDevicePerformanceQueryFeaturesKHR { }
        , VkPhysicalDevicePipelineBinaryFeaturesKHR { }
        , VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR { }
        , VkPhysicalDevicePresentIdFeaturesKHR { }
        , VkPhysicalDevicePresentId2FeaturesKHR { }
        , VkPhysicalDevicePresentModeFifoLatestReadyFeaturesKHR { }
        , VkPhysicalDevicePresentWaitFeaturesKHR { }
        , VkPhysicalDevicePresentWait2FeaturesKHR { }
        , VkPhysicalDeviceRayQueryFeaturesKHR { }
        , VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR { }
        , VkPhysicalDeviceRayTracingPipelineFeaturesKHR { }
        , VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR { }
        , VkPhysicalDeviceRobustness2FeaturesKHR { }
        , VkPhysicalDeviceShaderBfloat16FeaturesKHR { }
        , VkPhysicalDeviceShaderClockFeaturesKHR { }
        , VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR { }
        , VkPhysicalDeviceShaderQuadControlFeaturesKHR { }
        , VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR { }
        , VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR { }
        , VkPhysicalDeviceSwapchainMaintenance1FeaturesKHR { }
        , VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR { }
        , VkPhysicalDeviceVideoDecodeVP9FeaturesKHR { }
        , VkPhysicalDeviceVideoEncodeAV1FeaturesKHR { }
        , VkPhysicalDeviceVideoEncodeIntraRefreshFeaturesKHR { }
        , VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR { }
        , VkPhysicalDeviceVideoMaintenance1FeaturesKHR { }
        , VkPhysicalDeviceVideoMaintenance2FeaturesKHR { }
        , VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR { }
        , accelerationStructure { nullptr }
        , accelerationStructureCaptureReplay { nullptr }
        , accelerationStructureIndirectBuild { nullptr }
        , accelerationStructureHostCommands { nullptr }
        , descriptorBindingAccelerationStructureUpdateAfterBind { nullptr }
        , computeDerivativeGroupQuads { nullptr }
        , computeDerivativeGroupLinear { nullptr }
        , cooperativeMatrix { nullptr }
        , cooperativeMatrixRobustBufferAccess { nullptr }
        , depthClampZeroOne { nullptr }
        , fragmentShaderBarycentric { nullptr }
        , pipelineFragmentShadingRate { nullptr }
        , primitiveFragmentShadingRate { nullptr }
        , attachmentFragmentShadingRate { nullptr }
        , maintenance7 { nullptr }
        , maintenance8 { nullptr }
        , maintenance9 { nullptr }
        , performanceCounterQueryPools { nullptr }
        , performanceCounterMultipleQueryPools { nullptr }
        , pipelineBinaries { nullptr }
        , pipelineExecutableInfo { nullptr }
        , presentId { nullptr }
        , presentId2 { nullptr }
        , presentModeFifoLatestReady { nullptr }
        , presentWait { nullptr }
        , presentWait2 { nullptr }
        , rayQuery { nullptr }
        , rayTracingMaintenance1 { nullptr }
        , rayTracingPipelineTraceRaysIndirect2 { nullptr }
        , rayTracingPipeline { nullptr }
        , rayTracingPipelineShaderGroupHandleCaptureReplay { nullptr }
        , rayTracingPipelineShaderGroupHandleCaptureReplayMixed { nullptr }
        , rayTracingPipelineTraceRaysIndirect { nullptr }
        , rayTraversalPrimitiveCulling { nullptr }
        , rayTracingPositionFetch { nullptr }
        , robustBufferAccess2 { nullptr }
        , robustImageAccess2 { nullptr }
        , nullDescriptor { nullptr }
        , shaderBFloat16Type { nullptr }
        , shaderBFloat16DotProduct { nullptr }
        , shaderBFloat16CooperativeMatrix { nullptr }
        , shaderSubgroupClock { nullptr }
        , shaderDeviceClock { nullptr }
        , shaderMaximalReconvergence { nullptr }
        , shaderQuadControl { nullptr }
        , shaderRelaxedExtendedInstruction { nullptr }
        , shaderSubgroupUniformControlFlow { nullptr }
        , swapchainMaintenance1 { nullptr }
        , unifiedImageLayouts { nullptr }
        , unifiedImageLayoutsVideo { nullptr }
        , videoDecodeVP9 { nullptr }
        , videoEncodeAV1 { nullptr }
        , videoEncodeIntraRefresh { nullptr }
        , videoEncodeQuantizationMap { nullptr }
        , videoMaintenance1 { nullptr }
        , videoMaintenance2 { nullptr }
        , workgroupMemoryExplicitLayout { nullptr }
        , workgroupMemoryExplicitLayoutScalarBlockLayout { nullptr }
        , workgroupMemoryExplicitLayout8BitAccess { nullptr }
        , workgroupMemoryExplicitLayout16BitAccess { nullptr } {

        _link();
    }

    ///
    /// \brief Copy Constructor
    /// \param features The features structure to copy
    device_features_khr(const device_features_khr& features)
        : VkPhysicalDeviceAccelerationStructureFeaturesKHR { features }
        , VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR { features }
        , VkPhysicalDeviceCooperativeMatrixFeaturesKHR { features }
        , VkPhysicalDeviceDepthClampZeroOneFeaturesKHR { features }
        , VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR { features }
        , VkPhysicalDeviceFragmentShadingRateFeaturesKHR { features }
        , VkPhysicalDeviceMaintenance7FeaturesKHR { features }
        , VkPhysicalDeviceMaintenance8FeaturesKHR { features }
        , VkPhysicalDeviceMaintenance9FeaturesKHR { features }
        , VkPhysicalDevicePerformanceQueryFeaturesKHR { features }
        , VkPhysicalDevicePipelineBinaryFeaturesKHR { features }
        , VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR { features }
        , VkPhysicalDevicePresentIdFeaturesKHR { features }
        , VkPhysicalDevicePresentId2FeaturesKHR { features }
        , VkPhysicalDevicePresentModeFifoLatestReadyFeaturesKHR { features }
        , VkPhysicalDevicePresentWaitFeaturesKHR { features }
        , VkPhysicalDevicePresentWait2FeaturesKHR { features }
        , VkPhysicalDeviceRayQueryFeaturesKHR { features }
        , VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR { features }
        , VkPhysicalDeviceRayTracingPipelineFeaturesKHR { features }
        , VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR { features }
        , VkPhysicalDeviceRobustness2FeaturesKHR { features }
        , VkPhysicalDeviceShaderBfloat16FeaturesKHR { features }
        , VkPhysicalDeviceShaderClockFeaturesKHR { features }
        , VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR { features }
        , VkPhysicalDeviceShaderQuadControlFeaturesKHR { features }
        , VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR { features }
        , VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR { features }
        , VkPhysicalDeviceSwapchainMaintenance1FeaturesKHR { features }
        , VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR { features }
        , VkPhysicalDeviceVideoDecodeVP9FeaturesKHR { features }
        , VkPhysicalDeviceVideoEncodeAV1FeaturesKHR { features }
        , VkPhysicalDeviceVideoEncodeIntraRefreshFeaturesKHR { features }
        , VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR { features }
        , VkPhysicalDeviceVideoMaintenance1FeaturesKHR { features }
        , VkPhysicalDeviceVideoMaintenance2FeaturesKHR { features }
        , VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR { features }
        , accelerationStructure { nullptr }
        , accelerationStructureCaptureReplay { nullptr }
        , accelerationStructureIndirectBuild { nullptr }
        , accelerationStructureHostCommands { nullptr }
        , descriptorBindingAccelerationStructureUpdateAfterBind { nullptr }
        , computeDerivativeGroupQuads { nullptr }
        , computeDerivativeGroupLinear { nullptr }
        , cooperativeMatrix { nullptr }
        , cooperativeMatrixRobustBufferAccess { nullptr }
        , depthClampZeroOne { nullptr }
        , fragmentShaderBarycentric { nullptr }
        , pipelineFragmentShadingRate { nullptr }
        , primitiveFragmentShadingRate { nullptr }
        , attachmentFragmentShadingRate { nullptr }
        , maintenance7 { nullptr }
        , maintenance8 { nullptr }
        , maintenance9 { nullptr }
        , performanceCounterQueryPools { nullptr }
        , performanceCounterMultipleQueryPools { nullptr }
        , pipelineBinaries { nullptr }
        , pipelineExecutableInfo { nullptr }
        , presentId { nullptr }
        , presentId2 { nullptr }
        , presentModeFifoLatestReady { nullptr }
        , presentWait { nullptr }
        , presentWait2 { nullptr }
        , rayQuery { nullptr }
        , rayTracingMaintenance1 { nullptr }
        , rayTracingPipelineTraceRaysIndirect2 { nullptr }
        , rayTracingPipeline { nullptr }
        , rayTracingPipelineShaderGroupHandleCaptureReplay { nullptr }
        , rayTracingPipelineShaderGroupHandleCaptureReplayMixed { nullptr }
        , rayTracingPipelineTraceRaysIndirect { nullptr }
        , rayTraversalPrimitiveCulling { nullptr }
        , rayTracingPositionFetch { nullptr }
        , robustBufferAccess2 { nullptr }
        , robustImageAccess2 { nullptr }
        , nullDescriptor { nullptr }
        , shaderBFloat16Type { nullptr }
        , shaderBFloat16DotProduct { nullptr }
        , shaderBFloat16CooperativeMatrix { nullptr }
        , shaderSubgroupClock { nullptr }
        , shaderDeviceClock { nullptr }
        , shaderMaximalReconvergence { nullptr }
        , shaderQuadControl { nullptr }
        , shaderRelaxedExtendedInstruction { nullptr }
        , shaderSubgroupUniformControlFlow { nullptr }
        , swapchainMaintenance1 { nullptr }
        , unifiedImageLayouts { nullptr }
        , unifiedImageLayoutsVideo { nullptr }
        , videoDecodeVP9 { nullptr }
        , videoEncodeAV1 { nullptr }
        , videoEncodeIntraRefresh { nullptr }
        , videoEncodeQuantizationMap { nullptr }
        , videoMaintenance1 { nullptr }
        , videoMaintenance2 { nullptr }
        , workgroupMemoryExplicitLayout { nullptr }
        , workgroupMemoryExplicitLayoutScalarBlockLayout { nullptr }
        , workgroupMemoryExplicitLayout8BitAccess { nullptr }
        , workgroupMemoryExplicitLayout16BitAccess { nullptr } {

        _link();
    }

    ///
    /// \brief Copy Assignment
    /// \param features The features to copy
    /// \returns A reference to \emph{this}
    device_features_khr& operator=(const device_features_khr& features) {
        if (this == &features) {
            return *this;
        }

        // Copy data
        VkPhysicalDeviceAccelerationStructureFeaturesKHR::operator=(features);
        VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR::operator=(features);
        VkPhysicalDeviceCooperativeMatrixFeaturesKHR::operator=(features);
        VkPhysicalDeviceDepthClampZeroOneFeaturesKHR::operator=(features);
        VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR::operator=(features);
        VkPhysicalDeviceFragmentShadingRateFeaturesKHR::operator=(features);
        VkPhysicalDeviceMaintenance7FeaturesKHR::operator=(features);
        VkPhysicalDeviceMaintenance8FeaturesKHR::operator=(features);
        VkPhysicalDeviceMaintenance9FeaturesKHR::operator=(features);
        VkPhysicalDevicePerformanceQueryFeaturesKHR::operator=(features);
        VkPhysicalDevicePipelineBinaryFeaturesKHR::operator=(features);
        VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR::operator=(features);
        VkPhysicalDevicePresentIdFeaturesKHR::operator=(features);
        VkPhysicalDevicePresentId2FeaturesKHR::operator=(features);
        VkPhysicalDevicePresentModeFifoLatestReadyFeaturesKHR::operator=(features);
        VkPhysicalDevicePresentWaitFeaturesKHR::operator=(features);
        VkPhysicalDevicePresentWait2FeaturesKHR::operator=(features);
        VkPhysicalDeviceRayQueryFeaturesKHR::operator=(features);
        VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR::operator=(features);
        VkPhysicalDeviceRayTracingPipelineFeaturesKHR::operator=(features);
        VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR::operator=(features);
        VkPhysicalDeviceRobustness2FeaturesKHR::operator=(features);
        VkPhysicalDeviceShaderBfloat16FeaturesKHR::operator=(features);
        VkPhysicalDeviceShaderClockFeaturesKHR::operator=(features);
        VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR::operator=(features);
        VkPhysicalDeviceShaderQuadControlFeaturesKHR::operator=(features);
        VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR::operator=(features);
        VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR::operator=(features);
        VkPhysicalDeviceSwapchainMaintenance1FeaturesKHR::operator=(features);
        VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR::operator=(features);
        VkPhysicalDeviceVideoDecodeVP9FeaturesKHR::operator=(features);
        VkPhysicalDeviceVideoEncodeAV1FeaturesKHR::operator=(features);
        VkPhysicalDeviceVideoEncodeIntraRefreshFeaturesKHR::operator=(features);
        VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR::operator=(features);
        VkPhysicalDeviceVideoMaintenance1FeaturesKHR::operator=(features);
        VkPhysicalDeviceVideoMaintenance2FeaturesKHR::operator=(features);
        VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR::operator=(features);

        _link();

        return *this;
    }

    ///
    /// \brief Chain an extension structure
    /// \param next
    void chain(void* next) {
        VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR::pNext = next;
    }

    ///
    /// \brief Implicit casting for chaining
    operator void*() {
        return static_cast<VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(this);
    }


// Helpers -------------------------------------------------------------------------------------------------------------
private:

    void _clear() {

        // Clear out the struct
        fennec::memset(this, 0, sizeof(*this));

        // Set structure types
        VkPhysicalDeviceAccelerationStructureFeaturesKHR::sType            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR;
        VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR::sType         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_KHR;
        VkPhysicalDeviceCooperativeMatrixFeaturesKHR::sType                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR;
        VkPhysicalDeviceDepthClampZeroOneFeaturesKHR::sType                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_KHR;
        VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR::sType        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR;
        VkPhysicalDeviceFragmentShadingRateFeaturesKHR::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR;
        VkPhysicalDeviceMaintenance7FeaturesKHR::sType                     = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_7_FEATURES_KHR;
        VkPhysicalDeviceMaintenance8FeaturesKHR::sType                     = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_8_FEATURES_KHR;
        VkPhysicalDeviceMaintenance9FeaturesKHR::sType                     = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_9_FEATURES_KHR;
        VkPhysicalDevicePerformanceQueryFeaturesKHR::sType                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR;
        VkPhysicalDevicePipelineBinaryFeaturesKHR::sType                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_BINARY_FEATURES_KHR;
        VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR::sType     = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR;
        VkPhysicalDevicePresentIdFeaturesKHR::sType                        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR;
        VkPhysicalDevicePresentId2FeaturesKHR::sType                       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_2_FEATURES_KHR;
        VkPhysicalDevicePresentModeFifoLatestReadyFeaturesKHR::sType       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_MODE_FIFO_LATEST_READY_FEATURES_KHR;
        VkPhysicalDevicePresentWaitFeaturesKHR::sType                      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR;
        VkPhysicalDevicePresentWait2FeaturesKHR::sType                     = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_2_FEATURES_KHR;
        VkPhysicalDeviceRayQueryFeaturesKHR::sType                         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR;
        VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR::sType           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR;
        VkPhysicalDeviceRayTracingPipelineFeaturesKHR::sType               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR;
        VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR::sType          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_POSITION_FETCH_FEATURES_KHR;
        VkPhysicalDeviceRobustness2FeaturesKHR::sType                      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_KHR;
        VkPhysicalDeviceShaderBfloat16FeaturesKHR::sType                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_BFLOAT16_FEATURES_KHR;
        VkPhysicalDeviceShaderClockFeaturesKHR::sType                      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR;
        VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR::sType       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MAXIMAL_RECONVERGENCE_FEATURES_KHR;
        VkPhysicalDeviceShaderQuadControlFeaturesKHR::sType                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_QUAD_CONTROL_FEATURES_KHR;
        VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR::sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_RELAXED_EXTENDED_INSTRUCTION_FEATURES_KHR;
        VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR::sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR;
        VkPhysicalDeviceSwapchainMaintenance1FeaturesKHR::sType            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_KHR;
        VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFIED_IMAGE_LAYOUTS_FEATURES_KHR;
        VkPhysicalDeviceVideoDecodeVP9FeaturesKHR::sType                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_DECODE_VP9_FEATURES_KHR;
        VkPhysicalDeviceVideoEncodeAV1FeaturesKHR::sType                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_AV1_FEATURES_KHR;
        VkPhysicalDeviceVideoEncodeIntraRefreshFeaturesKHR::sType          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_INTRA_REFRESH_FEATURES_KHR;
        VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR::sType       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_QUANTIZATION_MAP_FEATURES_KHR;
        VkPhysicalDeviceVideoMaintenance1FeaturesKHR::sType                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_1_FEATURES_KHR;
        VkPhysicalDeviceVideoMaintenance2FeaturesKHR::sType                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_2_FEATURES_KHR;
        VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR::sType    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR;
    }

    void _link() {


        // Bind to Features structures
        accelerationStructure                                 = &(VkPhysicalDeviceAccelerationStructureFeaturesKHR::accelerationStructure);
        accelerationStructureCaptureReplay                    = &(VkPhysicalDeviceAccelerationStructureFeaturesKHR::accelerationStructureCaptureReplay);
        accelerationStructureIndirectBuild                    = &(VkPhysicalDeviceAccelerationStructureFeaturesKHR::accelerationStructureIndirectBuild);
        accelerationStructureHostCommands                     = &(VkPhysicalDeviceAccelerationStructureFeaturesKHR::accelerationStructureHostCommands);
        descriptorBindingAccelerationStructureUpdateAfterBind = &(VkPhysicalDeviceAccelerationStructureFeaturesKHR::accelerationStructureHostCommands);
        computeDerivativeGroupQuads                           = &(VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR::computeDerivativeGroupQuads);
        computeDerivativeGroupLinear                          = &(VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR::computeDerivativeGroupLinear);
        cooperativeMatrix                                     = &(VkPhysicalDeviceCooperativeMatrixFeaturesKHR::cooperativeMatrix);
        cooperativeMatrixRobustBufferAccess                   = &(VkPhysicalDeviceCooperativeMatrixFeaturesKHR::cooperativeMatrixRobustBufferAccess);
        depthClampZeroOne                                     = &(VkPhysicalDeviceDepthClampZeroOneFeaturesKHR::depthClampZeroOne);
        fragmentShaderBarycentric                             = &(VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR::fragmentShaderBarycentric);
        pipelineFragmentShadingRate                           = &(VkPhysicalDeviceFragmentShadingRateFeaturesKHR::pipelineFragmentShadingRate);
        primitiveFragmentShadingRate                          = &(VkPhysicalDeviceFragmentShadingRateFeaturesKHR::primitiveFragmentShadingRate);
        attachmentFragmentShadingRate                         = &(VkPhysicalDeviceFragmentShadingRateFeaturesKHR::attachmentFragmentShadingRate);
        maintenance7                                          = &(VkPhysicalDeviceMaintenance7FeaturesKHR::maintenance7);
        maintenance8                                          = &(VkPhysicalDeviceMaintenance8FeaturesKHR::maintenance8);
        maintenance9                                          = &(VkPhysicalDeviceMaintenance9FeaturesKHR::maintenance9);
        performanceCounterQueryPools                          = &(VkPhysicalDevicePerformanceQueryFeaturesKHR::performanceCounterQueryPools);
        performanceCounterMultipleQueryPools                  = &(VkPhysicalDevicePerformanceQueryFeaturesKHR::performanceCounterMultipleQueryPools);
        pipelineBinaries                                      = &(VkPhysicalDevicePipelineBinaryFeaturesKHR::pipelineBinaries);
        pipelineExecutableInfo                                = &(VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR::pipelineExecutableInfo);
        presentId                                             = &(VkPhysicalDevicePresentIdFeaturesKHR::presentId);
        presentId2                                            = &(VkPhysicalDevicePresentId2FeaturesKHR::presentId2);
        presentModeFifoLatestReady                            = &(VkPhysicalDevicePresentModeFifoLatestReadyFeaturesKHR::presentModeFifoLatestReady);
        presentWait                                           = &(VkPhysicalDevicePresentWaitFeaturesKHR::presentWait);
        presentWait2                                          = &(VkPhysicalDevicePresentWait2FeaturesKHR::presentWait2);
        rayQuery                                              = &(VkPhysicalDeviceRayQueryFeaturesKHR::rayQuery);
        rayTracingMaintenance1                                = &(VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR::rayTracingMaintenance1);
        rayTracingPipelineTraceRaysIndirect2                  = &(VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR::rayTracingPipelineTraceRaysIndirect2);
        rayTracingPipeline                                    = &(VkPhysicalDeviceRayTracingPipelineFeaturesKHR::rayTracingPipeline);
        rayTracingPipelineShaderGroupHandleCaptureReplay      = &(VkPhysicalDeviceRayTracingPipelineFeaturesKHR::rayTracingPipelineShaderGroupHandleCaptureReplay);
        rayTracingPipelineShaderGroupHandleCaptureReplayMixed = &(VkPhysicalDeviceRayTracingPipelineFeaturesKHR::rayTracingPipelineShaderGroupHandleCaptureReplayMixed);
        rayTracingPipelineTraceRaysIndirect                   = &(VkPhysicalDeviceRayTracingPipelineFeaturesKHR::rayTracingPipelineTraceRaysIndirect);
        rayTraversalPrimitiveCulling                          = &(VkPhysicalDeviceRayTracingPipelineFeaturesKHR::rayTraversalPrimitiveCulling);
        rayTracingPositionFetch                               = &(VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR::rayTracingPositionFetch);
        robustBufferAccess2                                   = &(VkPhysicalDeviceRobustness2FeaturesKHR::robustBufferAccess2);
        robustImageAccess2                                    = &(VkPhysicalDeviceRobustness2FeaturesKHR::robustImageAccess2);
        nullDescriptor                                        = &(VkPhysicalDeviceRobustness2FeaturesKHR::nullDescriptor);
        shaderBFloat16Type                                    = &(VkPhysicalDeviceShaderBfloat16FeaturesKHR::shaderBFloat16Type);
        shaderBFloat16DotProduct                              = &(VkPhysicalDeviceShaderBfloat16FeaturesKHR::shaderBFloat16DotProduct);
        shaderBFloat16CooperativeMatrix                       = &(VkPhysicalDeviceShaderBfloat16FeaturesKHR::shaderBFloat16CooperativeMatrix);
        shaderSubgroupClock                                   = &(VkPhysicalDeviceShaderClockFeaturesKHR::shaderSubgroupClock);
        shaderDeviceClock                                     = &(VkPhysicalDeviceShaderClockFeaturesKHR::shaderDeviceClock);
        shaderMaximalReconvergence                            = &(VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR::shaderMaximalReconvergence);
        shaderQuadControl                                     = &(VkPhysicalDeviceShaderQuadControlFeaturesKHR::shaderQuadControl);
        shaderRelaxedExtendedInstruction                      = &(VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR::shaderRelaxedExtendedInstruction);
        shaderSubgroupUniformControlFlow                      = &(VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR::shaderSubgroupUniformControlFlow);
        swapchainMaintenance1                                 = &(VkPhysicalDeviceSwapchainMaintenance1FeaturesKHR::swapchainMaintenance1);
        unifiedImageLayouts                                   = &(VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR::unifiedImageLayouts);
        unifiedImageLayoutsVideo                              = &(VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR::unifiedImageLayoutsVideo);
        videoDecodeVP9                                        = &(VkPhysicalDeviceVideoDecodeVP9FeaturesKHR::videoDecodeVP9);
        videoEncodeAV1                                        = &(VkPhysicalDeviceVideoEncodeAV1FeaturesKHR::videoEncodeAV1);
        videoEncodeIntraRefresh                               = &(VkPhysicalDeviceVideoEncodeIntraRefreshFeaturesKHR::videoEncodeIntraRefresh);
        videoEncodeQuantizationMap                            = &(VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR::videoEncodeQuantizationMap);
        videoMaintenance1                                     = &(VkPhysicalDeviceVideoMaintenance1FeaturesKHR::videoMaintenance1);
        videoMaintenance2                                     = &(VkPhysicalDeviceVideoMaintenance2FeaturesKHR::videoMaintenance2);
        workgroupMemoryExplicitLayout                         = &(VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR::workgroupMemoryExplicitLayout);
        workgroupMemoryExplicitLayoutScalarBlockLayout        = &(VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR::workgroupMemoryExplicitLayoutScalarBlockLayout);
        workgroupMemoryExplicitLayout8BitAccess               = &(VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR::workgroupMemoryExplicitLayout8BitAccess);
        workgroupMemoryExplicitLayout16BitAccess              = &(VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR::workgroupMemoryExplicitLayout16BitAccess);


        // Daisy Chain
        VkPhysicalDeviceAccelerationStructureFeaturesKHR::pNext            = static_cast<VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR*>(this);
        VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR::pNext         = static_cast<VkPhysicalDeviceCooperativeMatrixFeaturesKHR*>(this);
        VkPhysicalDeviceCooperativeMatrixFeaturesKHR::pNext                = static_cast<VkPhysicalDeviceDepthClampZeroOneFeaturesKHR*>(this);
        VkPhysicalDeviceDepthClampZeroOneFeaturesKHR::pNext                = static_cast<VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR*>(this);
        VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR::pNext        = static_cast<VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(this);
        VkPhysicalDeviceFragmentShadingRateFeaturesKHR::pNext              = static_cast<VkPhysicalDeviceMaintenance7FeaturesKHR*>(this);
        VkPhysicalDeviceMaintenance7FeaturesKHR::pNext                     = static_cast<VkPhysicalDeviceMaintenance8FeaturesKHR*>(this);
        VkPhysicalDeviceMaintenance8FeaturesKHR::pNext                     = static_cast<VkPhysicalDeviceMaintenance9FeaturesKHR*>(this);
        VkPhysicalDeviceMaintenance9FeaturesKHR::pNext                     = static_cast<VkPhysicalDevicePerformanceQueryFeaturesKHR*>(this);
        VkPhysicalDevicePerformanceQueryFeaturesKHR::pNext                 = static_cast<VkPhysicalDevicePipelineBinaryFeaturesKHR*>(this);
        VkPhysicalDevicePipelineBinaryFeaturesKHR::pNext                   = static_cast<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(this);
        VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR::pNext     = static_cast<VkPhysicalDevicePresentIdFeaturesKHR*>(this);
        VkPhysicalDevicePresentIdFeaturesKHR::pNext                        = static_cast<VkPhysicalDevicePresentId2FeaturesKHR*>(this);
        VkPhysicalDevicePresentId2FeaturesKHR::pNext                       = static_cast<VkPhysicalDevicePresentModeFifoLatestReadyFeaturesKHR*>(this);
        VkPhysicalDevicePresentModeFifoLatestReadyFeaturesKHR::pNext       = static_cast<VkPhysicalDevicePresentWaitFeaturesKHR*>(this);
        VkPhysicalDevicePresentWaitFeaturesKHR::pNext                      = static_cast<VkPhysicalDevicePresentWait2FeaturesKHR*>(this);
        VkPhysicalDevicePresentWait2FeaturesKHR::pNext                     = static_cast<VkPhysicalDeviceRayQueryFeaturesKHR*>(this);
        VkPhysicalDeviceRayQueryFeaturesKHR::pNext                         = static_cast<VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR*>(this);
        VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR::pNext           = static_cast<VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(this);
        VkPhysicalDeviceRayTracingPipelineFeaturesKHR::pNext               = static_cast<VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR*>(this);
        VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR::pNext          = static_cast<VkPhysicalDeviceRobustness2FeaturesKHR*>(this);
        VkPhysicalDeviceRobustness2FeaturesKHR::pNext                      = static_cast<VkPhysicalDeviceShaderBfloat16FeaturesKHR*>(this);
        VkPhysicalDeviceShaderBfloat16FeaturesKHR::pNext                   = static_cast<VkPhysicalDeviceShaderClockFeaturesKHR*>(this);
        VkPhysicalDeviceShaderClockFeaturesKHR::pNext                      = static_cast<VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR*>(this);
        VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR::pNext       = static_cast<VkPhysicalDeviceShaderQuadControlFeaturesKHR*>(this);
        VkPhysicalDeviceShaderQuadControlFeaturesKHR::pNext                = static_cast<VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR*>(this);
        VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR::pNext = static_cast<VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR*>(this);
        VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR::pNext = static_cast<VkPhysicalDeviceSwapchainMaintenance1FeaturesKHR*>(this);
        VkPhysicalDeviceSwapchainMaintenance1FeaturesKHR::pNext            = static_cast<VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR*>(this);
        VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR::pNext              = static_cast<VkPhysicalDeviceVideoDecodeVP9FeaturesKHR*>(this);
        VkPhysicalDeviceVideoDecodeVP9FeaturesKHR::pNext                   = static_cast<VkPhysicalDeviceVideoEncodeAV1FeaturesKHR*>(this);
        VkPhysicalDeviceVideoEncodeAV1FeaturesKHR::pNext                   = static_cast<VkPhysicalDeviceVideoEncodeIntraRefreshFeaturesKHR*>(this);
        VkPhysicalDeviceVideoEncodeIntraRefreshFeaturesKHR::pNext          = static_cast<VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR*>(this);
        VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR::pNext       = static_cast<VkPhysicalDeviceVideoMaintenance1FeaturesKHR*>(this);
        VkPhysicalDeviceVideoMaintenance1FeaturesKHR::pNext                = static_cast<VkPhysicalDeviceVideoMaintenance2FeaturesKHR*>(this);
        VkPhysicalDeviceVideoMaintenance2FeaturesKHR::pNext                = static_cast<VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR*>(this);
        VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR::pNext    = nullptr;
    }
};

///
/// \brief EXT Features
struct device_features_ext : private VkPhysicalDeviceASTCDecodeFeaturesEXT,
                             private VkPhysicalDeviceAddressBindingReportFeaturesEXT,
                             private VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT,
                             private VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT,
                             private VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT,
                             private VkPhysicalDeviceBorderColorSwizzleFeaturesEXT,
                             private VkPhysicalDeviceBufferDeviceAddressFeaturesEXT,
                             private VkPhysicalDevice4444FormatsFeaturesEXT,
                             private VkPhysicalDeviceColorWriteEnableFeaturesEXT,
                             private VkPhysicalDeviceConditionalRenderingFeaturesEXT,
                             private VkPhysicalDeviceCustomBorderColorFeaturesEXT,
                             private VkPhysicalDeviceDepthBiasControlFeaturesEXT,
                             private VkPhysicalDeviceDepthClampControlFeaturesEXT,
                             private VkPhysicalDeviceDepthClipControlFeaturesEXT,
                             private VkPhysicalDeviceDepthClipEnableFeaturesEXT,
                             private VkPhysicalDeviceDescriptorBufferFeaturesEXT,
                             private VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT,
                             private VkPhysicalDeviceDeviceMemoryReportFeaturesEXT,
                             private VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT,
                             private VkPhysicalDeviceExtendedDynamicStateFeaturesEXT,
                             private VkPhysicalDeviceExtendedDynamicState2FeaturesEXT,
                             private VkPhysicalDeviceExtendedDynamicState3FeaturesEXT,
                             private VkPhysicalDeviceFaultFeaturesEXT,
                             private VkPhysicalDeviceFragmentDensityMapFeaturesEXT,
                             private VkPhysicalDeviceFragmentDensityMap2FeaturesEXT,
                             private VkPhysicalDeviceFragmentDensityMapOffsetFeaturesEXT,
                             private VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT,
                             private VkPhysicalDeviceFrameBoundaryFeaturesEXT,
                             private VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT,
                             private VkPhysicalDeviceImage2DViewOf3DFeaturesEXT,
                             private VkPhysicalDeviceImageCompressionControlFeaturesEXT,
                             private VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT,
                             private VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT,
                             private VkPhysicalDeviceImageViewMinLodFeaturesEXT,
                             private VkPhysicalDeviceLegacyDitheringFeaturesEXT,
                             private VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT,
                             private VkPhysicalDeviceMapMemoryPlacedFeaturesEXT,
                             private VkPhysicalDeviceMemoryPriorityFeaturesEXT,
                             private VkPhysicalDeviceMeshShaderFeaturesEXT,
                             private VkPhysicalDeviceMultiDrawFeaturesEXT,
                             private VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT,
                             private VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT,
                             private VkPhysicalDeviceNestedCommandBufferFeaturesEXT,
                             private VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT,
                             private VkPhysicalDeviceOpacityMicromapFeaturesEXT,
                             private VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT,
                             private VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT,
                             private VkPhysicalDevicePipelinePropertiesFeaturesEXT,
                             private VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT,
                             private VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT,
                             private VkPhysicalDeviceProvokingVertexFeaturesEXT,
                             private VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT,
                             private VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT,
                             private VkPhysicalDeviceShaderAtomicFloatFeaturesEXT,
                             private VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT,
                             private VkPhysicalDeviceShaderFloat8FeaturesEXT,
                             private VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT,
                             private VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT,
                             private VkPhysicalDeviceShaderObjectFeaturesEXT,
                             private VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT,
                             private VkPhysicalDeviceShaderTileImageFeaturesEXT,
                             private VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT,
                             private VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT,
                             private VkPhysicalDeviceTransformFeedbackFeaturesEXT,
                             private VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT,
                             private VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT,
                             private VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT,
                             private VkPhysicalDeviceYcbcrImageArraysFeaturesEXT,
                             private VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT {

// Public References ---------------------------------------------------------------------------------------------------
public:

    /// \name Features
    /// @{

    VkBool32* decodeModeSharedExponent;                              //!< Decode Mode Shared Exponent
    VkBool32* reportAddressBinding;                                  //!< Report Address Binding
    VkBool32* attachmentFeedbackLoopDynamicState;                    //!< Attachment Feedback Loop Dynamic State
    VkBool32* attachmentFeedbackLoopLayout;                          //!< Attachment Feedback Loop Layout
    VkBool32* advancedBlendCoherentOperations;                       //!< Advanced Blend Coherent Operations
    VkBool32* borderColorSwizzle;                                    //!< Border Color Swizzle
    VkBool32* borderColorSwizzleFromImage;                           //!< Border Color Swizzle From Image
    VkBool32* bufferDeviceAddress;                                   //!< Buffer Device Address
    VkBool32* bufferDeviceAddressCaptureReplay;                      //!< Buffer Device Address Capture Replay
    VkBool32* bufferDeviceAddressMultiDevice;                        //!< Buffer Device Address Multi Device
    VkBool32* formatA4R4G4B4;                                        //!< Format A4 R4 G4 B4
    VkBool32* formatA4B4G4R4;                                        //!< Format A4 B4 G4 R4
    VkBool32* colorWriteEnable;                                      //!< Color Write Enable
    VkBool32* conditionalRendering;                                  //!< Conditional Rendering
    VkBool32* inheritedConditionalRendering;                         //!< Inherited Conditional Rendering
    VkBool32* customBorderColors;                                    //!< Custom Border Colors
    VkBool32* customBorderColorWithoutFormat;                        //!< Custom Border Color Without Format
    VkBool32* depthBiasControl;                                      //!< Depth Bias Control
    VkBool32* leastRepresentableValueForceUnormRepresentation;       //!< Least Representable Value Force Unorm Representation
    VkBool32* floatRepresentation;                                   //!< Float Representation
    VkBool32* depthBiasExact;                                        //!< Depth Bias Exact
    VkBool32* depthClampControl;                                     //!< Depth Clamp Control
    VkBool32* depthClipControl;                                      //!< Depth Clip Control
    VkBool32* depthClipEnable;                                       //!< Depth Clip Enable
    VkBool32* descriptorBuffer;                                      //!< Descriptor Buffer
    VkBool32* descriptorBufferCaptureReplay;                         //!< Descriptor Buffer Capture Replay
    VkBool32* descriptorBufferImageLayoutIgnored;                    //!< Descriptor Buffer Image Layout Ignored
    VkBool32* descriptorBufferPushDescriptors;                       //!< Descriptor Buffer Push Descriptors
    VkBool32* deviceGeneratedCommands;                               //!< Device Generated Commands
    VkBool32* dynamicGeneratedPipelineLayout;                        //!< Dynamic Generated Pipeline Layout
    VkBool32* deviceMemoryReport;                                    //!< Device Memory Report
    VkBool32* dynamicRenderingUnusedAttachments;                     //!< Dynamic Rendering Unused Attachments
    VkBool32* extendedDynamicState;                                  //!< Extended Dynamic State
    VkBool32* extendedDynamicState2;                                 //!< Extended Dynamic State2
    VkBool32* extendedDynamicState2LogicOp;                          //!< Extended Dynamic State2 Logic Op
    VkBool32* extendedDynamicState2PatchControlPoints;               //!< Extended Dynamic State2 Patch Control Points
    VkBool32* extendedDynamicState3TessellationDomainOrigin;         //!< Extended Dynamic State3 Tessellation Domain Origin
    VkBool32* extendedDynamicState3DepthClampEnable;                 //!< Extended Dynamic State3 Depth Clamp Enable
    VkBool32* extendedDynamicState3PolygonMode;                      //!< Extended Dynamic State3 Polygon Mode
    VkBool32* extendedDynamicState3RasterizationSamples;             //!< Extended Dynamic State3 Rasterization Samples
    VkBool32* extendedDynamicState3SampleMask;                       //!< Extended Dynamic State3 Sample Mask
    VkBool32* extendedDynamicState3AlphaToCoverageEnable;            //!< Extended Dynamic State3 Alpha To Coverage Enable
    VkBool32* extendedDynamicState3AlphaToOneEnable;                 //!< Extended Dynamic State3 Alpha To One Enable
    VkBool32* extendedDynamicState3LogicOpEnable;                    //!< Extended Dynamic State3 Logic Op Enable
    VkBool32* extendedDynamicState3ColorBlendEnable;                 //!< Extended Dynamic State3 Color Blend Enable
    VkBool32* extendedDynamicState3ColorBlendEquation;               //!< Extended Dynamic State3 Color Blend Equation
    VkBool32* extendedDynamicState3ColorWriteMask;                   //!< Extended Dynamic State3 Color Write Mask
    VkBool32* extendedDynamicState3RasterizationStream;              //!< Extended Dynamic State3 Rasterization Stream
    VkBool32* extendedDynamicState3ConservativeRasterizationMode;    //!< Extended Dynamic State3 Conservative Rasterization Mode
    VkBool32* extendedDynamicState3ExtraPrimitiveOverestimationSize; //!< Extended Dynamic State3 Extra Primitive Overestimation Size
    VkBool32* extendedDynamicState3DepthClipEnable;                  //!< Extended Dynamic State3 Depth Clip Enable
    VkBool32* extendedDynamicState3SampleLocationsEnable;            //!< Extended Dynamic State3 Sample Locations Enable
    VkBool32* extendedDynamicState3ColorBlendAdvanced;               //!< Extended Dynamic State3 Color Blend Advanced
    VkBool32* extendedDynamicState3ProvokingVertexMode;              //!< Extended Dynamic State3 Provoking Vertex Mode
    VkBool32* extendedDynamicState3LineRasterizationMode;            //!< Extended Dynamic State3 Line Rasterization Mode
    VkBool32* extendedDynamicState3LineStippleEnable;                //!< Extended Dynamic State3 Line Stipple Enable
    VkBool32* extendedDynamicState3DepthClipNegativeOneToOne;        //!< Extended Dynamic State3 Depth Clip Negative One To One
    VkBool32* extendedDynamicState3ViewportWScalingEnable;           //!< Extended Dynamic State3 Viewport W Scaling Enable
    VkBool32* extendedDynamicState3ViewportSwizzle;                  //!< Extended Dynamic State3 Viewport Swizzle
    VkBool32* extendedDynamicState3CoverageToColorEnable;            //!< Extended Dynamic State3 Coverage To Color Enable
    VkBool32* extendedDynamicState3CoverageToColorLocation;          //!< Extended Dynamic State3 Coverage To Color Location
    VkBool32* extendedDynamicState3CoverageModulationMode;           //!< Extended Dynamic State3 Coverage Modulation Mode
    VkBool32* extendedDynamicState3CoverageModulationTableEnable;    //!< Extended Dynamic State3 Coverage Modulation Table Enable
    VkBool32* extendedDynamicState3CoverageModulationTable;          //!< Extended Dynamic State3 Coverage Modulation Table
    VkBool32* extendedDynamicState3CoverageReductionMode;            //!< Extended Dynamic State3 Coverage Reduction Mode
    VkBool32* extendedDynamicState3RepresentativeFragmentTestEnable; //!< Extended Dynamic State3 Representative Fragment Test Enable
    VkBool32* extendedDynamicState3ShadingRateImageEnable;           //!< Extended Dynamic State3 Shading Rate Image Enable
    VkBool32* deviceFault;                                           //!< Device Fault
    VkBool32* deviceFaultVendorBinary;                               //!< Device Fault Vendor Binary
    VkBool32* fragmentDensityMap;                                    //!< Fragment Density Map
    VkBool32* fragmentDensityMapDynamic;                             //!< Fragment Density Map Dynamic
    VkBool32* fragmentDensityMapNonSubsampledImages;                 //!< Fragment Density Map Non Subsampled Images
    VkBool32* fragmentDensityMapDeferred;                            //!< Fragment Density Map Deferred
    VkBool32* fragmentDensityMapOffset;                              //!< Fragment Density Map Offset
    VkBool32* fragmentShaderSampleInterlock;                         //!< Fragment Shader Sample Interlock
    VkBool32* fragmentShaderPixelInterlock;                          //!< Fragment Shader Pixel Interlock
    VkBool32* fragmentShaderShadingRateInterlock;                    //!< Fragment Shader Shading Rate Interlock
    VkBool32* frameBoundary;                                         //!< Frame Boundary
    VkBool32* graphicsPipelineLibrary;                               //!< Graphics Pipeline Library
    VkBool32* image2DViewOf3D;                                       //!< Image2 D View Of3 D
    VkBool32* sampler2DViewOf3D;                                     //!< Sampler2 D View Of3 D
    VkBool32* imageCompressionControl;                               //!< Image Compression Control
    VkBool32* imageCompressionControlSwapchain;                      //!< Image Compression Control Swapchain
    VkBool32* imageSlicedViewOf3D;                                   //!< Image Sliced View Of3 D
    VkBool32* imageMinLod;                                           //!< Image Min Lod
    VkBool32* legacyDithering;                                       //!< Legacy Dithering
    VkBool32* legacyVertexAttributes;                                //!< Legacy Vertex Attributes
    VkBool32* memoryMapPlaced;                                       //!< Memory Map Placed
    VkBool32* memoryMapRangePlaced;                                  //!< Memory Map Range Placed
    VkBool32* memoryUnmapReserve;                                    //!< Memory Unmap Reserve
    VkBool32* memoryPriority;                                        //!< Memory Priority
    VkBool32* taskShader;                                            //!< Task Shader
    VkBool32* meshShader;                                            //!< Mesh Shader
    VkBool32* multiviewMeshShader;                                   //!< Multiview Mesh Shader
    VkBool32* primitiveFragmentShadingRateMeshShader;                //!< Primitive Fragment Shading Rate Mesh Shader
    VkBool32* meshShaderQueries;                                     //!< Mesh Shader Queries
    VkBool32* multiDraw;                                             //!< Multi Draw
    VkBool32* multisampledRenderToSingleSampled;                     //!< Multisampled Render To Single Sampled
    VkBool32* mutableDescriptorType;                                 //!< Mutable Descriptor Type
    VkBool32* nestedCommandBuffer;                                   //!< Nested Command Buffer
    VkBool32* nestedCommandBufferRendering;                          //!< Nested Command Buffer Rendering
    VkBool32* nestedCommandBufferSimultaneousUse;                    //!< Nested Command Buffer Simultaneous Use
    VkBool32* nonSeamlessCubeMap;                                    //!< Non Seamless Cube Map
    VkBool32* micromap;                                              //!< Micromap
    VkBool32* micromapCaptureReplay;                                 //!< Micromap Capture Replay
    VkBool32* micromapHostCommands;                                  //!< Micromap Host Commands
    VkBool32* pageableDeviceLocalMemory;                             //!< Pageable Device Local Memory
    VkBool32* pipelineLibraryGroupHandles;                           //!< Pipeline Library Group Handles
    VkBool32* pipelinePropertiesIdentifier;                          //!< Pipeline Properties Identifier
    VkBool32* primitiveTopologyListRestart;                          //!< Primitive Topology List Restart
    VkBool32* primitiveTopologyPatchListRestart;                     //!< Primitive Topology Patch List Restart
    VkBool32* primitivesGeneratedQuery;                              //!< Primitives Generated Query
    VkBool32* primitivesGeneratedQueryWithRasterizerDiscard;         //!< Primitives Generated Query With Rasterizer Discard
    VkBool32* primitivesGeneratedQueryWithNonZeroStreams;            //!< Primitives Generated Query With Non Zero Streams
    VkBool32* provokingVertexLast;                                   //!< Provoking Vertex Last
    VkBool32* transformFeedbackPreservesProvokingVertex;             //!< Transform Feedback Preserves Provoking Vertex
    VkBool32* formatRgba10x6WithoutYCbCrSampler;                     //!< Format Rgba10x6 Without Y Cb Cr Sampler
    VkBool32* rasterizationOrderColorAttachmentAccess;               //!< Rasterization Order Color Attachment Access
    VkBool32* rasterizationOrderDepthAttachmentAccess;               //!< Rasterization Order Depth Attachment Access
    VkBool32* rasterizationOrderStencilAttachmentAccess;             //!< Rasterization Order Stencil Attachment Access
    VkBool32* shaderBufferFloat32Atomics;                            //!< Shader Buffer Float32 Atomics
    VkBool32* shaderBufferFloat32AtomicAdd;                          //!< Shader Buffer Float32 Atomic Add
    VkBool32* shaderBufferFloat64Atomics;                            //!< Shader Buffer Float64 Atomics
    VkBool32* shaderBufferFloat64AtomicAdd;                          //!< Shader Buffer Float64 Atomic Add
    VkBool32* shaderSharedFloat32Atomics;                            //!< Shader Shared Float32 Atomics
    VkBool32* shaderSharedFloat32AtomicAdd;                          //!< Shader Shared Float32 Atomic Add
    VkBool32* shaderSharedFloat64Atomics;                            //!< Shader Shared Float64 Atomics
    VkBool32* shaderSharedFloat64AtomicAdd;                          //!< Shader Shared Float64 Atomic Add
    VkBool32* shaderImageFloat32Atomics;                             //!< Shader Image Float32 Atomics
    VkBool32* shaderImageFloat32AtomicAdd;                           //!< Shader Image Float32 Atomic Add
    VkBool32* sparseImageFloat32Atomics;                             //!< Sparse Image Float32 Atomics
    VkBool32* sparseImageFloat32AtomicAdd;                           //!< Sparse Image Float32 Atomic Add
    VkBool32* shaderBufferFloat16Atomics;                            //!< Shader Buffer Float16 Atomics
    VkBool32* shaderBufferFloat16AtomicAdd;                          //!< Shader Buffer Float16 Atomic Add
    VkBool32* shaderBufferFloat16AtomicMinMax;                       //!< Shader Buffer Float16 Atomic Min Max
    VkBool32* shaderBufferFloat32AtomicMinMax;                       //!< Shader Buffer Float32 Atomic Min Max
    VkBool32* shaderBufferFloat64AtomicMinMax;                       //!< Shader Buffer Float64 Atomic Min Max
    VkBool32* shaderSharedFloat16Atomics;                            //!< Shader Shared Float16 Atomics
    VkBool32* shaderSharedFloat16AtomicAdd;                          //!< Shader Shared Float16 Atomic Add
    VkBool32* shaderSharedFloat16AtomicMinMax;                       //!< Shader Shared Float16 Atomic Min Max
    VkBool32* shaderSharedFloat32AtomicMinMax;                       //!< Shader Shared Float32 Atomic Min Max
    VkBool32* shaderSharedFloat64AtomicMinMax;                       //!< Shader Shared Float64 Atomic Min Max
    VkBool32* shaderImageFloat32AtomicMinMax;                        //!< Shader Image Float32 Atomic Min Max
    VkBool32* sparseImageFloat32AtomicMinMax;                        //!< Sparse Image Float32 Atomic Min Max
    VkBool32* shaderFloat8;                                          //!< Shader Float8
    VkBool32* shaderFloat8CooperativeMatrix;                         //!< Shader Float8 Cooperative Matrix
    VkBool32* shaderImageInt64Atomics;                               //!< Shader Image Int64 Atomics
    VkBool32* sparseImageInt64Atomics;                               //!< Sparse Image Int64 Atomics
    VkBool32* shaderModuleIdentifier;                                //!< Shader Module Identifier
    VkBool32* shaderObject;                                          //!< Shader Object
    VkBool32* shaderReplicatedComposites;                            //!< Shader Replicated Composites
    VkBool32* shaderTileImageColorReadAccess;                        //!< Shader Tile Image Color Read Access
    VkBool32* shaderTileImageDepthReadAccess;                        //!< Shader Tile Image Depth Read Access
    VkBool32* shaderTileImageStencilReadAccess;                      //!< Shader Tile Image Stencil Read Access
    VkBool32* subpassMergeFeedback;                                  //!< Subpass Merge Feedback
    VkBool32* texelBufferAlignment;                                  //!< Texel Buffer Alignment
    VkBool32* transformFeedback;                                     //!< Transform Feedback
    VkBool32* geometryStreams;                                       //!< Geometry Streams
    VkBool32* vertexAttributeRobustness;                             //!< Vertex Attribute Robustness
    VkBool32* vertexInputDynamicState;                               //!< Vertex Input Dynamic State
    VkBool32* ycbcr2plane444Formats;                                 //!< Ycbcr2plane444 Formats
    VkBool32* ycbcrImageArrays;                                      //!< Ycbcr Image Arrays
    VkBool32* zeroInitializeDeviceMemory;                            //!< Zero Initialize Device Memory

    /// @}


// Methods -------------------------------------------------------------------------------------------------------------
public:

    ///
    /// \brief Features Constructor
    device_features_ext()
        : VkPhysicalDeviceASTCDecodeFeaturesEXT { }
        , VkPhysicalDeviceAddressBindingReportFeaturesEXT { }
        , VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT { }
        , VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT { }
        , VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT { }
        , VkPhysicalDeviceBorderColorSwizzleFeaturesEXT { }
        , VkPhysicalDeviceBufferDeviceAddressFeaturesEXT { }
        , VkPhysicalDevice4444FormatsFeaturesEXT { }
        , VkPhysicalDeviceColorWriteEnableFeaturesEXT { }
        , VkPhysicalDeviceConditionalRenderingFeaturesEXT { }
        , VkPhysicalDeviceCustomBorderColorFeaturesEXT { }
        , VkPhysicalDeviceDepthBiasControlFeaturesEXT { }
        , VkPhysicalDeviceDepthClampControlFeaturesEXT { }
        , VkPhysicalDeviceDepthClipControlFeaturesEXT { }
        , VkPhysicalDeviceDepthClipEnableFeaturesEXT { }
        , VkPhysicalDeviceDescriptorBufferFeaturesEXT { }
        , VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT { }
        , VkPhysicalDeviceDeviceMemoryReportFeaturesEXT { }
        , VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT { }
        , VkPhysicalDeviceExtendedDynamicStateFeaturesEXT { }
        , VkPhysicalDeviceExtendedDynamicState2FeaturesEXT { }
        , VkPhysicalDeviceExtendedDynamicState3FeaturesEXT { }
        , VkPhysicalDeviceFaultFeaturesEXT { }
        , VkPhysicalDeviceFragmentDensityMapFeaturesEXT { }
        , VkPhysicalDeviceFragmentDensityMap2FeaturesEXT { }
        , VkPhysicalDeviceFragmentDensityMapOffsetFeaturesEXT { }
        , VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT { }
        , VkPhysicalDeviceFrameBoundaryFeaturesEXT { }
        , VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT { }
        , VkPhysicalDeviceImage2DViewOf3DFeaturesEXT { }
        , VkPhysicalDeviceImageCompressionControlFeaturesEXT { }
        , VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT { }
        , VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT { }
        , VkPhysicalDeviceImageViewMinLodFeaturesEXT { }
        , VkPhysicalDeviceLegacyDitheringFeaturesEXT { }
        , VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT { }
        , VkPhysicalDeviceMapMemoryPlacedFeaturesEXT { }
        , VkPhysicalDeviceMemoryPriorityFeaturesEXT { }
        , VkPhysicalDeviceMeshShaderFeaturesEXT { }
        , VkPhysicalDeviceMultiDrawFeaturesEXT { }
        , VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT { }
        , VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT { }
        , VkPhysicalDeviceNestedCommandBufferFeaturesEXT { }
        , VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT { }
        , VkPhysicalDeviceOpacityMicromapFeaturesEXT { }
        , VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT { }
        , VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT { }
        , VkPhysicalDevicePipelinePropertiesFeaturesEXT { }
        , VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT { }
        , VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT { }
        , VkPhysicalDeviceProvokingVertexFeaturesEXT { }
        , VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT { }
        , VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT { }
        , VkPhysicalDeviceShaderAtomicFloatFeaturesEXT { }
        , VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT { }
        , VkPhysicalDeviceShaderFloat8FeaturesEXT { }
        , VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT { }
        , VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT { }
        , VkPhysicalDeviceShaderObjectFeaturesEXT { }
        , VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT { }
        , VkPhysicalDeviceShaderTileImageFeaturesEXT { }
        , VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT { }
        , VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT { }
        , VkPhysicalDeviceTransformFeedbackFeaturesEXT { }
        , VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT { }
        , VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT { }
        , VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT { }
        , VkPhysicalDeviceYcbcrImageArraysFeaturesEXT { }
        , VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT { }
        , decodeModeSharedExponent { nullptr }
        , reportAddressBinding { nullptr }
        , attachmentFeedbackLoopDynamicState { nullptr }
        , attachmentFeedbackLoopLayout { nullptr }
        , advancedBlendCoherentOperations { nullptr }
        , borderColorSwizzle { nullptr }
        , borderColorSwizzleFromImage { nullptr }
        , bufferDeviceAddress { nullptr }
        , bufferDeviceAddressCaptureReplay { nullptr }
        , bufferDeviceAddressMultiDevice { nullptr }
        , formatA4R4G4B4 { nullptr }
        , formatA4B4G4R4 { nullptr }
        , colorWriteEnable { nullptr }
        , conditionalRendering { nullptr }
        , inheritedConditionalRendering { nullptr }
        , customBorderColors { nullptr }
        , customBorderColorWithoutFormat { nullptr }
        , depthBiasControl { nullptr }
        , leastRepresentableValueForceUnormRepresentation { nullptr }
        , floatRepresentation { nullptr }
        , depthBiasExact { nullptr }
        , depthClampControl { nullptr }
        , depthClipControl { nullptr }
        , depthClipEnable { nullptr }
        , descriptorBuffer { nullptr }
        , descriptorBufferCaptureReplay { nullptr }
        , descriptorBufferImageLayoutIgnored { nullptr }
        , descriptorBufferPushDescriptors { nullptr }
        , deviceGeneratedCommands { nullptr }
        , dynamicGeneratedPipelineLayout { nullptr }
        , deviceMemoryReport { nullptr }
        , dynamicRenderingUnusedAttachments { nullptr }
        , extendedDynamicState { nullptr }
        , extendedDynamicState2 { nullptr }
        , extendedDynamicState2LogicOp { nullptr }
        , extendedDynamicState2PatchControlPoints { nullptr }
        , extendedDynamicState3TessellationDomainOrigin { nullptr }
        , extendedDynamicState3DepthClampEnable { nullptr }
        , extendedDynamicState3PolygonMode { nullptr }
        , extendedDynamicState3RasterizationSamples { nullptr }
        , extendedDynamicState3SampleMask { nullptr }
        , extendedDynamicState3AlphaToCoverageEnable { nullptr }
        , extendedDynamicState3AlphaToOneEnable { nullptr }
        , extendedDynamicState3LogicOpEnable { nullptr }
        , extendedDynamicState3ColorBlendEnable { nullptr }
        , extendedDynamicState3ColorBlendEquation { nullptr }
        , extendedDynamicState3ColorWriteMask { nullptr }
        , extendedDynamicState3RasterizationStream { nullptr }
        , extendedDynamicState3ConservativeRasterizationMode { nullptr }
        , extendedDynamicState3ExtraPrimitiveOverestimationSize { nullptr }
        , extendedDynamicState3DepthClipEnable { nullptr }
        , extendedDynamicState3SampleLocationsEnable { nullptr }
        , extendedDynamicState3ColorBlendAdvanced { nullptr }
        , extendedDynamicState3ProvokingVertexMode { nullptr }
        , extendedDynamicState3LineRasterizationMode { nullptr }
        , extendedDynamicState3LineStippleEnable { nullptr }
        , extendedDynamicState3DepthClipNegativeOneToOne { nullptr }
        , extendedDynamicState3ViewportWScalingEnable { nullptr }
        , extendedDynamicState3ViewportSwizzle { nullptr }
        , extendedDynamicState3CoverageToColorEnable { nullptr }
        , extendedDynamicState3CoverageToColorLocation { nullptr }
        , extendedDynamicState3CoverageModulationMode { nullptr }
        , extendedDynamicState3CoverageModulationTableEnable { nullptr }
        , extendedDynamicState3CoverageModulationTable { nullptr }
        , extendedDynamicState3CoverageReductionMode { nullptr }
        , extendedDynamicState3RepresentativeFragmentTestEnable { nullptr }
        , extendedDynamicState3ShadingRateImageEnable { nullptr }
        , deviceFault { nullptr }
        , deviceFaultVendorBinary { nullptr }
        , fragmentDensityMap { nullptr }
        , fragmentDensityMapDynamic { nullptr }
        , fragmentDensityMapNonSubsampledImages { nullptr }
        , fragmentDensityMapDeferred { nullptr }
        , fragmentDensityMapOffset { nullptr }
        , fragmentShaderSampleInterlock { nullptr }
        , fragmentShaderPixelInterlock { nullptr }
        , fragmentShaderShadingRateInterlock { nullptr }
        , frameBoundary { nullptr }
        , graphicsPipelineLibrary { nullptr }
        , image2DViewOf3D { nullptr }
        , sampler2DViewOf3D { nullptr }
        , imageCompressionControl { nullptr }
        , imageCompressionControlSwapchain { nullptr }
        , imageSlicedViewOf3D { nullptr }
        , imageMinLod { nullptr }
        , legacyDithering { nullptr }
        , legacyVertexAttributes { nullptr }
        , memoryMapPlaced { nullptr }
        , memoryMapRangePlaced { nullptr }
        , memoryUnmapReserve { nullptr }
        , memoryPriority { nullptr }
        , taskShader { nullptr }
        , meshShader { nullptr }
        , multiviewMeshShader { nullptr }
        , primitiveFragmentShadingRateMeshShader { nullptr }
        , meshShaderQueries { nullptr }
        , multiDraw { nullptr }
        , multisampledRenderToSingleSampled { nullptr }
        , mutableDescriptorType { nullptr }
        , nestedCommandBuffer { nullptr }
        , nestedCommandBufferRendering { nullptr }
        , nestedCommandBufferSimultaneousUse { nullptr }
        , nonSeamlessCubeMap { nullptr }
        , micromap { nullptr }
        , micromapCaptureReplay { nullptr }
        , micromapHostCommands { nullptr }
        , pageableDeviceLocalMemory { nullptr }
        , pipelineLibraryGroupHandles { nullptr }
        , pipelinePropertiesIdentifier { nullptr }
        , primitiveTopologyListRestart { nullptr }
        , primitiveTopologyPatchListRestart { nullptr }
        , primitivesGeneratedQuery { nullptr }
        , primitivesGeneratedQueryWithRasterizerDiscard { nullptr }
        , primitivesGeneratedQueryWithNonZeroStreams { nullptr }
        , provokingVertexLast { nullptr }
        , transformFeedbackPreservesProvokingVertex { nullptr }
        , formatRgba10x6WithoutYCbCrSampler { nullptr }
        , rasterizationOrderColorAttachmentAccess { nullptr }
        , rasterizationOrderDepthAttachmentAccess { nullptr }
        , rasterizationOrderStencilAttachmentAccess { nullptr }
        , shaderBufferFloat32Atomics { nullptr }
        , shaderBufferFloat32AtomicAdd { nullptr }
        , shaderBufferFloat64Atomics { nullptr }
        , shaderBufferFloat64AtomicAdd { nullptr }
        , shaderSharedFloat32Atomics { nullptr }
        , shaderSharedFloat32AtomicAdd { nullptr }
        , shaderSharedFloat64Atomics { nullptr }
        , shaderSharedFloat64AtomicAdd { nullptr }
        , shaderImageFloat32Atomics { nullptr }
        , shaderImageFloat32AtomicAdd { nullptr }
        , sparseImageFloat32Atomics { nullptr }
        , sparseImageFloat32AtomicAdd { nullptr }
        , shaderBufferFloat16Atomics { nullptr }
        , shaderBufferFloat16AtomicAdd { nullptr }
        , shaderBufferFloat16AtomicMinMax { nullptr }
        , shaderBufferFloat32AtomicMinMax { nullptr }
        , shaderBufferFloat64AtomicMinMax { nullptr }
        , shaderSharedFloat16Atomics { nullptr }
        , shaderSharedFloat16AtomicAdd { nullptr }
        , shaderSharedFloat16AtomicMinMax { nullptr }
        , shaderSharedFloat32AtomicMinMax { nullptr }
        , shaderSharedFloat64AtomicMinMax { nullptr }
        , shaderImageFloat32AtomicMinMax { nullptr }
        , sparseImageFloat32AtomicMinMax { nullptr }
        , shaderFloat8 { nullptr }
        , shaderFloat8CooperativeMatrix { nullptr }
        , shaderImageInt64Atomics { nullptr }
        , sparseImageInt64Atomics { nullptr }
        , shaderModuleIdentifier { nullptr }
        , shaderObject { nullptr }
        , shaderReplicatedComposites { nullptr }
        , shaderTileImageColorReadAccess { nullptr }
        , shaderTileImageDepthReadAccess { nullptr }
        , shaderTileImageStencilReadAccess { nullptr }
        , subpassMergeFeedback { nullptr }
        , texelBufferAlignment { nullptr }
        , transformFeedback { nullptr }
        , geometryStreams { nullptr }
        , vertexAttributeRobustness { nullptr }
        , vertexInputDynamicState { nullptr }
        , ycbcr2plane444Formats { nullptr }
        , ycbcrImageArrays { nullptr }
        , zeroInitializeDeviceMemory { nullptr } {

        _clear();
        _link();
    }


    ///
    /// \brief Copy Constructor
    /// \param features The features structure to copy
    device_features_ext(const device_features_ext& features)
        : VkPhysicalDeviceASTCDecodeFeaturesEXT { features }
        , VkPhysicalDeviceAddressBindingReportFeaturesEXT { features }
        , VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT { features }
        , VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT { features }
        , VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT { features }
        , VkPhysicalDeviceBorderColorSwizzleFeaturesEXT { features }
        , VkPhysicalDeviceBufferDeviceAddressFeaturesEXT { features }
        , VkPhysicalDevice4444FormatsFeaturesEXT { features }
        , VkPhysicalDeviceColorWriteEnableFeaturesEXT { features }
        , VkPhysicalDeviceConditionalRenderingFeaturesEXT { features }
        , VkPhysicalDeviceCustomBorderColorFeaturesEXT { features }
        , VkPhysicalDeviceDepthBiasControlFeaturesEXT { features }
        , VkPhysicalDeviceDepthClampControlFeaturesEXT { features }
        , VkPhysicalDeviceDepthClipControlFeaturesEXT { features }
        , VkPhysicalDeviceDepthClipEnableFeaturesEXT { features }
        , VkPhysicalDeviceDescriptorBufferFeaturesEXT { features }
        , VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT { features }
        , VkPhysicalDeviceDeviceMemoryReportFeaturesEXT { features }
        , VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT { features }
        , VkPhysicalDeviceExtendedDynamicStateFeaturesEXT { features }
        , VkPhysicalDeviceExtendedDynamicState2FeaturesEXT { features }
        , VkPhysicalDeviceExtendedDynamicState3FeaturesEXT { features }
        , VkPhysicalDeviceFaultFeaturesEXT { features }
        , VkPhysicalDeviceFragmentDensityMapFeaturesEXT { features }
        , VkPhysicalDeviceFragmentDensityMap2FeaturesEXT { features }
        , VkPhysicalDeviceFragmentDensityMapOffsetFeaturesEXT { features }
        , VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT { features }
        , VkPhysicalDeviceFrameBoundaryFeaturesEXT { features }
        , VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT { features }
        , VkPhysicalDeviceImage2DViewOf3DFeaturesEXT { features }
        , VkPhysicalDeviceImageCompressionControlFeaturesEXT { features }
        , VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT { features }
        , VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT { features }
        , VkPhysicalDeviceImageViewMinLodFeaturesEXT { features }
        , VkPhysicalDeviceLegacyDitheringFeaturesEXT { features }
        , VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT { features }
        , VkPhysicalDeviceMapMemoryPlacedFeaturesEXT { features }
        , VkPhysicalDeviceMemoryPriorityFeaturesEXT { features }
        , VkPhysicalDeviceMeshShaderFeaturesEXT { features }
        , VkPhysicalDeviceMultiDrawFeaturesEXT { features }
        , VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT { features }
        , VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT { features }
        , VkPhysicalDeviceNestedCommandBufferFeaturesEXT { features }
        , VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT { features }
        , VkPhysicalDeviceOpacityMicromapFeaturesEXT { features }
        , VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT { features }
        , VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT { features }
        , VkPhysicalDevicePipelinePropertiesFeaturesEXT { features }
        , VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT { features }
        , VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT { features }
        , VkPhysicalDeviceProvokingVertexFeaturesEXT { features }
        , VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT { features }
        , VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT { features }
        , VkPhysicalDeviceShaderAtomicFloatFeaturesEXT { features }
        , VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT { features }
        , VkPhysicalDeviceShaderFloat8FeaturesEXT { features }
        , VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT { features }
        , VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT { features }
        , VkPhysicalDeviceShaderObjectFeaturesEXT { features }
        , VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT { features }
        , VkPhysicalDeviceShaderTileImageFeaturesEXT { features }
        , VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT { features }
        , VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT { features }
        , VkPhysicalDeviceTransformFeedbackFeaturesEXT { features }
        , VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT { features }
        , VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT { features }
        , VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT { features }
        , VkPhysicalDeviceYcbcrImageArraysFeaturesEXT { features }
        , VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT { features }
        , decodeModeSharedExponent { nullptr }
        , reportAddressBinding { nullptr }
        , attachmentFeedbackLoopDynamicState { nullptr }
        , attachmentFeedbackLoopLayout { nullptr }
        , advancedBlendCoherentOperations { nullptr }
        , borderColorSwizzle { nullptr }
        , borderColorSwizzleFromImage { nullptr }
        , bufferDeviceAddress { nullptr }
        , bufferDeviceAddressCaptureReplay { nullptr }
        , bufferDeviceAddressMultiDevice { nullptr }
        , formatA4R4G4B4 { nullptr }
        , formatA4B4G4R4 { nullptr }
        , colorWriteEnable { nullptr }
        , conditionalRendering { nullptr }
        , inheritedConditionalRendering { nullptr }
        , customBorderColors { nullptr }
        , customBorderColorWithoutFormat { nullptr }
        , depthBiasControl { nullptr }
        , leastRepresentableValueForceUnormRepresentation { nullptr }
        , floatRepresentation { nullptr }
        , depthBiasExact { nullptr }
        , depthClampControl { nullptr }
        , depthClipControl { nullptr }
        , depthClipEnable { nullptr }
        , descriptorBuffer { nullptr }
        , descriptorBufferCaptureReplay { nullptr }
        , descriptorBufferImageLayoutIgnored { nullptr }
        , descriptorBufferPushDescriptors { nullptr }
        , deviceGeneratedCommands { nullptr }
        , dynamicGeneratedPipelineLayout { nullptr }
        , deviceMemoryReport { nullptr }
        , dynamicRenderingUnusedAttachments { nullptr }
        , extendedDynamicState { nullptr }
        , extendedDynamicState2 { nullptr }
        , extendedDynamicState2LogicOp { nullptr }
        , extendedDynamicState2PatchControlPoints { nullptr }
        , extendedDynamicState3TessellationDomainOrigin { nullptr }
        , extendedDynamicState3DepthClampEnable { nullptr }
        , extendedDynamicState3PolygonMode { nullptr }
        , extendedDynamicState3RasterizationSamples { nullptr }
        , extendedDynamicState3SampleMask { nullptr }
        , extendedDynamicState3AlphaToCoverageEnable { nullptr }
        , extendedDynamicState3AlphaToOneEnable { nullptr }
        , extendedDynamicState3LogicOpEnable { nullptr }
        , extendedDynamicState3ColorBlendEnable { nullptr }
        , extendedDynamicState3ColorBlendEquation { nullptr }
        , extendedDynamicState3ColorWriteMask { nullptr }
        , extendedDynamicState3RasterizationStream { nullptr }
        , extendedDynamicState3ConservativeRasterizationMode { nullptr }
        , extendedDynamicState3ExtraPrimitiveOverestimationSize { nullptr }
        , extendedDynamicState3DepthClipEnable { nullptr }
        , extendedDynamicState3SampleLocationsEnable { nullptr }
        , extendedDynamicState3ColorBlendAdvanced { nullptr }
        , extendedDynamicState3ProvokingVertexMode { nullptr }
        , extendedDynamicState3LineRasterizationMode { nullptr }
        , extendedDynamicState3LineStippleEnable { nullptr }
        , extendedDynamicState3DepthClipNegativeOneToOne { nullptr }
        , extendedDynamicState3ViewportWScalingEnable { nullptr }
        , extendedDynamicState3ViewportSwizzle { nullptr }
        , extendedDynamicState3CoverageToColorEnable { nullptr }
        , extendedDynamicState3CoverageToColorLocation { nullptr }
        , extendedDynamicState3CoverageModulationMode { nullptr }
        , extendedDynamicState3CoverageModulationTableEnable { nullptr }
        , extendedDynamicState3CoverageModulationTable { nullptr }
        , extendedDynamicState3CoverageReductionMode { nullptr }
        , extendedDynamicState3RepresentativeFragmentTestEnable { nullptr }
        , extendedDynamicState3ShadingRateImageEnable { nullptr }
        , deviceFault { nullptr }
        , deviceFaultVendorBinary { nullptr }
        , fragmentDensityMap { nullptr }
        , fragmentDensityMapDynamic { nullptr }
        , fragmentDensityMapNonSubsampledImages { nullptr }
        , fragmentDensityMapDeferred { nullptr }
        , fragmentDensityMapOffset { nullptr }
        , fragmentShaderSampleInterlock { nullptr }
        , fragmentShaderPixelInterlock { nullptr }
        , fragmentShaderShadingRateInterlock { nullptr }
        , frameBoundary { nullptr }
        , graphicsPipelineLibrary { nullptr }
        , image2DViewOf3D { nullptr }
        , sampler2DViewOf3D { nullptr }
        , imageCompressionControl { nullptr }
        , imageCompressionControlSwapchain { nullptr }
        , imageSlicedViewOf3D { nullptr }
        , imageMinLod { nullptr }
        , legacyDithering { nullptr }
        , legacyVertexAttributes { nullptr }
        , memoryMapPlaced { nullptr }
        , memoryMapRangePlaced { nullptr }
        , memoryUnmapReserve { nullptr }
        , memoryPriority { nullptr }
        , taskShader { nullptr }
        , meshShader { nullptr }
        , multiviewMeshShader { nullptr }
        , primitiveFragmentShadingRateMeshShader { nullptr }
        , meshShaderQueries { nullptr }
        , multiDraw { nullptr }
        , multisampledRenderToSingleSampled { nullptr }
        , mutableDescriptorType { nullptr }
        , nestedCommandBuffer { nullptr }
        , nestedCommandBufferRendering { nullptr }
        , nestedCommandBufferSimultaneousUse { nullptr }
        , nonSeamlessCubeMap { nullptr }
        , micromap { nullptr }
        , micromapCaptureReplay { nullptr }
        , micromapHostCommands { nullptr }
        , pageableDeviceLocalMemory { nullptr }
        , pipelineLibraryGroupHandles { nullptr }
        , pipelinePropertiesIdentifier { nullptr }
        , primitiveTopologyListRestart { nullptr }
        , primitiveTopologyPatchListRestart { nullptr }
        , primitivesGeneratedQuery { nullptr }
        , primitivesGeneratedQueryWithRasterizerDiscard { nullptr }
        , primitivesGeneratedQueryWithNonZeroStreams { nullptr }
        , provokingVertexLast { nullptr }
        , transformFeedbackPreservesProvokingVertex { nullptr }
        , formatRgba10x6WithoutYCbCrSampler { nullptr }
        , rasterizationOrderColorAttachmentAccess { nullptr }
        , rasterizationOrderDepthAttachmentAccess { nullptr }
        , rasterizationOrderStencilAttachmentAccess { nullptr }
        , shaderBufferFloat32Atomics { nullptr }
        , shaderBufferFloat32AtomicAdd { nullptr }
        , shaderBufferFloat64Atomics { nullptr }
        , shaderBufferFloat64AtomicAdd { nullptr }
        , shaderSharedFloat32Atomics { nullptr }
        , shaderSharedFloat32AtomicAdd { nullptr }
        , shaderSharedFloat64Atomics { nullptr }
        , shaderSharedFloat64AtomicAdd { nullptr }
        , shaderImageFloat32Atomics { nullptr }
        , shaderImageFloat32AtomicAdd { nullptr }
        , sparseImageFloat32Atomics { nullptr }
        , sparseImageFloat32AtomicAdd { nullptr }
        , shaderBufferFloat16Atomics { nullptr }
        , shaderBufferFloat16AtomicAdd { nullptr }
        , shaderBufferFloat16AtomicMinMax { nullptr }
        , shaderBufferFloat32AtomicMinMax { nullptr }
        , shaderBufferFloat64AtomicMinMax { nullptr }
        , shaderSharedFloat16Atomics { nullptr }
        , shaderSharedFloat16AtomicAdd { nullptr }
        , shaderSharedFloat16AtomicMinMax { nullptr }
        , shaderSharedFloat32AtomicMinMax { nullptr }
        , shaderSharedFloat64AtomicMinMax { nullptr }
        , shaderImageFloat32AtomicMinMax { nullptr }
        , sparseImageFloat32AtomicMinMax { nullptr }
        , shaderFloat8 { nullptr }
        , shaderFloat8CooperativeMatrix { nullptr }
        , shaderImageInt64Atomics { nullptr }
        , sparseImageInt64Atomics { nullptr }
        , shaderModuleIdentifier { nullptr }
        , shaderObject { nullptr }
        , shaderReplicatedComposites { nullptr }
        , shaderTileImageColorReadAccess { nullptr }
        , shaderTileImageDepthReadAccess { nullptr }
        , shaderTileImageStencilReadAccess { nullptr }
        , subpassMergeFeedback { nullptr }
        , texelBufferAlignment { nullptr }
        , transformFeedback { nullptr }
        , geometryStreams { nullptr }
        , vertexAttributeRobustness { nullptr }
        , vertexInputDynamicState { nullptr }
        , ycbcr2plane444Formats { nullptr }
        , ycbcrImageArrays { nullptr }
        , zeroInitializeDeviceMemory { nullptr } {

        _link();
    }

    ///
    /// \brief Copy Assignment
    /// \param features The features to copy
    /// \returns A reference to \emph{this}
    device_features_ext& operator=(const device_features_ext& features) {

        // Copy Data
        VkPhysicalDeviceASTCDecodeFeaturesEXT::operator=(features);
        VkPhysicalDeviceAddressBindingReportFeaturesEXT::operator=(features);
        VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT::operator=(features);
        VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT::operator=(features);
        VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT::operator=(features);
        VkPhysicalDeviceBorderColorSwizzleFeaturesEXT::operator=(features);
        VkPhysicalDeviceBufferDeviceAddressFeaturesEXT::operator=(features);
        VkPhysicalDevice4444FormatsFeaturesEXT::operator=(features);
        VkPhysicalDeviceColorWriteEnableFeaturesEXT::operator=(features);
        VkPhysicalDeviceConditionalRenderingFeaturesEXT::operator=(features);
        VkPhysicalDeviceCustomBorderColorFeaturesEXT::operator=(features);
        VkPhysicalDeviceDepthBiasControlFeaturesEXT::operator=(features);
        VkPhysicalDeviceDepthClampControlFeaturesEXT::operator=(features);
        VkPhysicalDeviceDepthClipControlFeaturesEXT::operator=(features);
        VkPhysicalDeviceDepthClipEnableFeaturesEXT::operator=(features);
        VkPhysicalDeviceDescriptorBufferFeaturesEXT::operator=(features);
        VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT::operator=(features);
        VkPhysicalDeviceDeviceMemoryReportFeaturesEXT::operator=(features);
        VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT::operator=(features);
        VkPhysicalDeviceExtendedDynamicStateFeaturesEXT::operator=(features);
        VkPhysicalDeviceExtendedDynamicState2FeaturesEXT::operator=(features);
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::operator=(features);
        VkPhysicalDeviceFaultFeaturesEXT::operator=(features);
        VkPhysicalDeviceFragmentDensityMapFeaturesEXT::operator=(features);
        VkPhysicalDeviceFragmentDensityMap2FeaturesEXT::operator=(features);
        VkPhysicalDeviceFragmentDensityMapOffsetFeaturesEXT::operator=(features);
        VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT::operator=(features);
        VkPhysicalDeviceFrameBoundaryFeaturesEXT::operator=(features);
        VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT::operator=(features);
        VkPhysicalDeviceImage2DViewOf3DFeaturesEXT::operator=(features);
        VkPhysicalDeviceImageCompressionControlFeaturesEXT::operator=(features);
        VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT::operator=(features);
        VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT::operator=(features);
        VkPhysicalDeviceImageViewMinLodFeaturesEXT::operator=(features);
        VkPhysicalDeviceLegacyDitheringFeaturesEXT::operator=(features);
        VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT::operator=(features);
        VkPhysicalDeviceMapMemoryPlacedFeaturesEXT::operator=(features);
        VkPhysicalDeviceMemoryPriorityFeaturesEXT::operator=(features);
        VkPhysicalDeviceMeshShaderFeaturesEXT::operator=(features);
        VkPhysicalDeviceMultiDrawFeaturesEXT::operator=(features);
        VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT::operator=(features);
        VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT::operator=(features);
        VkPhysicalDeviceNestedCommandBufferFeaturesEXT::operator=(features);
        VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT::operator=(features);
        VkPhysicalDeviceOpacityMicromapFeaturesEXT::operator=(features);
        VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT::operator=(features);
        VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT::operator=(features);
        VkPhysicalDevicePipelinePropertiesFeaturesEXT::operator=(features);
        VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT::operator=(features);
        VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT::operator=(features);
        VkPhysicalDeviceProvokingVertexFeaturesEXT::operator=(features);
        VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT::operator=(features);
        VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT::operator=(features);
        VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::operator=(features);
        VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::operator=(features);
        VkPhysicalDeviceShaderFloat8FeaturesEXT::operator=(features);
        VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT::operator=(features);
        VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT::operator=(features);
        VkPhysicalDeviceShaderObjectFeaturesEXT::operator=(features);
        VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT::operator=(features);
        VkPhysicalDeviceShaderTileImageFeaturesEXT::operator=(features);
        VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT::operator=(features);
        VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT::operator=(features);
        VkPhysicalDeviceTransformFeedbackFeaturesEXT::operator=(features);
        VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT::operator=(features);
        VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT::operator=(features);
        VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT::operator=(features);
        VkPhysicalDeviceYcbcrImageArraysFeaturesEXT::operator=(features);
        VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT::operator=(features);

        _link();

        return *this;
    }


    ///
    /// \brief Chain an extension structure
    /// \param next
    void chain(void* next) {
        VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT::pNext = next;
    }

    ///
    /// \brief Implicit casting for chaining
    operator void*() {
        return static_cast<VkPhysicalDeviceAddressBindingReportFeaturesEXT*>(this);
    }


// Helpers -------------------------------------------------------------------------------------------------------------
private:

    void _clear() {

        // Clear out the struct
        fennec::memset(this, 0, sizeof(*this));


        // Set the structure types
        VkPhysicalDeviceASTCDecodeFeaturesEXT::sType                         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT;
        VkPhysicalDeviceAddressBindingReportFeaturesEXT::sType               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ADDRESS_BINDING_REPORT_FEATURES_EXT;
        VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT::sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_FEATURES_EXT;
        VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT::sType       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT;
        VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT::sType             = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT;
        VkPhysicalDeviceBorderColorSwizzleFeaturesEXT::sType                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT;
        VkPhysicalDeviceBorderColorSwizzleFeaturesEXT::sType                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT;
        VkPhysicalDeviceBufferDeviceAddressFeaturesEXT::sType                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT;
        VkPhysicalDeviceBufferDeviceAddressFeaturesEXT::sType                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT;
        VkPhysicalDeviceBufferDeviceAddressFeaturesEXT::sType                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT;
        VkPhysicalDevice4444FormatsFeaturesEXT::sType                        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT;
        VkPhysicalDevice4444FormatsFeaturesEXT::sType                        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT;
        VkPhysicalDeviceColorWriteEnableFeaturesEXT::sType                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT;
        VkPhysicalDeviceConditionalRenderingFeaturesEXT::sType               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT;
        VkPhysicalDeviceConditionalRenderingFeaturesEXT::sType               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT;
        VkPhysicalDeviceCustomBorderColorFeaturesEXT::sType                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT;
        VkPhysicalDeviceCustomBorderColorFeaturesEXT::sType                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT;
        VkPhysicalDeviceDepthBiasControlFeaturesEXT::sType                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_BIAS_CONTROL_FEATURES_EXT;
        VkPhysicalDeviceDepthBiasControlFeaturesEXT::sType                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_BIAS_CONTROL_FEATURES_EXT;
        VkPhysicalDeviceDepthBiasControlFeaturesEXT::sType                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_BIAS_CONTROL_FEATURES_EXT;
        VkPhysicalDeviceDepthBiasControlFeaturesEXT::sType                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_BIAS_CONTROL_FEATURES_EXT;
        VkPhysicalDeviceDepthClampControlFeaturesEXT::sType                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_CONTROL_FEATURES_EXT;
        VkPhysicalDeviceDepthClipControlFeaturesEXT::sType                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT;
        VkPhysicalDeviceDepthClipEnableFeaturesEXT::sType                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT;
        VkPhysicalDeviceDescriptorBufferFeaturesEXT::sType                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT;
        VkPhysicalDeviceDescriptorBufferFeaturesEXT::sType                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT;
        VkPhysicalDeviceDescriptorBufferFeaturesEXT::sType                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT;
        VkPhysicalDeviceDescriptorBufferFeaturesEXT::sType                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT;
        VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT::sType            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_EXT;
        VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT::sType            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_EXT;
        VkPhysicalDeviceDeviceMemoryReportFeaturesEXT::sType                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT;
        VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT::sType  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicStateFeaturesEXT::sType               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState2FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState2FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState2FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT;
        VkPhysicalDeviceFaultFeaturesEXT::sType                              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FAULT_FEATURES_EXT;
        VkPhysicalDeviceFaultFeaturesEXT::sType                              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FAULT_FEATURES_EXT;
        VkPhysicalDeviceFragmentDensityMapFeaturesEXT::sType                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT;
        VkPhysicalDeviceFragmentDensityMapFeaturesEXT::sType                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT;
        VkPhysicalDeviceFragmentDensityMapFeaturesEXT::sType                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT;
        VkPhysicalDeviceFragmentDensityMap2FeaturesEXT::sType                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT;
        VkPhysicalDeviceFragmentDensityMapOffsetFeaturesEXT::sType           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_FEATURES_EXT;
        VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT::sType            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT;
        VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT::sType            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT;
        VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT::sType            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT;
        VkPhysicalDeviceFrameBoundaryFeaturesEXT::sType                      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAME_BOUNDARY_FEATURES_EXT;
        VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT::sType            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT;
        VkPhysicalDeviceImage2DViewOf3DFeaturesEXT::sType                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT;
        VkPhysicalDeviceImage2DViewOf3DFeaturesEXT::sType                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT;
        VkPhysicalDeviceImageCompressionControlFeaturesEXT::sType            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_FEATURES_EXT;
        VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT::sType   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_FEATURES_EXT;
        VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT::sType                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_SLICED_VIEW_OF_3D_FEATURES_EXT;
        VkPhysicalDeviceImageViewMinLodFeaturesEXT::sType                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT;
        VkPhysicalDeviceLegacyDitheringFeaturesEXT::sType                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_DITHERING_FEATURES_EXT;
        VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT::sType             = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_VERTEX_ATTRIBUTES_FEATURES_EXT;
        VkPhysicalDeviceMapMemoryPlacedFeaturesEXT::sType                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAP_MEMORY_PLACED_FEATURES_EXT;
        VkPhysicalDeviceMapMemoryPlacedFeaturesEXT::sType                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAP_MEMORY_PLACED_FEATURES_EXT;
        VkPhysicalDeviceMapMemoryPlacedFeaturesEXT::sType                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAP_MEMORY_PLACED_FEATURES_EXT;
        VkPhysicalDeviceMemoryPriorityFeaturesEXT::sType                     = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT;
        VkPhysicalDeviceMeshShaderFeaturesEXT::sType                         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT;
        VkPhysicalDeviceMeshShaderFeaturesEXT::sType                         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT;
        VkPhysicalDeviceMeshShaderFeaturesEXT::sType                         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT;
        VkPhysicalDeviceMeshShaderFeaturesEXT::sType                         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT;
        VkPhysicalDeviceMeshShaderFeaturesEXT::sType                         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT;
        VkPhysicalDeviceMultiDrawFeaturesEXT::sType                          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT;
        VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT::sType  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT;
        VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT;
        VkPhysicalDeviceNestedCommandBufferFeaturesEXT::sType                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NESTED_COMMAND_BUFFER_FEATURES_EXT;
        VkPhysicalDeviceNestedCommandBufferFeaturesEXT::sType                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NESTED_COMMAND_BUFFER_FEATURES_EXT;
        VkPhysicalDeviceNestedCommandBufferFeaturesEXT::sType                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NESTED_COMMAND_BUFFER_FEATURES_EXT;
        VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT::sType                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT;
        VkPhysicalDeviceOpacityMicromapFeaturesEXT::sType                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_FEATURES_EXT;
        VkPhysicalDeviceOpacityMicromapFeaturesEXT::sType                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_FEATURES_EXT;
        VkPhysicalDeviceOpacityMicromapFeaturesEXT::sType                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_FEATURES_EXT;
        VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT::sType          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT;
        VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT::sType        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_LIBRARY_GROUP_HANDLES_FEATURES_EXT;
        VkPhysicalDevicePipelinePropertiesFeaturesEXT::sType                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROPERTIES_FEATURES_EXT;
        VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT::sType       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT;
        VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT::sType       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT;
        VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT::sType           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT;
        VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT::sType           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT;
        VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT::sType           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT;
        VkPhysicalDeviceProvokingVertexFeaturesEXT::sType                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT;
        VkPhysicalDeviceProvokingVertexFeaturesEXT::sType                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT;
        VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT::sType                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT;
        VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT::sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT;
        VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT::sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT;
        VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT::sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT;
        VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::sType                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT;
        VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::sType                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT;
        VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::sType                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT;
        VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::sType                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT;
        VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::sType                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT;
        VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::sType                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT;
        VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::sType                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT;
        VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::sType                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT;
        VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::sType                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT;
        VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::sType                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT;
        VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::sType                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT;
        VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::sType                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT;
        VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::sType                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT;
        VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::sType                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT;
        VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::sType                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT;
        VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::sType                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT;
        VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::sType                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT;
        VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::sType                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT;
        VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::sType                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT;
        VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::sType                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT;
        VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::sType                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT;
        VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::sType                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT;
        VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::sType                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT;
        VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::sType                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT;
        VkPhysicalDeviceShaderFloat8FeaturesEXT::sType                       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT8_FEATURES_EXT;
        VkPhysicalDeviceShaderFloat8FeaturesEXT::sType                       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT8_FEATURES_EXT;
        VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT::sType             = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT;
        VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT::sType             = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT;
        VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT::sType             = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_FEATURES_EXT;
        VkPhysicalDeviceShaderObjectFeaturesEXT::sType                       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT;
        VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT::sType         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_REPLICATED_COMPOSITES_FEATURES_EXT;
        VkPhysicalDeviceShaderTileImageFeaturesEXT::sType                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TILE_IMAGE_FEATURES_EXT;
        VkPhysicalDeviceShaderTileImageFeaturesEXT::sType                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TILE_IMAGE_FEATURES_EXT;
        VkPhysicalDeviceShaderTileImageFeaturesEXT::sType                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TILE_IMAGE_FEATURES_EXT;
        VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT::sType               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_MERGE_FEEDBACK_FEATURES_EXT;
        VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT::sType               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT;
        VkPhysicalDeviceTransformFeedbackFeaturesEXT::sType                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT;
        VkPhysicalDeviceTransformFeedbackFeaturesEXT::sType                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT;
        VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT::sType          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_ROBUSTNESS_FEATURES_EXT;
        VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT::sType            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT;
        VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT::sType              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT;
        VkPhysicalDeviceYcbcrImageArraysFeaturesEXT::sType                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT;
        VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT::sType         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_DEVICE_MEMORY_FEATURES_EXT;
    }


    void _link() {

        // Link the Feature structures
        decodeModeSharedExponent                              = &(VkPhysicalDeviceASTCDecodeFeaturesEXT::decodeModeSharedExponent);
        reportAddressBinding                                  = &(VkPhysicalDeviceAddressBindingReportFeaturesEXT::reportAddressBinding);
        attachmentFeedbackLoopDynamicState                    = &(VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT::attachmentFeedbackLoopDynamicState);
        attachmentFeedbackLoopLayout                          = &(VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT::attachmentFeedbackLoopLayout);
        advancedBlendCoherentOperations                       = &(VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT::advancedBlendCoherentOperations);
        borderColorSwizzle                                    = &(VkPhysicalDeviceBorderColorSwizzleFeaturesEXT::borderColorSwizzle);
        borderColorSwizzleFromImage                           = &(VkPhysicalDeviceBorderColorSwizzleFeaturesEXT::borderColorSwizzleFromImage);
        bufferDeviceAddress                                   = &(VkPhysicalDeviceBufferDeviceAddressFeaturesEXT::bufferDeviceAddress);
        bufferDeviceAddressCaptureReplay                      = &(VkPhysicalDeviceBufferDeviceAddressFeaturesEXT::bufferDeviceAddressCaptureReplay);
        bufferDeviceAddressMultiDevice                        = &(VkPhysicalDeviceBufferDeviceAddressFeaturesEXT::bufferDeviceAddressMultiDevice);
        formatA4R4G4B4                                        = &(VkPhysicalDevice4444FormatsFeaturesEXT::formatA4R4G4B4);
        formatA4B4G4R4                                        = &(VkPhysicalDevice4444FormatsFeaturesEXT::formatA4B4G4R4);
        colorWriteEnable                                      = &(VkPhysicalDeviceColorWriteEnableFeaturesEXT::colorWriteEnable);
        conditionalRendering                                  = &(VkPhysicalDeviceConditionalRenderingFeaturesEXT::conditionalRendering);
        inheritedConditionalRendering                         = &(VkPhysicalDeviceConditionalRenderingFeaturesEXT::inheritedConditionalRendering);
        customBorderColors                                    = &(VkPhysicalDeviceCustomBorderColorFeaturesEXT::customBorderColors);
        customBorderColorWithoutFormat                        = &(VkPhysicalDeviceCustomBorderColorFeaturesEXT::customBorderColorWithoutFormat);
        depthBiasControl                                      = &(VkPhysicalDeviceDepthBiasControlFeaturesEXT::depthBiasControl);
        leastRepresentableValueForceUnormRepresentation       = &(VkPhysicalDeviceDepthBiasControlFeaturesEXT::leastRepresentableValueForceUnormRepresentation);
        floatRepresentation                                   = &(VkPhysicalDeviceDepthBiasControlFeaturesEXT::floatRepresentation);
        depthBiasExact                                        = &(VkPhysicalDeviceDepthBiasControlFeaturesEXT::depthBiasExact);
        depthClampControl                                     = &(VkPhysicalDeviceDepthClampControlFeaturesEXT::depthClampControl);
        depthClipControl                                      = &(VkPhysicalDeviceDepthClipControlFeaturesEXT::depthClipControl);
        depthClipEnable                                       = &(VkPhysicalDeviceDepthClipEnableFeaturesEXT::depthClipEnable);
        descriptorBuffer                                      = &(VkPhysicalDeviceDescriptorBufferFeaturesEXT::descriptorBuffer);
        descriptorBufferCaptureReplay                         = &(VkPhysicalDeviceDescriptorBufferFeaturesEXT::descriptorBufferCaptureReplay);
        descriptorBufferImageLayoutIgnored                    = &(VkPhysicalDeviceDescriptorBufferFeaturesEXT::descriptorBufferImageLayoutIgnored);
        descriptorBufferPushDescriptors                       = &(VkPhysicalDeviceDescriptorBufferFeaturesEXT::descriptorBufferPushDescriptors);
        deviceGeneratedCommands                               = &(VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT::deviceGeneratedCommands);
        dynamicGeneratedPipelineLayout                        = &(VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT::dynamicGeneratedPipelineLayout);
        deviceMemoryReport                                    = &(VkPhysicalDeviceDeviceMemoryReportFeaturesEXT::deviceMemoryReport);
        dynamicRenderingUnusedAttachments                     = &(VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT::dynamicRenderingUnusedAttachments);
        extendedDynamicState                                  = &(VkPhysicalDeviceExtendedDynamicStateFeaturesEXT::extendedDynamicState);
        extendedDynamicState2                                 = &(VkPhysicalDeviceExtendedDynamicState2FeaturesEXT::extendedDynamicState2);
        extendedDynamicState2LogicOp                          = &(VkPhysicalDeviceExtendedDynamicState2FeaturesEXT::extendedDynamicState2LogicOp);
        extendedDynamicState2PatchControlPoints               = &(VkPhysicalDeviceExtendedDynamicState2FeaturesEXT::extendedDynamicState2PatchControlPoints);
        extendedDynamicState3TessellationDomainOrigin         = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3TessellationDomainOrigin);
        extendedDynamicState3DepthClampEnable                 = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3DepthClampEnable);
        extendedDynamicState3PolygonMode                      = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3PolygonMode);
        extendedDynamicState3RasterizationSamples             = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3RasterizationSamples);
        extendedDynamicState3SampleMask                       = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3SampleMask);
        extendedDynamicState3AlphaToCoverageEnable            = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3AlphaToCoverageEnable);
        extendedDynamicState3AlphaToOneEnable                 = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3AlphaToOneEnable);
        extendedDynamicState3LogicOpEnable                    = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3LogicOpEnable);
        extendedDynamicState3ColorBlendEnable                 = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3ColorBlendEnable);
        extendedDynamicState3ColorBlendEquation               = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3ColorBlendEquation);
        extendedDynamicState3ColorWriteMask                   = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3ColorWriteMask);
        extendedDynamicState3RasterizationStream              = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3RasterizationStream);
        extendedDynamicState3ConservativeRasterizationMode    = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3ConservativeRasterizationMode);
        extendedDynamicState3ExtraPrimitiveOverestimationSize = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3ExtraPrimitiveOverestimationSize);
        extendedDynamicState3DepthClipEnable                  = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3DepthClipEnable);
        extendedDynamicState3SampleLocationsEnable            = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3SampleLocationsEnable);
        extendedDynamicState3ColorBlendAdvanced               = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3ColorBlendAdvanced);
        extendedDynamicState3ProvokingVertexMode              = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3ProvokingVertexMode);
        extendedDynamicState3LineRasterizationMode            = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3LineRasterizationMode);
        extendedDynamicState3LineStippleEnable                = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3LineStippleEnable);
        extendedDynamicState3DepthClipNegativeOneToOne        = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3DepthClipNegativeOneToOne);
        extendedDynamicState3ViewportWScalingEnable           = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3ViewportWScalingEnable);
        extendedDynamicState3ViewportSwizzle                  = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3ViewportSwizzle);
        extendedDynamicState3CoverageToColorEnable            = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3CoverageToColorEnable);
        extendedDynamicState3CoverageToColorLocation          = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3CoverageToColorLocation);
        extendedDynamicState3CoverageModulationMode           = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3CoverageModulationMode);
        extendedDynamicState3CoverageModulationTableEnable    = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3CoverageModulationTableEnable);
        extendedDynamicState3CoverageModulationTable          = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3CoverageModulationTable);
        extendedDynamicState3CoverageReductionMode            = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3CoverageReductionMode);
        extendedDynamicState3RepresentativeFragmentTestEnable = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3RepresentativeFragmentTestEnable);
        extendedDynamicState3ShadingRateImageEnable           = &(VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3ShadingRateImageEnable);
        deviceFault                                           = &(VkPhysicalDeviceFaultFeaturesEXT::deviceFault);
        deviceFaultVendorBinary                               = &(VkPhysicalDeviceFaultFeaturesEXT::deviceFaultVendorBinary);
        fragmentDensityMap                                    = &(VkPhysicalDeviceFragmentDensityMapFeaturesEXT::fragmentDensityMap);
        fragmentDensityMapDynamic                             = &(VkPhysicalDeviceFragmentDensityMapFeaturesEXT::fragmentDensityMapDynamic);
        fragmentDensityMapNonSubsampledImages                 = &(VkPhysicalDeviceFragmentDensityMapFeaturesEXT::fragmentDensityMapNonSubsampledImages);
        fragmentDensityMapDeferred                            = &(VkPhysicalDeviceFragmentDensityMap2FeaturesEXT::fragmentDensityMapDeferred);
        fragmentDensityMapOffset                              = &(VkPhysicalDeviceFragmentDensityMapOffsetFeaturesEXT::fragmentDensityMapOffset);
        fragmentShaderSampleInterlock                         = &(VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT::fragmentShaderSampleInterlock);
        fragmentShaderPixelInterlock                          = &(VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT::fragmentShaderPixelInterlock);
        fragmentShaderShadingRateInterlock                    = &(VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT::fragmentShaderShadingRateInterlock);
        frameBoundary                                         = &(VkPhysicalDeviceFrameBoundaryFeaturesEXT::frameBoundary);
        graphicsPipelineLibrary                               = &(VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT::graphicsPipelineLibrary);
        image2DViewOf3D                                       = &(VkPhysicalDeviceImage2DViewOf3DFeaturesEXT::image2DViewOf3D);
        sampler2DViewOf3D                                     = &(VkPhysicalDeviceImage2DViewOf3DFeaturesEXT::sampler2DViewOf3D);
        imageCompressionControl                               = &(VkPhysicalDeviceImageCompressionControlFeaturesEXT::imageCompressionControl);
        imageCompressionControlSwapchain                      = &(VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT::imageCompressionControlSwapchain);
        imageSlicedViewOf3D                                   = &(VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT::imageSlicedViewOf3D);
        imageMinLod                                           = &(VkPhysicalDeviceImageViewMinLodFeaturesEXT::minLod);
        legacyDithering                                       = &(VkPhysicalDeviceLegacyDitheringFeaturesEXT::legacyDithering);
        legacyVertexAttributes                                = &(VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT::legacyVertexAttributes);
        memoryMapPlaced                                       = &(VkPhysicalDeviceMapMemoryPlacedFeaturesEXT::memoryMapPlaced);
        memoryMapRangePlaced                                  = &(VkPhysicalDeviceMapMemoryPlacedFeaturesEXT::memoryMapRangePlaced);
        memoryUnmapReserve                                    = &(VkPhysicalDeviceMapMemoryPlacedFeaturesEXT::memoryUnmapReserve);
        memoryPriority                                        = &(VkPhysicalDeviceMemoryPriorityFeaturesEXT::memoryPriority);
        taskShader                                            = &(VkPhysicalDeviceMeshShaderFeaturesEXT::taskShader);
        meshShader                                            = &(VkPhysicalDeviceMeshShaderFeaturesEXT::meshShader);
        multiviewMeshShader                                   = &(VkPhysicalDeviceMeshShaderFeaturesEXT::multiviewMeshShader);
        primitiveFragmentShadingRateMeshShader                = &(VkPhysicalDeviceMeshShaderFeaturesEXT::primitiveFragmentShadingRateMeshShader);
        meshShaderQueries                                     = &(VkPhysicalDeviceMeshShaderFeaturesEXT::meshShaderQueries);
        multiDraw                                             = &(VkPhysicalDeviceMultiDrawFeaturesEXT::multiDraw);
        multisampledRenderToSingleSampled                     = &(VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT::multisampledRenderToSingleSampled);
        mutableDescriptorType                                 = &(VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT::mutableDescriptorType);
        nestedCommandBuffer                                   = &(VkPhysicalDeviceNestedCommandBufferFeaturesEXT::nestedCommandBuffer);
        nestedCommandBufferRendering                          = &(VkPhysicalDeviceNestedCommandBufferFeaturesEXT::nestedCommandBufferRendering);
        nestedCommandBufferSimultaneousUse                    = &(VkPhysicalDeviceNestedCommandBufferFeaturesEXT::nestedCommandBufferSimultaneousUse);
        nonSeamlessCubeMap                                    = &(VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT::nonSeamlessCubeMap);
        micromap                                              = &(VkPhysicalDeviceOpacityMicromapFeaturesEXT::micromap);
        micromapCaptureReplay                                 = &(VkPhysicalDeviceOpacityMicromapFeaturesEXT::micromapCaptureReplay);
        micromapHostCommands                                  = &(VkPhysicalDeviceOpacityMicromapFeaturesEXT::micromapHostCommands);
        pageableDeviceLocalMemory                             = &(VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT::pageableDeviceLocalMemory);
        pipelineLibraryGroupHandles                           = &(VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT::pipelineLibraryGroupHandles);
        pipelinePropertiesIdentifier                          = &(VkPhysicalDevicePipelinePropertiesFeaturesEXT::pipelinePropertiesIdentifier);
        primitiveTopologyListRestart                          = &(VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT::primitiveTopologyListRestart);
        primitiveTopologyPatchListRestart                     = &(VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT::primitiveTopologyPatchListRestart);
        primitivesGeneratedQuery                              = &(VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT::primitivesGeneratedQuery);
        primitivesGeneratedQueryWithRasterizerDiscard         = &(VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT::primitivesGeneratedQueryWithRasterizerDiscard);
        primitivesGeneratedQueryWithNonZeroStreams            = &(VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT::primitivesGeneratedQueryWithNonZeroStreams);
        provokingVertexLast                                   = &(VkPhysicalDeviceProvokingVertexFeaturesEXT::provokingVertexLast);
        transformFeedbackPreservesProvokingVertex             = &(VkPhysicalDeviceProvokingVertexFeaturesEXT::transformFeedbackPreservesProvokingVertex);
        formatRgba10x6WithoutYCbCrSampler                     = &(VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT::formatRgba10x6WithoutYCbCrSampler);
        rasterizationOrderColorAttachmentAccess               = &(VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT::rasterizationOrderColorAttachmentAccess);
        rasterizationOrderDepthAttachmentAccess               = &(VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT::rasterizationOrderDepthAttachmentAccess);
        rasterizationOrderStencilAttachmentAccess             = &(VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT::rasterizationOrderStencilAttachmentAccess);
        shaderBufferFloat32Atomics                            = &(VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::shaderBufferFloat32Atomics);
        shaderBufferFloat32AtomicAdd                          = &(VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::shaderBufferFloat32AtomicAdd);
        shaderBufferFloat64Atomics                            = &(VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::shaderBufferFloat64Atomics);
        shaderBufferFloat64AtomicAdd                          = &(VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::shaderBufferFloat64AtomicAdd);
        shaderSharedFloat32Atomics                            = &(VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::shaderSharedFloat32Atomics);
        shaderSharedFloat32AtomicAdd                          = &(VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::shaderSharedFloat32AtomicAdd);
        shaderSharedFloat64Atomics                            = &(VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::shaderSharedFloat64Atomics);
        shaderSharedFloat64AtomicAdd                          = &(VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::shaderSharedFloat64AtomicAdd);
        shaderImageFloat32Atomics                             = &(VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::shaderImageFloat32Atomics);
        shaderImageFloat32AtomicAdd                           = &(VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::shaderImageFloat32AtomicAdd);
        sparseImageFloat32Atomics                             = &(VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::sparseImageFloat32Atomics);
        sparseImageFloat32AtomicAdd                           = &(VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::sparseImageFloat32AtomicAdd);
        shaderBufferFloat16Atomics                            = &(VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::shaderBufferFloat16Atomics);
        shaderBufferFloat16AtomicAdd                          = &(VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::shaderBufferFloat16AtomicAdd);
        shaderBufferFloat16AtomicMinMax                       = &(VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::shaderBufferFloat16AtomicMinMax);
        shaderBufferFloat32AtomicMinMax                       = &(VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::shaderBufferFloat32AtomicMinMax);
        shaderBufferFloat64AtomicMinMax                       = &(VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::shaderBufferFloat64AtomicMinMax);
        shaderSharedFloat16Atomics                            = &(VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::shaderSharedFloat16Atomics);
        shaderSharedFloat16AtomicAdd                          = &(VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::shaderSharedFloat16AtomicAdd);
        shaderSharedFloat16AtomicMinMax                       = &(VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::shaderSharedFloat16AtomicMinMax);
        shaderSharedFloat32AtomicMinMax                       = &(VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::shaderSharedFloat32AtomicMinMax);
        shaderSharedFloat64AtomicMinMax                       = &(VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::shaderSharedFloat64AtomicMinMax);
        shaderImageFloat32AtomicMinMax                        = &(VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::shaderImageFloat32AtomicMinMax);
        sparseImageFloat32AtomicMinMax                        = &(VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::sparseImageFloat32AtomicMinMax);
        shaderFloat8                                          = &(VkPhysicalDeviceShaderFloat8FeaturesEXT::shaderFloat8);
        shaderFloat8CooperativeMatrix                         = &(VkPhysicalDeviceShaderFloat8FeaturesEXT::shaderFloat8CooperativeMatrix);
        shaderImageInt64Atomics                               = &(VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT::shaderImageInt64Atomics);
        sparseImageInt64Atomics                               = &(VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT::sparseImageInt64Atomics);
        shaderModuleIdentifier                                = &(VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT::shaderModuleIdentifier);
        shaderObject                                          = &(VkPhysicalDeviceShaderObjectFeaturesEXT::shaderObject);
        shaderReplicatedComposites                            = &(VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT::shaderReplicatedComposites);
        shaderTileImageColorReadAccess                        = &(VkPhysicalDeviceShaderTileImageFeaturesEXT::shaderTileImageColorReadAccess);
        shaderTileImageDepthReadAccess                        = &(VkPhysicalDeviceShaderTileImageFeaturesEXT::shaderTileImageDepthReadAccess);
        shaderTileImageStencilReadAccess                      = &(VkPhysicalDeviceShaderTileImageFeaturesEXT::shaderTileImageStencilReadAccess);
        subpassMergeFeedback                                  = &(VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT::subpassMergeFeedback);
        texelBufferAlignment                                  = &(VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT::texelBufferAlignment);
        transformFeedback                                     = &(VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback);
        geometryStreams                                       = &(VkPhysicalDeviceTransformFeedbackFeaturesEXT::geometryStreams);
        vertexAttributeRobustness                             = &(VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT::vertexAttributeRobustness);
        vertexInputDynamicState                               = &(VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT::vertexInputDynamicState);
        ycbcr2plane444Formats                                 = &(VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT::ycbcr2plane444Formats);
        ycbcrImageArrays                                      = &(VkPhysicalDeviceYcbcrImageArraysFeaturesEXT::ycbcrImageArrays);
        zeroInitializeDeviceMemory                            = &(VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT::zeroInitializeDeviceMemory);


        // Daisy chain
        VkPhysicalDeviceASTCDecodeFeaturesEXT::pNext                         = static_cast<VkPhysicalDeviceAddressBindingReportFeaturesEXT*>(this);
        VkPhysicalDeviceAddressBindingReportFeaturesEXT::pNext               = static_cast<VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT*>(this);
        VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT::pNext = static_cast<VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT*>(this);
        VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT::pNext       = static_cast<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(this);
        VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT::pNext             = static_cast<VkPhysicalDeviceBorderColorSwizzleFeaturesEXT*>(this);
        VkPhysicalDeviceBorderColorSwizzleFeaturesEXT::pNext                 = static_cast<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(this);
        VkPhysicalDeviceBufferDeviceAddressFeaturesEXT::pNext                = static_cast<VkPhysicalDevice4444FormatsFeaturesEXT*>(this);
        VkPhysicalDevice4444FormatsFeaturesEXT::pNext                        = static_cast<VkPhysicalDeviceColorWriteEnableFeaturesEXT*>(this);
        VkPhysicalDeviceColorWriteEnableFeaturesEXT::pNext                   = static_cast<VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(this);
        VkPhysicalDeviceConditionalRenderingFeaturesEXT::pNext               = static_cast<VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(this);
        VkPhysicalDeviceCustomBorderColorFeaturesEXT::pNext                  = static_cast<VkPhysicalDeviceDepthBiasControlFeaturesEXT*>(this);
        VkPhysicalDeviceDepthBiasControlFeaturesEXT::pNext                   = static_cast<VkPhysicalDeviceDepthClampControlFeaturesEXT*>(this);
        VkPhysicalDeviceDepthClampControlFeaturesEXT::pNext                  = static_cast<VkPhysicalDeviceDepthClipControlFeaturesEXT*>(this);
        VkPhysicalDeviceDepthClipControlFeaturesEXT::pNext                   = static_cast<VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(this);
        VkPhysicalDeviceDepthClipEnableFeaturesEXT::pNext                    = static_cast<VkPhysicalDeviceDescriptorBufferFeaturesEXT*>(this);
        VkPhysicalDeviceDescriptorBufferFeaturesEXT::pNext                   = static_cast<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT*>(this);
        VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT::pNext            = static_cast<VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(this);
        VkPhysicalDeviceDeviceMemoryReportFeaturesEXT::pNext                 = static_cast<VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT*>(this);
        VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT::pNext  = static_cast<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(this);
        VkPhysicalDeviceExtendedDynamicStateFeaturesEXT::pNext               = static_cast<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT*>(this);
        VkPhysicalDeviceExtendedDynamicState2FeaturesEXT::pNext              = static_cast<VkPhysicalDeviceExtendedDynamicState3FeaturesEXT*>(this);
        VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::pNext              = static_cast<VkPhysicalDeviceFaultFeaturesEXT*>(this);
        VkPhysicalDeviceFaultFeaturesEXT::pNext                              = static_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(this);
        VkPhysicalDeviceFragmentDensityMapFeaturesEXT::pNext                 = static_cast<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(this);
        VkPhysicalDeviceFragmentDensityMap2FeaturesEXT::pNext                = static_cast<VkPhysicalDeviceFragmentDensityMapOffsetFeaturesEXT*>(this);
        VkPhysicalDeviceFragmentDensityMapOffsetFeaturesEXT::pNext           = static_cast<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(this);
        VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT::pNext            = static_cast<VkPhysicalDeviceFrameBoundaryFeaturesEXT*>(this);
        VkPhysicalDeviceFrameBoundaryFeaturesEXT::pNext                      = static_cast<VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT*>(this);
        VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT::pNext            = static_cast<VkPhysicalDeviceImage2DViewOf3DFeaturesEXT*>(this);
        VkPhysicalDeviceImage2DViewOf3DFeaturesEXT::pNext                    = static_cast<VkPhysicalDeviceImageCompressionControlFeaturesEXT*>(this);
        VkPhysicalDeviceImageCompressionControlFeaturesEXT::pNext            = static_cast<VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT*>(this);
        VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT::pNext   = static_cast<VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT*>(this);
        VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT::pNext                = static_cast<VkPhysicalDeviceImageViewMinLodFeaturesEXT*>(this);
        VkPhysicalDeviceImageViewMinLodFeaturesEXT::pNext                    = static_cast<VkPhysicalDeviceLegacyDitheringFeaturesEXT*>(this);
        VkPhysicalDeviceLegacyDitheringFeaturesEXT::pNext                    = static_cast<VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT*>(this);
        VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT::pNext             = static_cast<VkPhysicalDeviceMapMemoryPlacedFeaturesEXT*>(this);
        VkPhysicalDeviceMapMemoryPlacedFeaturesEXT::pNext                    = static_cast<VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(this);
        VkPhysicalDeviceMemoryPriorityFeaturesEXT::pNext                     = static_cast<VkPhysicalDeviceMeshShaderFeaturesEXT*>(this);
        VkPhysicalDeviceMeshShaderFeaturesEXT::pNext                         = static_cast<VkPhysicalDeviceMultiDrawFeaturesEXT*>(this);
        VkPhysicalDeviceMultiDrawFeaturesEXT::pNext                          = static_cast<VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT*>(this);
        VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT::pNext  = static_cast<VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT*>(this);
        VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT::pNext              = static_cast<VkPhysicalDeviceNestedCommandBufferFeaturesEXT*>(this);
        VkPhysicalDeviceNestedCommandBufferFeaturesEXT::pNext                = static_cast<VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT*>(this);
        VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT::pNext                 = static_cast<VkPhysicalDeviceOpacityMicromapFeaturesEXT*>(this);
        VkPhysicalDeviceOpacityMicromapFeaturesEXT::pNext                    = static_cast<VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT*>(this);
        VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT::pNext          = static_cast<VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT*>(this);
        VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT::pNext        = static_cast<VkPhysicalDevicePipelinePropertiesFeaturesEXT*>(this);
        VkPhysicalDevicePipelinePropertiesFeaturesEXT::pNext                 = static_cast<VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT*>(this);
        VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT::pNext       = static_cast<VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT*>(this);
        VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT::pNext           = static_cast<VkPhysicalDeviceProvokingVertexFeaturesEXT*>(this);
        VkPhysicalDeviceProvokingVertexFeaturesEXT::pNext                    = static_cast<VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT*>(this);
        VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT::pNext                    = static_cast<VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT*>(this);
        VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT::pNext = static_cast<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(this);
        VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::pNext                  = static_cast<VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT*>(this);
        VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::pNext                 = static_cast<VkPhysicalDeviceShaderFloat8FeaturesEXT*>(this);
        VkPhysicalDeviceShaderFloat8FeaturesEXT::pNext                       = static_cast<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(this);
        VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT::pNext             = static_cast<VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT*>(this);
        VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT::pNext             = static_cast<VkPhysicalDeviceShaderObjectFeaturesEXT*>(this);
        VkPhysicalDeviceShaderObjectFeaturesEXT::pNext                       = static_cast<VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT*>(this);
        VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT::pNext         = static_cast<VkPhysicalDeviceShaderTileImageFeaturesEXT*>(this);
        VkPhysicalDeviceShaderTileImageFeaturesEXT::pNext                    = static_cast<VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT*>(this);
        VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT::pNext               = static_cast<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(this);
        VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT::pNext               = static_cast<VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(this);
        VkPhysicalDeviceTransformFeedbackFeaturesEXT::pNext                  = static_cast<VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT*>(this);
        VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT::pNext          = static_cast<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT*>(this);
        VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT::pNext            = static_cast<VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT*>(this);
        VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT::pNext              = static_cast<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(this);
        VkPhysicalDeviceYcbcrImageArraysFeaturesEXT::pNext                   = static_cast<VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT*>(this);
        VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT::pNext         = nullptr;
    }

};


///
/// \brief Struct representing the available features of a physical device.
struct device_features : private VkPhysicalDeviceFeatures2,
                         private device_features_11,
                         private device_features_12,
                         private device_features_13,
                         private device_features_14,
                         private device_features_khr,
                         private device_features_ext {

// Public Member Variables ---------------------------------------------------------------------------------------------
public:

    /// \name Core 1.0
    /// @{

    VkPhysicalDeviceFeatures* core10 = &features;
    device_features_11*       core11 = this;
    device_features_12*       core12 = this;
    device_features_13*       core13 = this;
    device_features_14*       core14 = this;
    device_features_khr*      khr    = this;
    device_features_ext*      ext    = this;

    /// @}

// Constructors & Destructor -------------------------------------------------------------------------------------------
public:

    /// \name Constructors & Destructor
    /// @{

    ///
    /// \brief Device Constructor
    /// \param device The device to acquire properties from
    device_features(VkPhysicalDevice device, const device_properties& properties)
        : VkPhysicalDeviceFeatures2 {
              .sType    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2,
              .pNext    = nullptr,
              .features = { },
          }
        , device_features_11(properties), device_features_12(properties), device_features_13(properties)
        , device_features_14(properties), device_features_khr(), device_features_ext() {

        // Attempt to use newer functions, otherwise fallback to deprecated
        if (vkGetPhysicalDeviceFeatures2) {
            VkPhysicalDeviceFeatures2::pNext = *core11;
            core11->chain(*core12);
            core12->chain(*core13);
            core13->chain(*core14);
            core14->chain(*khr);
            khr->chain(*ext);

            vkGetPhysicalDeviceFeatures2(device, this);
        } else {
            vkGetPhysicalDeviceFeatures(device, &features);
        }

        // TODO: Extensions
    }

    /// @}


// Private Member Variables --------------------------------------------------------------------------------------------
private:
};

}

#endif // FENNEC_RENDERERS_VULKAN_LIB_PHYSICAL_DEVICE_FEATURES_H