/*
Magma - Abstraction layer over Khronos Vulkan API.
Copyright (C) 2018-2023 Victor Coda.

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/>.
*/
// Generated by utility tool. DO NOT MODIFY!
#include "pch.h"
#pragma hdrstop
#include "physicalDevice.h"

namespace magma
{
#ifdef VK_AMD_device_coherent_memory
VkPhysicalDeviceCoherentMemoryFeaturesAMD PhysicalDevice::getCoherentMemoryFeatures() const
{
    VkPhysicalDeviceCoherentMemoryFeaturesAMD coherentMemoryFeatures = {};
    coherentMemoryFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD;
    getFeatures2(&coherentMemoryFeatures);
    return coherentMemoryFeatures;
}
#endif // VK_AMD_device_coherent_memory

#ifdef VK_AMD_shader_core_properties
VkPhysicalDeviceShaderCorePropertiesAMD PhysicalDevice::getShaderCoreProperties() const
{
    VkPhysicalDeviceShaderCorePropertiesAMD shaderCoreProperties = {};
    shaderCoreProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD;
    getProperties2(&shaderCoreProperties);
    return shaderCoreProperties;
}
#endif // VK_AMD_shader_core_properties

#ifdef VK_AMD_shader_core_properties2
VkPhysicalDeviceShaderCoreProperties2AMD PhysicalDevice::getShaderCoreProperties2() const
{
    VkPhysicalDeviceShaderCoreProperties2AMD shaderCoreProperties2 = {};
    shaderCoreProperties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD;
    getProperties2(&shaderCoreProperties2);
    return shaderCoreProperties2;
}
#endif // VK_AMD_shader_core_properties2

#ifdef VK_AMD_shader_early_and_late_fragment_tests
VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD PhysicalDevice::getShaderEarlyAndLateFragmentTestsFeatures() const
{
    VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD shaderEarlyAndLateFragmentTestsFeatures = {};
    shaderEarlyAndLateFragmentTestsFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_FEATURES_AMD;
    getFeatures2(&shaderEarlyAndLateFragmentTestsFeatures);
    return shaderEarlyAndLateFragmentTestsFeatures;
}
#endif // VK_AMD_shader_early_and_late_fragment_tests

#ifdef VK_ARM_rasterization_order_attachment_access
VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM PhysicalDevice::getRasterizationOrderAttachmentAccessFeatures() const
{
    VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM rasterizationOrderAttachmentAccessFeatures = {};
    rasterizationOrderAttachmentAccessFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_ARM;
    getFeatures2(&rasterizationOrderAttachmentAccessFeatures);
    return rasterizationOrderAttachmentAccessFeatures;
}
#endif // VK_ARM_rasterization_order_attachment_access

#ifdef VK_EXT_4444_formats
VkPhysicalDevice4444FormatsFeaturesEXT PhysicalDevice::get4444FormatsFeatures() const
{
    VkPhysicalDevice4444FormatsFeaturesEXT _4444FormatsFeatures = {};
    _4444FormatsFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT;
    getFeatures2(&_4444FormatsFeatures);
    return _4444FormatsFeatures;
}
#endif // VK_EXT_4444_formats

#ifdef VK_EXT_astc_decode_mode
VkPhysicalDeviceASTCDecodeFeaturesEXT PhysicalDevice::getASTCDecodeFeatures() const
{
    VkPhysicalDeviceASTCDecodeFeaturesEXT astcDecodeFeatures = {};
    astcDecodeFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT;
    getFeatures2(&astcDecodeFeatures);
    return astcDecodeFeatures;
}
#endif // VK_EXT_astc_decode_mode

#ifdef VK_EXT_attachment_feedback_loop_layout
VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT PhysicalDevice::getAttachmentFeedbackLoopLayoutFeatures() const
{
    VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT attachmentFeedbackLoopLayoutFeatures = {};
    attachmentFeedbackLoopLayoutFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT;
    getFeatures2(&attachmentFeedbackLoopLayoutFeatures);
    return attachmentFeedbackLoopLayoutFeatures;
}
#endif // VK_EXT_attachment_feedback_loop_layout

#ifdef VK_EXT_blend_operation_advanced
VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT PhysicalDevice::getBlendOperationAdvancedFeatures() const
{
    VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT blendOperationAdvancedFeatures = {};
    blendOperationAdvancedFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT;
    getFeatures2(&blendOperationAdvancedFeatures);
    return blendOperationAdvancedFeatures;
}

VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT PhysicalDevice::getBlendOperationAdvancedProperties() const
{
    VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT blendOperationAdvancedProperties = {};
    blendOperationAdvancedProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT;
    getProperties2(&blendOperationAdvancedProperties);
    return blendOperationAdvancedProperties;
}
#endif // VK_EXT_blend_operation_advanced

#ifdef VK_EXT_border_color_swizzle
VkPhysicalDeviceBorderColorSwizzleFeaturesEXT PhysicalDevice::getBorderColorSwizzleFeatures() const
{
    VkPhysicalDeviceBorderColorSwizzleFeaturesEXT borderColorSwizzleFeatures = {};
    borderColorSwizzleFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT;
    getFeatures2(&borderColorSwizzleFeatures);
    return borderColorSwizzleFeatures;
}
#endif // VK_EXT_border_color_swizzle

#ifdef VK_EXT_buffer_device_address
VkPhysicalDeviceBufferAddressFeaturesEXT PhysicalDevice::getBufferAddressFeatures() const
{
    VkPhysicalDeviceBufferAddressFeaturesEXT bufferAddressFeatures = {};
    bufferAddressFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_ADDRESS_FEATURES_EXT;
    getFeatures2(&bufferAddressFeatures);
    return bufferAddressFeatures;
}
#endif // VK_EXT_buffer_device_address

#ifdef VK_EXT_color_write_enable
VkPhysicalDeviceColorWriteEnableFeaturesEXT PhysicalDevice::getColorWriteEnableFeatures() const
{
    VkPhysicalDeviceColorWriteEnableFeaturesEXT colorWriteEnableFeatures = {};
    colorWriteEnableFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT;
    getFeatures2(&colorWriteEnableFeatures);
    return colorWriteEnableFeatures;
}
#endif // VK_EXT_color_write_enable

#ifdef VK_EXT_conditional_rendering
VkPhysicalDeviceConditionalRenderingFeaturesEXT PhysicalDevice::getConditionalRenderingFeatures() const
{
    VkPhysicalDeviceConditionalRenderingFeaturesEXT conditionalRenderingFeatures = {};
    conditionalRenderingFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT;
    getFeatures2(&conditionalRenderingFeatures);
    return conditionalRenderingFeatures;
}
#endif // VK_EXT_conditional_rendering

#ifdef VK_EXT_conservative_rasterization
VkPhysicalDeviceConservativeRasterizationPropertiesEXT PhysicalDevice::getConservativeRasterizationProperties() const
{
    VkPhysicalDeviceConservativeRasterizationPropertiesEXT conservativeRasterizationProperties = {};
    conservativeRasterizationProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT;
    getProperties2(&conservativeRasterizationProperties);
    return conservativeRasterizationProperties;
}
#endif // VK_EXT_conservative_rasterization

#ifdef VK_EXT_custom_border_color
VkPhysicalDeviceCustomBorderColorFeaturesEXT PhysicalDevice::getCustomBorderColorFeatures() const
{
    VkPhysicalDeviceCustomBorderColorFeaturesEXT customBorderColorFeatures = {};
    customBorderColorFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT;
    getFeatures2(&customBorderColorFeatures);
    return customBorderColorFeatures;
}

VkPhysicalDeviceCustomBorderColorPropertiesEXT PhysicalDevice::getCustomBorderColorProperties() const
{
    VkPhysicalDeviceCustomBorderColorPropertiesEXT customBorderColorProperties = {};
    customBorderColorProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT;
    getProperties2(&customBorderColorProperties);
    return customBorderColorProperties;
}
#endif // VK_EXT_custom_border_color

#ifdef VK_EXT_depth_clip_control
VkPhysicalDeviceDepthClipControlFeaturesEXT PhysicalDevice::getDepthClipControlFeatures() const
{
    VkPhysicalDeviceDepthClipControlFeaturesEXT depthClipControlFeatures = {};
    depthClipControlFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT;
    getFeatures2(&depthClipControlFeatures);
    return depthClipControlFeatures;
}
#endif // VK_EXT_depth_clip_control

#ifdef VK_EXT_depth_clip_enable
VkPhysicalDeviceDepthClipEnableFeaturesEXT PhysicalDevice::getDepthClipEnableFeatures() const
{
    VkPhysicalDeviceDepthClipEnableFeaturesEXT depthClipEnableFeatures = {};
    depthClipEnableFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT;
    getFeatures2(&depthClipEnableFeatures);
    return depthClipEnableFeatures;
}
#endif // VK_EXT_depth_clip_enable

#ifdef VK_EXT_descriptor_indexing
VkPhysicalDeviceDescriptorIndexingFeaturesEXT PhysicalDevice::getDescriptorIndexingFeatures() const
{
    VkPhysicalDeviceDescriptorIndexingFeaturesEXT descriptorIndexingFeatures = {};
    descriptorIndexingFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT;
    getFeatures2(&descriptorIndexingFeatures);
    return descriptorIndexingFeatures;
}

VkPhysicalDeviceDescriptorIndexingPropertiesEXT PhysicalDevice::getDescriptorIndexingProperties() const
{
    VkPhysicalDeviceDescriptorIndexingPropertiesEXT descriptorIndexingProperties = {};
    descriptorIndexingProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT;
    getProperties2(&descriptorIndexingProperties);
    return descriptorIndexingProperties;
}
#endif // VK_EXT_descriptor_indexing

#ifdef VK_EXT_device_memory_report
VkPhysicalDeviceDeviceMemoryReportFeaturesEXT PhysicalDevice::getDeviceMemoryReportFeatures() const
{
    VkPhysicalDeviceDeviceMemoryReportFeaturesEXT deviceMemoryReportFeatures = {};
    deviceMemoryReportFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT;
    getFeatures2(&deviceMemoryReportFeatures);
    return deviceMemoryReportFeatures;
}
#endif // VK_EXT_device_memory_report

#ifdef VK_EXT_discard_rectangles
VkPhysicalDeviceDiscardRectanglePropertiesEXT PhysicalDevice::getDiscardRectangleProperties() const
{
    VkPhysicalDeviceDiscardRectanglePropertiesEXT discardRectangleProperties = {};
    discardRectangleProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT;
    getProperties2(&discardRectangleProperties);
    return discardRectangleProperties;
}
#endif // VK_EXT_discard_rectangles

#ifdef VK_EXT_extended_dynamic_state
VkPhysicalDeviceExtendedDynamicStateFeaturesEXT PhysicalDevice::getExtendedDynamicStateFeatures() const
{
    VkPhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures = {};
    extendedDynamicStateFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT;
    getFeatures2(&extendedDynamicStateFeatures);
    return extendedDynamicStateFeatures;
}
#endif // VK_EXT_extended_dynamic_state

#ifdef VK_EXT_extended_dynamic_state2
VkPhysicalDeviceExtendedDynamicState2FeaturesEXT PhysicalDevice::getExtendedDynamicState2Features() const
{
    VkPhysicalDeviceExtendedDynamicState2FeaturesEXT extendedDynamicState2Features = {};
    extendedDynamicState2Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT;
    getFeatures2(&extendedDynamicState2Features);
    return extendedDynamicState2Features;
}
#endif // VK_EXT_extended_dynamic_state2

#ifdef VK_EXT_external_memory_host
VkPhysicalDeviceExternalMemoryHostPropertiesEXT PhysicalDevice::getExternalMemoryHostProperties() const
{
    VkPhysicalDeviceExternalMemoryHostPropertiesEXT externalMemoryHostProperties = {};
    externalMemoryHostProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT;
    getProperties2(&externalMemoryHostProperties);
    return externalMemoryHostProperties;
}
#endif // VK_EXT_external_memory_host

#ifdef VK_EXT_fragment_density_map
VkPhysicalDeviceFragmentDensityMapFeaturesEXT PhysicalDevice::getFragmentDensityMapFeatures() const
{
    VkPhysicalDeviceFragmentDensityMapFeaturesEXT fragmentDensityMapFeatures = {};
    fragmentDensityMapFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT;
    getFeatures2(&fragmentDensityMapFeatures);
    return fragmentDensityMapFeatures;
}

VkPhysicalDeviceFragmentDensityMapPropertiesEXT PhysicalDevice::getFragmentDensityMapProperties() const
{
    VkPhysicalDeviceFragmentDensityMapPropertiesEXT fragmentDensityMapProperties = {};
    fragmentDensityMapProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT;
    getProperties2(&fragmentDensityMapProperties);
    return fragmentDensityMapProperties;
}
#endif // VK_EXT_fragment_density_map

#ifdef VK_EXT_fragment_density_map2
VkPhysicalDeviceFragmentDensityMap2FeaturesEXT PhysicalDevice::getFragmentDensityMap2Features() const
{
    VkPhysicalDeviceFragmentDensityMap2FeaturesEXT fragmentDensityMap2Features = {};
    fragmentDensityMap2Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT;
    getFeatures2(&fragmentDensityMap2Features);
    return fragmentDensityMap2Features;
}

VkPhysicalDeviceFragmentDensityMap2PropertiesEXT PhysicalDevice::getFragmentDensityMap2Properties() const
{
    VkPhysicalDeviceFragmentDensityMap2PropertiesEXT fragmentDensityMap2Properties = {};
    fragmentDensityMap2Properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT;
    getProperties2(&fragmentDensityMap2Properties);
    return fragmentDensityMap2Properties;
}
#endif // VK_EXT_fragment_density_map2

#ifdef VK_EXT_fragment_shader_interlock
VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT PhysicalDevice::getFragmentShaderInterlockFeatures() const
{
    VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT fragmentShaderInterlockFeatures = {};
    fragmentShaderInterlockFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT;
    getFeatures2(&fragmentShaderInterlockFeatures);
    return fragmentShaderInterlockFeatures;
}
#endif // VK_EXT_fragment_shader_interlock

#ifdef VK_EXT_graphics_pipeline_library
VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT PhysicalDevice::getGraphicsPipelineLibraryFeatures() const
{
    VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT graphicsPipelineLibraryFeatures = {};
    graphicsPipelineLibraryFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT;
    getFeatures2(&graphicsPipelineLibraryFeatures);
    return graphicsPipelineLibraryFeatures;
}

VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT PhysicalDevice::getGraphicsPipelineLibraryProperties() const
{
    VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT graphicsPipelineLibraryProperties = {};
    graphicsPipelineLibraryProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_PROPERTIES_EXT;
    getProperties2(&graphicsPipelineLibraryProperties);
    return graphicsPipelineLibraryProperties;
}
#endif // VK_EXT_graphics_pipeline_library

#ifdef VK_EXT_host_query_reset
VkPhysicalDeviceHostQueryResetFeaturesEXT PhysicalDevice::getHostQueryResetFeatures() const
{
    VkPhysicalDeviceHostQueryResetFeaturesEXT hostQueryResetFeatures = {};
    hostQueryResetFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT;
    getFeatures2(&hostQueryResetFeatures);
    return hostQueryResetFeatures;
}
#endif // VK_EXT_host_query_reset

#ifdef VK_EXT_image_2d_view_of_3d
VkPhysicalDeviceImage2DViewOf3DFeaturesEXT PhysicalDevice::getImage2DViewOf3DFeatures() const
{
    VkPhysicalDeviceImage2DViewOf3DFeaturesEXT image2DViewOf3DFeatures = {};
    image2DViewOf3DFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT;
    getFeatures2(&image2DViewOf3DFeatures);
    return image2DViewOf3DFeatures;
}
#endif // VK_EXT_image_2d_view_of_3d

#ifdef VK_EXT_image_compression_control
VkPhysicalDeviceImageCompressionControlFeaturesEXT PhysicalDevice::getImageCompressionControlFeatures() const
{
    VkPhysicalDeviceImageCompressionControlFeaturesEXT imageCompressionControlFeatures = {};
    imageCompressionControlFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_FEATURES_EXT;
    getFeatures2(&imageCompressionControlFeatures);
    return imageCompressionControlFeatures;
}
#endif // VK_EXT_image_compression_control

#ifdef VK_EXT_image_compression_control_swapchain
VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT PhysicalDevice::getImageCompressionControlSwapchainFeatures() const
{
    VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT imageCompressionControlSwapchainFeatures = {};
    imageCompressionControlSwapchainFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_FEATURES_EXT;
    getFeatures2(&imageCompressionControlSwapchainFeatures);
    return imageCompressionControlSwapchainFeatures;
}
#endif // VK_EXT_image_compression_control_swapchain

#ifdef VK_EXT_image_robustness
VkPhysicalDeviceImageRobustnessFeaturesEXT PhysicalDevice::getImageRobustnessFeatures() const
{
    VkPhysicalDeviceImageRobustnessFeaturesEXT imageRobustnessFeatures = {};
    imageRobustnessFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT;
    getFeatures2(&imageRobustnessFeatures);
    return imageRobustnessFeatures;
}
#endif // VK_EXT_image_robustness

#ifdef VK_EXT_image_view_min_lod
VkPhysicalDeviceImageViewMinLodFeaturesEXT PhysicalDevice::getImageViewMinLodFeatures() const
{
    VkPhysicalDeviceImageViewMinLodFeaturesEXT imageViewMinLodFeatures = {};
    imageViewMinLodFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT;
    getFeatures2(&imageViewMinLodFeatures);
    return imageViewMinLodFeatures;
}
#endif // VK_EXT_image_view_min_lod

#ifdef VK_EXT_index_type_uint8
VkPhysicalDeviceIndexTypeUint8FeaturesEXT PhysicalDevice::getIndexTypeUint8Features() const
{
    VkPhysicalDeviceIndexTypeUint8FeaturesEXT indexTypeUint8Features = {};
    indexTypeUint8Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT;
    getFeatures2(&indexTypeUint8Features);
    return indexTypeUint8Features;
}
#endif // VK_EXT_index_type_uint8

#ifdef VK_EXT_inline_uniform_block
VkPhysicalDeviceInlineUniformBlockFeaturesEXT PhysicalDevice::getInlineUniformBlockFeatures() const
{
    VkPhysicalDeviceInlineUniformBlockFeaturesEXT inlineUniformBlockFeatures = {};
    inlineUniformBlockFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT;
    getFeatures2(&inlineUniformBlockFeatures);
    return inlineUniformBlockFeatures;
}

VkPhysicalDeviceInlineUniformBlockPropertiesEXT PhysicalDevice::getInlineUniformBlockProperties() const
{
    VkPhysicalDeviceInlineUniformBlockPropertiesEXT inlineUniformBlockProperties = {};
    inlineUniformBlockProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT;
    getProperties2(&inlineUniformBlockProperties);
    return inlineUniformBlockProperties;
}
#endif // VK_EXT_inline_uniform_block

#ifdef VK_EXT_line_rasterization
VkPhysicalDeviceLineRasterizationFeaturesEXT PhysicalDevice::getLineRasterizationFeatures() const
{
    VkPhysicalDeviceLineRasterizationFeaturesEXT lineRasterizationFeatures = {};
    lineRasterizationFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT;
    getFeatures2(&lineRasterizationFeatures);
    return lineRasterizationFeatures;
}

VkPhysicalDeviceLineRasterizationPropertiesEXT PhysicalDevice::getLineRasterizationProperties() const
{
    VkPhysicalDeviceLineRasterizationPropertiesEXT lineRasterizationProperties = {};
    lineRasterizationProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT;
    getProperties2(&lineRasterizationProperties);
    return lineRasterizationProperties;
}
#endif // VK_EXT_line_rasterization

#ifdef VK_EXT_memory_budget
VkPhysicalDeviceMemoryBudgetPropertiesEXT PhysicalDevice::getMemoryBudgetProperties() const
{
    VkPhysicalDeviceMemoryBudgetPropertiesEXT memoryBudgetProperties = {};
    memoryBudgetProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT;
    getProperties2(&memoryBudgetProperties);
    return memoryBudgetProperties;
}
#endif // VK_EXT_memory_budget

#ifdef VK_EXT_memory_priority
VkPhysicalDeviceMemoryPriorityFeaturesEXT PhysicalDevice::getMemoryPriorityFeatures() const
{
    VkPhysicalDeviceMemoryPriorityFeaturesEXT memoryPriorityFeatures = {};
    memoryPriorityFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT;
    getFeatures2(&memoryPriorityFeatures);
    return memoryPriorityFeatures;
}
#endif // VK_EXT_memory_priority

#ifdef VK_EXT_multi_draw
VkPhysicalDeviceMultiDrawFeaturesEXT PhysicalDevice::getMultiDrawFeatures() const
{
    VkPhysicalDeviceMultiDrawFeaturesEXT multiDrawFeatures = {};
    multiDrawFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT;
    getFeatures2(&multiDrawFeatures);
    return multiDrawFeatures;
}

VkPhysicalDeviceMultiDrawPropertiesEXT PhysicalDevice::getMultiDrawProperties() const
{
    VkPhysicalDeviceMultiDrawPropertiesEXT multiDrawProperties = {};
    multiDrawProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT;
    getProperties2(&multiDrawProperties);
    return multiDrawProperties;
}
#endif // VK_EXT_multi_draw

#ifdef VK_EXT_multisampled_render_to_single_sampled
VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT PhysicalDevice::getMultisampledRenderToSingleSampledFeatures() const
{
    VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT multisampledRenderToSingleSampledFeatures = {};
    multisampledRenderToSingleSampledFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT;
    getFeatures2(&multisampledRenderToSingleSampledFeatures);
    return multisampledRenderToSingleSampledFeatures;
}
#endif // VK_EXT_multisampled_render_to_single_sampled

#ifdef VK_EXT_non_seamless_cube_map
VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT PhysicalDevice::getNonSeamlessCubeMapFeatures() const
{
    VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT nonSeamlessCubeMapFeatures = {};
    nonSeamlessCubeMapFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT;
    getFeatures2(&nonSeamlessCubeMapFeatures);
    return nonSeamlessCubeMapFeatures;
}
#endif // VK_EXT_non_seamless_cube_map

#ifdef VK_EXT_pageable_device_local_memory
VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT PhysicalDevice::getPageableDeviceLocalMemoryFeatures() const
{
    VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT pageableDeviceLocalMemoryFeatures = {};
    pageableDeviceLocalMemoryFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT;
    getFeatures2(&pageableDeviceLocalMemoryFeatures);
    return pageableDeviceLocalMemoryFeatures;
}
#endif // VK_EXT_pageable_device_local_memory

#ifdef VK_EXT_pci_bus_info
VkPhysicalDevicePCIBusInfoPropertiesEXT PhysicalDevice::getPCIBusInfoProperties() const
{
    VkPhysicalDevicePCIBusInfoPropertiesEXT pciBusInfoProperties = {};
    pciBusInfoProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT;
    getProperties2(&pciBusInfoProperties);
    return pciBusInfoProperties;
}
#endif // VK_EXT_pci_bus_info

#ifdef VK_EXT_physical_device_drm
VkPhysicalDeviceDrmPropertiesEXT PhysicalDevice::getDrmProperties() const
{
    VkPhysicalDeviceDrmPropertiesEXT drmProperties = {};
    drmProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT;
    getProperties2(&drmProperties);
    return drmProperties;
}
#endif // VK_EXT_physical_device_drm

#ifdef VK_EXT_pipeline_creation_cache_control
VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT PhysicalDevice::getPipelineCreationCacheControlFeatures() const
{
    VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT pipelineCreationCacheControlFeatures = {};
    pipelineCreationCacheControlFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT;
    getFeatures2(&pipelineCreationCacheControlFeatures);
    return pipelineCreationCacheControlFeatures;
}
#endif // VK_EXT_pipeline_creation_cache_control

#ifdef VK_EXT_pipeline_properties
VkPhysicalDevicePipelinePropertiesFeaturesEXT PhysicalDevice::getPipelinePropertiesFeatures() const
{
    VkPhysicalDevicePipelinePropertiesFeaturesEXT pipelinePropertiesFeatures = {};
    pipelinePropertiesFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROPERTIES_FEATURES_EXT;
    getFeatures2(&pipelinePropertiesFeatures);
    return pipelinePropertiesFeatures;
}
#endif // VK_EXT_pipeline_properties

#ifdef VK_EXT_pipeline_robustness
VkPhysicalDevicePipelineRobustnessFeaturesEXT PhysicalDevice::getPipelineRobustnessFeatures() const
{
    VkPhysicalDevicePipelineRobustnessFeaturesEXT pipelineRobustnessFeatures = {};
    pipelineRobustnessFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES_EXT;
    getFeatures2(&pipelineRobustnessFeatures);
    return pipelineRobustnessFeatures;
}

VkPhysicalDevicePipelineRobustnessPropertiesEXT PhysicalDevice::getPipelineRobustnessProperties() const
{
    VkPhysicalDevicePipelineRobustnessPropertiesEXT pipelineRobustnessProperties = {};
    pipelineRobustnessProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES_EXT;
    getProperties2(&pipelineRobustnessProperties);
    return pipelineRobustnessProperties;
}
#endif // VK_EXT_pipeline_robustness

#ifdef VK_EXT_primitive_topology_list_restart
VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT PhysicalDevice::getPrimitiveTopologyListRestartFeatures() const
{
    VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT primitiveTopologyListRestartFeatures = {};
    primitiveTopologyListRestartFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT;
    getFeatures2(&primitiveTopologyListRestartFeatures);
    return primitiveTopologyListRestartFeatures;
}
#endif // VK_EXT_primitive_topology_list_restart

#ifdef VK_EXT_primitives_generated_query
VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT PhysicalDevice::getPrimitivesGeneratedQueryFeatures() const
{
    VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT primitivesGeneratedQueryFeatures = {};
    primitivesGeneratedQueryFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT;
    getFeatures2(&primitivesGeneratedQueryFeatures);
    return primitivesGeneratedQueryFeatures;
}
#endif // VK_EXT_primitives_generated_query

#ifdef VK_EXT_private_data
VkPhysicalDevicePrivateDataFeaturesEXT PhysicalDevice::getPrivateDataFeatures() const
{
    VkPhysicalDevicePrivateDataFeaturesEXT privateDataFeatures = {};
    privateDataFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT;
    getFeatures2(&privateDataFeatures);
    return privateDataFeatures;
}
#endif // VK_EXT_private_data

#ifdef VK_EXT_provoking_vertex
VkPhysicalDeviceProvokingVertexFeaturesEXT PhysicalDevice::getProvokingVertexFeatures() const
{
    VkPhysicalDeviceProvokingVertexFeaturesEXT provokingVertexFeatures = {};
    provokingVertexFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT;
    getFeatures2(&provokingVertexFeatures);
    return provokingVertexFeatures;
}

VkPhysicalDeviceProvokingVertexPropertiesEXT PhysicalDevice::getProvokingVertexProperties() const
{
    VkPhysicalDeviceProvokingVertexPropertiesEXT provokingVertexProperties = {};
    provokingVertexProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT;
    getProperties2(&provokingVertexProperties);
    return provokingVertexProperties;
}
#endif // VK_EXT_provoking_vertex

#ifdef VK_EXT_rgba10x6_formats
VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT PhysicalDevice::getRGBA10X6FormatsFeatures() const
{
    VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT rgba10x6FormatsFeatures = {};
    rgba10x6FormatsFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT;
    getFeatures2(&rgba10x6FormatsFeatures);
    return rgba10x6FormatsFeatures;
}
#endif // VK_EXT_rgba10x6_formats

#ifdef VK_EXT_robustness2
VkPhysicalDeviceRobustness2FeaturesEXT PhysicalDevice::getRobustness2Features() const
{
    VkPhysicalDeviceRobustness2FeaturesEXT robustness2Features = {};
    robustness2Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT;
    getFeatures2(&robustness2Features);
    return robustness2Features;
}

VkPhysicalDeviceRobustness2PropertiesEXT PhysicalDevice::getRobustness2Properties() const
{
    VkPhysicalDeviceRobustness2PropertiesEXT robustness2Properties = {};
    robustness2Properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT;
    getProperties2(&robustness2Properties);
    return robustness2Properties;
}
#endif // VK_EXT_robustness2

#ifdef VK_EXT_sample_locations
VkPhysicalDeviceSampleLocationsPropertiesEXT PhysicalDevice::getSampleLocationsProperties() const
{
    VkPhysicalDeviceSampleLocationsPropertiesEXT sampleLocationsProperties = {};
    sampleLocationsProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT;
    getProperties2(&sampleLocationsProperties);
    return sampleLocationsProperties;
}
#endif // VK_EXT_sample_locations

#ifdef VK_EXT_sampler_filter_minmax
VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT PhysicalDevice::getSamplerFilterMinmaxProperties() const
{
    VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT samplerFilterMinmaxProperties = {};
    samplerFilterMinmaxProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT;
    getProperties2(&samplerFilterMinmaxProperties);
    return samplerFilterMinmaxProperties;
}
#endif // VK_EXT_sampler_filter_minmax

#ifdef VK_EXT_scalar_block_layout
VkPhysicalDeviceScalarBlockLayoutFeaturesEXT PhysicalDevice::getScalarBlockLayoutFeatures() const
{
    VkPhysicalDeviceScalarBlockLayoutFeaturesEXT scalarBlockLayoutFeatures = {};
    scalarBlockLayoutFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT;
    getFeatures2(&scalarBlockLayoutFeatures);
    return scalarBlockLayoutFeatures;
}
#endif // VK_EXT_scalar_block_layout

#ifdef VK_EXT_shader_atomic_float
VkPhysicalDeviceShaderAtomicFloatFeaturesEXT PhysicalDevice::getShaderAtomicFloatFeatures() const
{
    VkPhysicalDeviceShaderAtomicFloatFeaturesEXT shaderAtomicFloatFeatures = {};
    shaderAtomicFloatFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT;
    getFeatures2(&shaderAtomicFloatFeatures);
    return shaderAtomicFloatFeatures;
}
#endif // VK_EXT_shader_atomic_float

#ifdef VK_EXT_shader_atomic_float2
VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT PhysicalDevice::getShaderAtomicFloat2Features() const
{
    VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT shaderAtomicFloat2Features = {};
    shaderAtomicFloat2Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT;
    getFeatures2(&shaderAtomicFloat2Features);
    return shaderAtomicFloat2Features;
}
#endif // VK_EXT_shader_atomic_float2

#ifdef VK_EXT_shader_demote_to_helper_invocation
VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT PhysicalDevice::getShaderDemoteToHelperInvocationFeatures() const
{
    VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT shaderDemoteToHelperInvocationFeatures = {};
    shaderDemoteToHelperInvocationFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT;
    getFeatures2(&shaderDemoteToHelperInvocationFeatures);
    return shaderDemoteToHelperInvocationFeatures;
}
#endif // VK_EXT_shader_demote_to_helper_invocation

#ifdef VK_EXT_shader_image_atomic_int64
VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT PhysicalDevice::getShaderImageAtomicInt64Features() const
{
    VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT shaderImageAtomicInt64Features = {};
    shaderImageAtomicInt64Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT;
    getFeatures2(&shaderImageAtomicInt64Features);
    return shaderImageAtomicInt64Features;
}
#endif // VK_EXT_shader_image_atomic_int64

#ifdef VK_EXT_shader_module_identifier
VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT PhysicalDevice::getShaderModuleIdentifierFeatures() const
{
    VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT shaderModuleIdentifierFeatures = {};
    shaderModuleIdentifierFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_FEATURES_EXT;
    getFeatures2(&shaderModuleIdentifierFeatures);
    return shaderModuleIdentifierFeatures;
}

VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT PhysicalDevice::getShaderModuleIdentifierProperties() const
{
    VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT shaderModuleIdentifierProperties = {};
    shaderModuleIdentifierProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_PROPERTIES_EXT;
    getProperties2(&shaderModuleIdentifierProperties);
    return shaderModuleIdentifierProperties;
}
#endif // VK_EXT_shader_module_identifier

#ifdef VK_EXT_subgroup_size_control
VkPhysicalDeviceSubgroupSizeControlFeaturesEXT PhysicalDevice::getSubgroupSizeControlFeatures() const
{
    VkPhysicalDeviceSubgroupSizeControlFeaturesEXT subgroupSizeControlFeatures = {};
    subgroupSizeControlFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT;
    getFeatures2(&subgroupSizeControlFeatures);
    return subgroupSizeControlFeatures;
}

VkPhysicalDeviceSubgroupSizeControlPropertiesEXT PhysicalDevice::getSubgroupSizeControlProperties() const
{
    VkPhysicalDeviceSubgroupSizeControlPropertiesEXT subgroupSizeControlProperties = {};
    subgroupSizeControlProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT;
    getProperties2(&subgroupSizeControlProperties);
    return subgroupSizeControlProperties;
}
#endif // VK_EXT_subgroup_size_control

#ifdef VK_EXT_subpass_merge_feedback
VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT PhysicalDevice::getSubpassMergeFeedbackFeatures() const
{
    VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT subpassMergeFeedbackFeatures = {};
    subpassMergeFeedbackFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_MERGE_FEEDBACK_FEATURES_EXT;
    getFeatures2(&subpassMergeFeedbackFeatures);
    return subpassMergeFeedbackFeatures;
}
#endif // VK_EXT_subpass_merge_feedback

#ifdef VK_EXT_texel_buffer_alignment
VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT PhysicalDevice::getTexelBufferAlignmentFeatures() const
{
    VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT texelBufferAlignmentFeatures = {};
    texelBufferAlignmentFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT;
    getFeatures2(&texelBufferAlignmentFeatures);
    return texelBufferAlignmentFeatures;
}

VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT PhysicalDevice::getTexelBufferAlignmentProperties() const
{
    VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT texelBufferAlignmentProperties = {};
    texelBufferAlignmentProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT;
    getProperties2(&texelBufferAlignmentProperties);
    return texelBufferAlignmentProperties;
}
#endif // VK_EXT_texel_buffer_alignment

#ifdef VK_EXT_texture_compression_astc_hdr
VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT PhysicalDevice::getTextureCompressionASTCHDRFeatures() const
{
    VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT textureCompressionASTCHDRFeatures = {};
    textureCompressionASTCHDRFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT;
    getFeatures2(&textureCompressionASTCHDRFeatures);
    return textureCompressionASTCHDRFeatures;
}
#endif // VK_EXT_texture_compression_astc_hdr

#ifdef VK_EXT_transform_feedback
VkPhysicalDeviceTransformFeedbackFeaturesEXT PhysicalDevice::getTransformFeedbackFeatures() const
{
    VkPhysicalDeviceTransformFeedbackFeaturesEXT transformFeedbackFeatures = {};
    transformFeedbackFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT;
    getFeatures2(&transformFeedbackFeatures);
    return transformFeedbackFeatures;
}

VkPhysicalDeviceTransformFeedbackPropertiesEXT PhysicalDevice::getTransformFeedbackProperties() const
{
    VkPhysicalDeviceTransformFeedbackPropertiesEXT transformFeedbackProperties = {};
    transformFeedbackProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT;
    getProperties2(&transformFeedbackProperties);
    return transformFeedbackProperties;
}
#endif // VK_EXT_transform_feedback

#ifdef VK_EXT_vertex_attribute_divisor
VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT PhysicalDevice::getVertexAttributeDivisorFeatures() const
{
    VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT vertexAttributeDivisorFeatures = {};
    vertexAttributeDivisorFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT;
    getFeatures2(&vertexAttributeDivisorFeatures);
    return vertexAttributeDivisorFeatures;
}

VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT PhysicalDevice::getVertexAttributeDivisorProperties() const
{
    VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT vertexAttributeDivisorProperties = {};
    vertexAttributeDivisorProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT;
    getProperties2(&vertexAttributeDivisorProperties);
    return vertexAttributeDivisorProperties;
}
#endif // VK_EXT_vertex_attribute_divisor

#ifdef VK_EXT_vertex_input_dynamic_state
VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT PhysicalDevice::getVertexInputDynamicStateFeatures() const
{
    VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT vertexInputDynamicStateFeatures = {};
    vertexInputDynamicStateFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT;
    getFeatures2(&vertexInputDynamicStateFeatures);
    return vertexInputDynamicStateFeatures;
}
#endif // VK_EXT_vertex_input_dynamic_state

#ifdef VK_EXT_ycbcr_2plane_444_formats
VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT PhysicalDevice::getYcbcr2Plane444FormatsFeatures() const
{
    VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT ycbcr2Plane444FormatsFeatures = {};
    ycbcr2Plane444FormatsFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT;
    getFeatures2(&ycbcr2Plane444FormatsFeatures);
    return ycbcr2Plane444FormatsFeatures;
}
#endif // VK_EXT_ycbcr_2plane_444_formats

#ifdef VK_EXT_ycbcr_image_arrays
VkPhysicalDeviceYcbcrImageArraysFeaturesEXT PhysicalDevice::getYcbcrImageArraysFeatures() const
{
    VkPhysicalDeviceYcbcrImageArraysFeaturesEXT ycbcrImageArraysFeatures = {};
    ycbcrImageArraysFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT;
    getFeatures2(&ycbcrImageArraysFeatures);
    return ycbcrImageArraysFeatures;
}
#endif // VK_EXT_ycbcr_image_arrays

#ifdef VK_HUAWEI_invocation_mask
VkPhysicalDeviceInvocationMaskFeaturesHUAWEI PhysicalDevice::getInvocationMaskFeatures() const
{
    VkPhysicalDeviceInvocationMaskFeaturesHUAWEI invocationMaskFeatures = {};
    invocationMaskFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI;
    getFeatures2(&invocationMaskFeatures);
    return invocationMaskFeatures;
}
#endif // VK_HUAWEI_invocation_mask

#ifdef VK_HUAWEI_subpass_shading
VkPhysicalDeviceSubpassShadingFeaturesHUAWEI PhysicalDevice::getSubpassShadingFeatures() const
{
    VkPhysicalDeviceSubpassShadingFeaturesHUAWEI subpassShadingFeatures = {};
    subpassShadingFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI;
    getFeatures2(&subpassShadingFeatures);
    return subpassShadingFeatures;
}

VkPhysicalDeviceSubpassShadingPropertiesHUAWEI PhysicalDevice::getSubpassShadingProperties() const
{
    VkPhysicalDeviceSubpassShadingPropertiesHUAWEI subpassShadingProperties = {};
    subpassShadingProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI;
    getProperties2(&subpassShadingProperties);
    return subpassShadingProperties;
}
#endif // VK_HUAWEI_subpass_shading

#ifdef VK_INTEL_shader_integer_functions2
VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL PhysicalDevice::getShaderIntegerFunctions2Features() const
{
    VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL shaderIntegerFunctions2Features = {};
    shaderIntegerFunctions2Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL;
    getFeatures2(&shaderIntegerFunctions2Features);
    return shaderIntegerFunctions2Features;
}
#endif // VK_INTEL_shader_integer_functions2

#ifdef VK_KHR_16bit_storage
VkPhysicalDevice16BitStorageFeaturesKHR PhysicalDevice::get16BitStorageFeatures() const
{
    VkPhysicalDevice16BitStorageFeaturesKHR _16BitStorageFeatures = {};
    _16BitStorageFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR;
    getFeatures2(&_16BitStorageFeatures);
    return _16BitStorageFeatures;
}
#endif // VK_KHR_16bit_storage

#ifdef VK_KHR_8bit_storage
VkPhysicalDevice8BitStorageFeaturesKHR PhysicalDevice::get8BitStorageFeatures() const
{
    VkPhysicalDevice8BitStorageFeaturesKHR _8BitStorageFeatures = {};
    _8BitStorageFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR;
    getFeatures2(&_8BitStorageFeatures);
    return _8BitStorageFeatures;
}
#endif // VK_KHR_8bit_storage

#ifdef VK_KHR_acceleration_structure
VkPhysicalDeviceAccelerationStructureFeaturesKHR PhysicalDevice::getAccelerationStructureFeatures() const
{
    VkPhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeatures = {};
    accelerationStructureFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR;
    getFeatures2(&accelerationStructureFeatures);
    return accelerationStructureFeatures;
}

VkPhysicalDeviceAccelerationStructurePropertiesKHR PhysicalDevice::getAccelerationStructureProperties() const
{
    VkPhysicalDeviceAccelerationStructurePropertiesKHR accelerationStructureProperties = {};
    accelerationStructureProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR;
    getProperties2(&accelerationStructureProperties);
    return accelerationStructureProperties;
}
#endif // VK_KHR_acceleration_structure

#ifdef VK_KHR_buffer_device_address
VkPhysicalDeviceBufferDeviceAddressFeaturesKHR PhysicalDevice::getBufferDeviceAddressFeatures() const
{
    VkPhysicalDeviceBufferDeviceAddressFeaturesKHR bufferDeviceAddressFeatures = {};
    bufferDeviceAddressFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_KHR;
    getFeatures2(&bufferDeviceAddressFeatures);
    return bufferDeviceAddressFeatures;
}
#endif // VK_KHR_buffer_device_address

#ifdef VK_KHR_depth_stencil_resolve
VkPhysicalDeviceDepthStencilResolvePropertiesKHR PhysicalDevice::getDepthStencilResolveProperties() const
{
    VkPhysicalDeviceDepthStencilResolvePropertiesKHR depthStencilResolveProperties = {};
    depthStencilResolveProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR;
    getProperties2(&depthStencilResolveProperties);
    return depthStencilResolveProperties;
}
#endif // VK_KHR_depth_stencil_resolve

#ifdef VK_KHR_device_group_creation
VkPhysicalDeviceGroupPropertiesKHR PhysicalDevice::getGroupProperties() const
{
    VkPhysicalDeviceGroupPropertiesKHR groupProperties = {};
    groupProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES_KHR;
    getProperties2(&groupProperties);
    return groupProperties;
}
#endif // VK_KHR_device_group_creation

#ifdef VK_KHR_driver_properties
VkPhysicalDeviceDriverPropertiesKHR PhysicalDevice::getDriverProperties() const
{
    VkPhysicalDeviceDriverPropertiesKHR driverProperties = {};
    driverProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR;
    getProperties2(&driverProperties);
    return driverProperties;
}
#endif // VK_KHR_driver_properties

#ifdef VK_KHR_dynamic_rendering
VkPhysicalDeviceDynamicRenderingFeaturesKHR PhysicalDevice::getDynamicRenderingFeatures() const
{
    VkPhysicalDeviceDynamicRenderingFeaturesKHR dynamicRenderingFeatures = {};
    dynamicRenderingFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR;
    getFeatures2(&dynamicRenderingFeatures);
    return dynamicRenderingFeatures;
}
#endif // VK_KHR_dynamic_rendering

#ifdef VK_KHR_external_memory_capabilities
VkPhysicalDeviceIDPropertiesKHR PhysicalDevice::getIDProperties() const
{
    VkPhysicalDeviceIDPropertiesKHR idProperties = {};
    idProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES_KHR;
    getProperties2(&idProperties);
    return idProperties;
}
#endif // VK_KHR_external_memory_capabilities

#ifdef VK_KHR_fragment_shader_barycentric
VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR PhysicalDevice::getFragmentShaderBarycentricFeatures() const
{
    VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR fragmentShaderBarycentricFeatures = {};
    fragmentShaderBarycentricFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR;
    getFeatures2(&fragmentShaderBarycentricFeatures);
    return fragmentShaderBarycentricFeatures;
}

VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR PhysicalDevice::getFragmentShaderBarycentricProperties() const
{
    VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR fragmentShaderBarycentricProperties = {};
    fragmentShaderBarycentricProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_PROPERTIES_KHR;
    getProperties2(&fragmentShaderBarycentricProperties);
    return fragmentShaderBarycentricProperties;
}
#endif // VK_KHR_fragment_shader_barycentric

#ifdef VK_KHR_fragment_shading_rate
VkPhysicalDeviceFragmentShadingRateFeaturesKHR PhysicalDevice::getFragmentShadingRateFeatures() const
{
    VkPhysicalDeviceFragmentShadingRateFeaturesKHR fragmentShadingRateFeatures = {};
    fragmentShadingRateFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR;
    getFeatures2(&fragmentShadingRateFeatures);
    return fragmentShadingRateFeatures;
}

VkPhysicalDeviceFragmentShadingRatePropertiesKHR PhysicalDevice::getFragmentShadingRateProperties() const
{
    VkPhysicalDeviceFragmentShadingRatePropertiesKHR fragmentShadingRateProperties = {};
    fragmentShadingRateProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR;
    getProperties2(&fragmentShadingRateProperties);
    return fragmentShadingRateProperties;
}
#endif // VK_KHR_fragment_shading_rate

#ifdef VK_KHR_global_priority
VkPhysicalDeviceGlobalPriorityQueryFeaturesKHR PhysicalDevice::getGlobalPriorityQueryFeatures() const
{
    VkPhysicalDeviceGlobalPriorityQueryFeaturesKHR globalPriorityQueryFeatures = {};
    globalPriorityQueryFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_KHR;
    getFeatures2(&globalPriorityQueryFeatures);
    return globalPriorityQueryFeatures;
}
#endif // VK_KHR_global_priority

#ifdef VK_KHR_imageless_framebuffer
VkPhysicalDeviceImagelessFramebufferFeaturesKHR PhysicalDevice::getImagelessFramebufferFeatures() const
{
    VkPhysicalDeviceImagelessFramebufferFeaturesKHR imagelessFramebufferFeatures = {};
    imagelessFramebufferFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR;
    getFeatures2(&imagelessFramebufferFeatures);
    return imagelessFramebufferFeatures;
}
#endif // VK_KHR_imageless_framebuffer

#ifdef VK_KHR_maintenance2
VkPhysicalDevicePointClippingPropertiesKHR PhysicalDevice::getPointClippingProperties() const
{
    VkPhysicalDevicePointClippingPropertiesKHR pointClippingProperties = {};
    pointClippingProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES_KHR;
    getProperties2(&pointClippingProperties);
    return pointClippingProperties;
}
#endif // VK_KHR_maintenance2

#ifdef VK_KHR_maintenance3
VkPhysicalDeviceMaintenance3PropertiesKHR PhysicalDevice::getMaintenance3Properties() const
{
    VkPhysicalDeviceMaintenance3PropertiesKHR maintenance3Properties = {};
    maintenance3Properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES_KHR;
    getProperties2(&maintenance3Properties);
    return maintenance3Properties;
}
#endif // VK_KHR_maintenance3

#ifdef VK_KHR_maintenance4
VkPhysicalDeviceMaintenance4FeaturesKHR PhysicalDevice::getMaintenance4Features() const
{
    VkPhysicalDeviceMaintenance4FeaturesKHR maintenance4Features = {};
    maintenance4Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR;
    getFeatures2(&maintenance4Features);
    return maintenance4Features;
}

VkPhysicalDeviceMaintenance4PropertiesKHR PhysicalDevice::getMaintenance4Properties() const
{
    VkPhysicalDeviceMaintenance4PropertiesKHR maintenance4Properties = {};
    maintenance4Properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR;
    getProperties2(&maintenance4Properties);
    return maintenance4Properties;
}
#endif // VK_KHR_maintenance4

#ifdef VK_KHR_multiview
VkPhysicalDeviceMultiviewFeaturesKHR PhysicalDevice::getMultiviewFeatures() const
{
    VkPhysicalDeviceMultiviewFeaturesKHR multiviewFeatures = {};
    multiviewFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR;
    getFeatures2(&multiviewFeatures);
    return multiviewFeatures;
}

VkPhysicalDeviceMultiviewPropertiesKHR PhysicalDevice::getMultiviewProperties() const
{
    VkPhysicalDeviceMultiviewPropertiesKHR multiviewProperties = {};
    multiviewProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES_KHR;
    getProperties2(&multiviewProperties);
    return multiviewProperties;
}
#endif // VK_KHR_multiview

#ifdef VK_KHR_performance_query
VkPhysicalDevicePerformanceQueryFeaturesKHR PhysicalDevice::getPerformanceQueryFeatures() const
{
    VkPhysicalDevicePerformanceQueryFeaturesKHR performanceQueryFeatures = {};
    performanceQueryFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR;
    getFeatures2(&performanceQueryFeatures);
    return performanceQueryFeatures;
}

VkPhysicalDevicePerformanceQueryPropertiesKHR PhysicalDevice::getPerformanceQueryProperties() const
{
    VkPhysicalDevicePerformanceQueryPropertiesKHR performanceQueryProperties = {};
    performanceQueryProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR;
    getProperties2(&performanceQueryProperties);
    return performanceQueryProperties;
}
#endif // VK_KHR_performance_query

#ifdef VK_KHR_pipeline_executable_properties
VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR PhysicalDevice::getPipelineExecutablePropertiesFeatures() const
{
    VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR pipelineExecutablePropertiesFeatures = {};
    pipelineExecutablePropertiesFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR;
    getFeatures2(&pipelineExecutablePropertiesFeatures);
    return pipelineExecutablePropertiesFeatures;
}
#endif // VK_KHR_pipeline_executable_properties

#ifdef VK_KHR_present_id
VkPhysicalDevicePresentIdFeaturesKHR PhysicalDevice::getPresentIdFeatures() const
{
    VkPhysicalDevicePresentIdFeaturesKHR presentIdFeatures = {};
    presentIdFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR;
    getFeatures2(&presentIdFeatures);
    return presentIdFeatures;
}
#endif // VK_KHR_present_id

#ifdef VK_KHR_present_wait
VkPhysicalDevicePresentWaitFeaturesKHR PhysicalDevice::getPresentWaitFeatures() const
{
    VkPhysicalDevicePresentWaitFeaturesKHR presentWaitFeatures = {};
    presentWaitFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR;
    getFeatures2(&presentWaitFeatures);
    return presentWaitFeatures;
}
#endif // VK_KHR_present_wait

#ifdef VK_KHR_push_descriptor
VkPhysicalDevicePushDescriptorPropertiesKHR PhysicalDevice::getPushDescriptorProperties() const
{
    VkPhysicalDevicePushDescriptorPropertiesKHR pushDescriptorProperties = {};
    pushDescriptorProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR;
    getProperties2(&pushDescriptorProperties);
    return pushDescriptorProperties;
}
#endif // VK_KHR_push_descriptor

#ifdef VK_KHR_ray_query
VkPhysicalDeviceRayQueryFeaturesKHR PhysicalDevice::getRayQueryFeatures() const
{
    VkPhysicalDeviceRayQueryFeaturesKHR rayQueryFeatures = {};
    rayQueryFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR;
    getFeatures2(&rayQueryFeatures);
    return rayQueryFeatures;
}
#endif // VK_KHR_ray_query

#ifdef VK_KHR_ray_tracing_maintenance1
VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR PhysicalDevice::getRayTracingMaintenance1Features() const
{
    VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR rayTracingMaintenance1Features = {};
    rayTracingMaintenance1Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR;
    getFeatures2(&rayTracingMaintenance1Features);
    return rayTracingMaintenance1Features;
}
#endif // VK_KHR_ray_tracing_maintenance1

#ifdef VK_KHR_ray_tracing_pipeline
VkPhysicalDeviceRayTracingPipelineFeaturesKHR PhysicalDevice::getRayTracingPipelineFeatures() const
{
    VkPhysicalDeviceRayTracingPipelineFeaturesKHR rayTracingPipelineFeatures = {};
    rayTracingPipelineFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR;
    getFeatures2(&rayTracingPipelineFeatures);
    return rayTracingPipelineFeatures;
}

VkPhysicalDeviceRayTracingPipelinePropertiesKHR PhysicalDevice::getRayTracingPipelineProperties() const
{
    VkPhysicalDeviceRayTracingPipelinePropertiesKHR rayTracingPipelineProperties = {};
    rayTracingPipelineProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR;
    getProperties2(&rayTracingPipelineProperties);
    return rayTracingPipelineProperties;
}
#endif // VK_KHR_ray_tracing_pipeline

#ifdef VK_KHR_sampler_ycbcr_conversion
VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR PhysicalDevice::getSamplerYcbcrConversionFeatures() const
{
    VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR samplerYcbcrConversionFeatures = {};
    samplerYcbcrConversionFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES_KHR;
    getFeatures2(&samplerYcbcrConversionFeatures);
    return samplerYcbcrConversionFeatures;
}
#endif // VK_KHR_sampler_ycbcr_conversion

#ifdef VK_KHR_separate_depth_stencil_layouts
VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR PhysicalDevice::getSeparateDepthStencilLayoutsFeatures() const
{
    VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR separateDepthStencilLayoutsFeatures = {};
    separateDepthStencilLayoutsFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES_KHR;
    getFeatures2(&separateDepthStencilLayoutsFeatures);
    return separateDepthStencilLayoutsFeatures;
}
#endif // VK_KHR_separate_depth_stencil_layouts

#ifdef VK_KHR_shader_atomic_int64
VkPhysicalDeviceShaderAtomicInt64FeaturesKHR PhysicalDevice::getShaderAtomicInt64Features() const
{
    VkPhysicalDeviceShaderAtomicInt64FeaturesKHR shaderAtomicInt64Features = {};
    shaderAtomicInt64Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR;
    getFeatures2(&shaderAtomicInt64Features);
    return shaderAtomicInt64Features;
}
#endif // VK_KHR_shader_atomic_int64

#ifdef VK_KHR_shader_clock
VkPhysicalDeviceShaderClockFeaturesKHR PhysicalDevice::getShaderClockFeatures() const
{
    VkPhysicalDeviceShaderClockFeaturesKHR shaderClockFeatures = {};
    shaderClockFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR;
    getFeatures2(&shaderClockFeatures);
    return shaderClockFeatures;
}
#endif // VK_KHR_shader_clock

#ifdef VK_KHR_shader_float16_int8
VkPhysicalDeviceFloat16Int8FeaturesKHR PhysicalDevice::getFloat16Int8Features() const
{
    VkPhysicalDeviceFloat16Int8FeaturesKHR float16Int8Features = {};
    float16Int8Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR;
    getFeatures2(&float16Int8Features);
    return float16Int8Features;
}
#endif // VK_KHR_shader_float16_int8

#ifdef VK_KHR_shader_float_controls
VkPhysicalDeviceFloatControlsPropertiesKHR PhysicalDevice::getFloatControlsProperties() const
{
    VkPhysicalDeviceFloatControlsPropertiesKHR floatControlsProperties = {};
    floatControlsProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR;
    getProperties2(&floatControlsProperties);
    return floatControlsProperties;
}
#endif // VK_KHR_shader_float_controls

#ifdef VK_KHR_shader_integer_dot_product
VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR PhysicalDevice::getShaderIntegerDotProductFeatures() const
{
    VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR shaderIntegerDotProductFeatures = {};
    shaderIntegerDotProductFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR;
    getFeatures2(&shaderIntegerDotProductFeatures);
    return shaderIntegerDotProductFeatures;
}

VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR PhysicalDevice::getShaderIntegerDotProductProperties() const
{
    VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR shaderIntegerDotProductProperties = {};
    shaderIntegerDotProductProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR;
    getProperties2(&shaderIntegerDotProductProperties);
    return shaderIntegerDotProductProperties;
}
#endif // VK_KHR_shader_integer_dot_product

#ifdef VK_KHR_shader_subgroup_extended_types
VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR PhysicalDevice::getShaderSubgroupExtendedTypesFeatures() const
{
    VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR shaderSubgroupExtendedTypesFeatures = {};
    shaderSubgroupExtendedTypesFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES_KHR;
    getFeatures2(&shaderSubgroupExtendedTypesFeatures);
    return shaderSubgroupExtendedTypesFeatures;
}
#endif // VK_KHR_shader_subgroup_extended_types

#ifdef VK_KHR_shader_subgroup_uniform_control_flow
VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR PhysicalDevice::getShaderSubgroupUniformControlFlowFeatures() const
{
    VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR shaderSubgroupUniformControlFlowFeatures = {};
    shaderSubgroupUniformControlFlowFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR;
    getFeatures2(&shaderSubgroupUniformControlFlowFeatures);
    return shaderSubgroupUniformControlFlowFeatures;
}
#endif // VK_KHR_shader_subgroup_uniform_control_flow

#ifdef VK_KHR_shader_terminate_invocation
VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR PhysicalDevice::getShaderTerminateInvocationFeatures() const
{
    VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR shaderTerminateInvocationFeatures = {};
    shaderTerminateInvocationFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR;
    getFeatures2(&shaderTerminateInvocationFeatures);
    return shaderTerminateInvocationFeatures;
}
#endif // VK_KHR_shader_terminate_invocation

#ifdef VK_KHR_synchronization2
VkPhysicalDeviceSynchronization2FeaturesKHR PhysicalDevice::getSynchronization2Features() const
{
    VkPhysicalDeviceSynchronization2FeaturesKHR synchronization2Features = {};
    synchronization2Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR;
    getFeatures2(&synchronization2Features);
    return synchronization2Features;
}
#endif // VK_KHR_synchronization2

#ifdef VK_KHR_timeline_semaphore
VkPhysicalDeviceTimelineSemaphoreFeaturesKHR PhysicalDevice::getTimelineSemaphoreFeatures() const
{
    VkPhysicalDeviceTimelineSemaphoreFeaturesKHR timelineSemaphoreFeatures = {};
    timelineSemaphoreFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR;
    getFeatures2(&timelineSemaphoreFeatures);
    return timelineSemaphoreFeatures;
}

VkPhysicalDeviceTimelineSemaphorePropertiesKHR PhysicalDevice::getTimelineSemaphoreProperties() const
{
    VkPhysicalDeviceTimelineSemaphorePropertiesKHR timelineSemaphoreProperties = {};
    timelineSemaphoreProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES_KHR;
    getProperties2(&timelineSemaphoreProperties);
    return timelineSemaphoreProperties;
}
#endif // VK_KHR_timeline_semaphore

#ifdef VK_KHR_uniform_buffer_standard_layout
VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR PhysicalDevice::getUniformBufferStandardLayoutFeatures() const
{
    VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR uniformBufferStandardLayoutFeatures = {};
    uniformBufferStandardLayoutFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR;
    getFeatures2(&uniformBufferStandardLayoutFeatures);
    return uniformBufferStandardLayoutFeatures;
}
#endif // VK_KHR_uniform_buffer_standard_layout

#ifdef VK_KHR_variable_pointers
VkPhysicalDeviceVariablePointersFeaturesKHR PhysicalDevice::getVariablePointersFeatures() const
{
    VkPhysicalDeviceVariablePointersFeaturesKHR variablePointersFeatures = {};
    variablePointersFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES_KHR;
    getFeatures2(&variablePointersFeatures);
    return variablePointersFeatures;
}
#endif // VK_KHR_variable_pointers

#ifdef VK_KHR_vulkan_memory_model
VkPhysicalDeviceVulkanMemoryModelFeaturesKHR PhysicalDevice::getVulkanMemoryModelFeatures() const
{
    VkPhysicalDeviceVulkanMemoryModelFeaturesKHR vulkanMemoryModelFeatures = {};
    vulkanMemoryModelFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR;
    getFeatures2(&vulkanMemoryModelFeatures);
    return vulkanMemoryModelFeatures;
}
#endif // VK_KHR_vulkan_memory_model

#ifdef VK_KHR_workgroup_memory_explicit_layout
VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR PhysicalDevice::getWorkgroupMemoryExplicitLayoutFeatures() const
{
    VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR workgroupMemoryExplicitLayoutFeatures = {};
    workgroupMemoryExplicitLayoutFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR;
    getFeatures2(&workgroupMemoryExplicitLayoutFeatures);
    return workgroupMemoryExplicitLayoutFeatures;
}
#endif // VK_KHR_workgroup_memory_explicit_layout

#ifdef VK_KHR_zero_initialize_workgroup_memory
VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR PhysicalDevice::getZeroInitializeWorkgroupMemoryFeatures() const
{
    VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR zeroInitializeWorkgroupMemoryFeatures = {};
    zeroInitializeWorkgroupMemoryFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR;
    getFeatures2(&zeroInitializeWorkgroupMemoryFeatures);
    return zeroInitializeWorkgroupMemoryFeatures;
}
#endif // VK_KHR_zero_initialize_workgroup_memory

#ifdef VK_NVX_multiview_per_view_attributes
VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX PhysicalDevice::getMultiviewPerViewAttributesProperties() const
{
    VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX multiviewPerViewAttributesProperties = {};
    multiviewPerViewAttributesProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX;
    getProperties2(&multiviewPerViewAttributesProperties);
    return multiviewPerViewAttributesProperties;
}
#endif // VK_NVX_multiview_per_view_attributes

#ifdef VK_NV_compute_shader_derivatives
VkPhysicalDeviceComputeShaderDerivativesFeaturesNV PhysicalDevice::getComputeShaderDerivativesFeatures() const
{
    VkPhysicalDeviceComputeShaderDerivativesFeaturesNV computeShaderDerivativesFeatures = {};
    computeShaderDerivativesFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV;
    getFeatures2(&computeShaderDerivativesFeatures);
    return computeShaderDerivativesFeatures;
}
#endif // VK_NV_compute_shader_derivatives

#ifdef VK_NV_cooperative_matrix
VkPhysicalDeviceCooperativeMatrixFeaturesNV PhysicalDevice::getCooperativeMatrixFeatures() const
{
    VkPhysicalDeviceCooperativeMatrixFeaturesNV cooperativeMatrixFeatures = {};
    cooperativeMatrixFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV;
    getFeatures2(&cooperativeMatrixFeatures);
    return cooperativeMatrixFeatures;
}

VkPhysicalDeviceCooperativeMatrixPropertiesNV PhysicalDevice::getCooperativeMatrixProperties() const
{
    VkPhysicalDeviceCooperativeMatrixPropertiesNV cooperativeMatrixProperties = {};
    cooperativeMatrixProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV;
    getProperties2(&cooperativeMatrixProperties);
    return cooperativeMatrixProperties;
}
#endif // VK_NV_cooperative_matrix

#ifdef VK_NV_corner_sampled_image
VkPhysicalDeviceCornerSampledImageFeaturesNV PhysicalDevice::getCornerSampledImageFeatures() const
{
    VkPhysicalDeviceCornerSampledImageFeaturesNV cornerSampledImageFeatures = {};
    cornerSampledImageFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV;
    getFeatures2(&cornerSampledImageFeatures);
    return cornerSampledImageFeatures;
}
#endif // VK_NV_corner_sampled_image

#ifdef VK_NV_coverage_reduction_mode
VkPhysicalDeviceCoverageReductionModeFeaturesNV PhysicalDevice::getCoverageReductionModeFeatures() const
{
    VkPhysicalDeviceCoverageReductionModeFeaturesNV coverageReductionModeFeatures = {};
    coverageReductionModeFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV;
    getFeatures2(&coverageReductionModeFeatures);
    return coverageReductionModeFeatures;
}
#endif // VK_NV_coverage_reduction_mode

#ifdef VK_NV_dedicated_allocation_image_aliasing
VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV PhysicalDevice::getDedicatedAllocationImageAliasingFeatures() const
{
    VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV dedicatedAllocationImageAliasingFeatures = {};
    dedicatedAllocationImageAliasingFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV;
    getFeatures2(&dedicatedAllocationImageAliasingFeatures);
    return dedicatedAllocationImageAliasingFeatures;
}
#endif // VK_NV_dedicated_allocation_image_aliasing

#ifdef VK_NV_device_diagnostics_config
VkPhysicalDeviceDiagnosticsConfigFeaturesNV PhysicalDevice::getDiagnosticsConfigFeatures() const
{
    VkPhysicalDeviceDiagnosticsConfigFeaturesNV diagnosticsConfigFeatures = {};
    diagnosticsConfigFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV;
    getFeatures2(&diagnosticsConfigFeatures);
    return diagnosticsConfigFeatures;
}
#endif // VK_NV_device_diagnostics_config

#ifdef VK_NV_device_generated_commands
VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV PhysicalDevice::getDeviceGeneratedCommandsFeatures() const
{
    VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV deviceGeneratedCommandsFeatures = {};
    deviceGeneratedCommandsFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV;
    getFeatures2(&deviceGeneratedCommandsFeatures);
    return deviceGeneratedCommandsFeatures;
}

VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV PhysicalDevice::getDeviceGeneratedCommandsProperties() const
{
    VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV deviceGeneratedCommandsProperties = {};
    deviceGeneratedCommandsProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV;
    getProperties2(&deviceGeneratedCommandsProperties);
    return deviceGeneratedCommandsProperties;
}
#endif // VK_NV_device_generated_commands

#ifdef VK_NV_external_memory_rdma
VkPhysicalDeviceExternalMemoryRDMAFeaturesNV PhysicalDevice::getExternalMemoryRDMAFeatures() const
{
    VkPhysicalDeviceExternalMemoryRDMAFeaturesNV externalMemoryRDMAFeatures = {};
    externalMemoryRDMAFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV;
    getFeatures2(&externalMemoryRDMAFeatures);
    return externalMemoryRDMAFeatures;
}
#endif // VK_NV_external_memory_rdma

#ifdef VK_NV_fragment_shading_rate_enums
VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV PhysicalDevice::getFragmentShadingRateEnumsFeatures() const
{
    VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV fragmentShadingRateEnumsFeatures = {};
    fragmentShadingRateEnumsFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV;
    getFeatures2(&fragmentShadingRateEnumsFeatures);
    return fragmentShadingRateEnumsFeatures;
}

VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV PhysicalDevice::getFragmentShadingRateEnumsProperties() const
{
    VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV fragmentShadingRateEnumsProperties = {};
    fragmentShadingRateEnumsProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV;
    getProperties2(&fragmentShadingRateEnumsProperties);
    return fragmentShadingRateEnumsProperties;
}
#endif // VK_NV_fragment_shading_rate_enums

#ifdef VK_NV_inherited_viewport_scissor
VkPhysicalDeviceInheritedViewportScissorFeaturesNV PhysicalDevice::getInheritedViewportScissorFeatures() const
{
    VkPhysicalDeviceInheritedViewportScissorFeaturesNV inheritedViewportScissorFeatures = {};
    inheritedViewportScissorFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV;
    getFeatures2(&inheritedViewportScissorFeatures);
    return inheritedViewportScissorFeatures;
}
#endif // VK_NV_inherited_viewport_scissor

#ifdef VK_NV_linear_color_attachment
VkPhysicalDeviceLinearColorAttachmentFeaturesNV PhysicalDevice::getLinearColorAttachmentFeatures() const
{
    VkPhysicalDeviceLinearColorAttachmentFeaturesNV linearColorAttachmentFeatures = {};
    linearColorAttachmentFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINEAR_COLOR_ATTACHMENT_FEATURES_NV;
    getFeatures2(&linearColorAttachmentFeatures);
    return linearColorAttachmentFeatures;
}
#endif // VK_NV_linear_color_attachment

#ifdef VK_NV_mesh_shader
VkPhysicalDeviceMeshShaderFeaturesNV PhysicalDevice::getMeshShaderFeatures() const
{
    VkPhysicalDeviceMeshShaderFeaturesNV meshShaderFeatures = {};
    meshShaderFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV;
    getFeatures2(&meshShaderFeatures);
    return meshShaderFeatures;
}

VkPhysicalDeviceMeshShaderPropertiesNV PhysicalDevice::getMeshShaderProperties() const
{
    VkPhysicalDeviceMeshShaderPropertiesNV meshShaderProperties = {};
    meshShaderProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV;
    getProperties2(&meshShaderProperties);
    return meshShaderProperties;
}
#endif // VK_NV_mesh_shader

#ifdef VK_NV_ray_tracing
VkPhysicalDeviceRayTracingPropertiesNV PhysicalDevice::getRayTracingProperties() const
{
    VkPhysicalDeviceRayTracingPropertiesNV rayTracingProperties = {};
    rayTracingProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV;
    getProperties2(&rayTracingProperties);
    return rayTracingProperties;
}
#endif // VK_NV_ray_tracing

#ifdef VK_NV_ray_tracing_motion_blur
VkPhysicalDeviceRayTracingMotionBlurFeaturesNV PhysicalDevice::getRayTracingMotionBlurFeatures() const
{
    VkPhysicalDeviceRayTracingMotionBlurFeaturesNV rayTracingMotionBlurFeatures = {};
    rayTracingMotionBlurFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV;
    getFeatures2(&rayTracingMotionBlurFeatures);
    return rayTracingMotionBlurFeatures;
}
#endif // VK_NV_ray_tracing_motion_blur

#ifdef VK_NV_representative_fragment_test
VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV PhysicalDevice::getRepresentativeFragmentTestFeatures() const
{
    VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV representativeFragmentTestFeatures = {};
    representativeFragmentTestFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV;
    getFeatures2(&representativeFragmentTestFeatures);
    return representativeFragmentTestFeatures;
}
#endif // VK_NV_representative_fragment_test

#ifdef VK_NV_scissor_exclusive
VkPhysicalDeviceExclusiveScissorFeaturesNV PhysicalDevice::getExclusiveScissorFeatures() const
{
    VkPhysicalDeviceExclusiveScissorFeaturesNV exclusiveScissorFeatures = {};
    exclusiveScissorFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV;
    getFeatures2(&exclusiveScissorFeatures);
    return exclusiveScissorFeatures;
}
#endif // VK_NV_scissor_exclusive

#ifdef VK_NV_shader_image_footprint
VkPhysicalDeviceShaderImageFootprintFeaturesNV PhysicalDevice::getShaderImageFootprintFeatures() const
{
    VkPhysicalDeviceShaderImageFootprintFeaturesNV shaderImageFootprintFeatures = {};
    shaderImageFootprintFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV;
    getFeatures2(&shaderImageFootprintFeatures);
    return shaderImageFootprintFeatures;
}
#endif // VK_NV_shader_image_footprint

#ifdef VK_NV_shader_sm_builtins
VkPhysicalDeviceShaderSMBuiltinsFeaturesNV PhysicalDevice::getShaderSMBuiltinsFeatures() const
{
    VkPhysicalDeviceShaderSMBuiltinsFeaturesNV shaderSMBuiltinsFeatures = {};
    shaderSMBuiltinsFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV;
    getFeatures2(&shaderSMBuiltinsFeatures);
    return shaderSMBuiltinsFeatures;
}

VkPhysicalDeviceShaderSMBuiltinsPropertiesNV PhysicalDevice::getShaderSMBuiltinsProperties() const
{
    VkPhysicalDeviceShaderSMBuiltinsPropertiesNV shaderSMBuiltinsProperties = {};
    shaderSMBuiltinsProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV;
    getProperties2(&shaderSMBuiltinsProperties);
    return shaderSMBuiltinsProperties;
}
#endif // VK_NV_shader_sm_builtins

#ifdef VK_NV_shading_rate_image
VkPhysicalDeviceShadingRateImageFeaturesNV PhysicalDevice::getShadingRateImageFeatures() const
{
    VkPhysicalDeviceShadingRateImageFeaturesNV shadingRateImageFeatures = {};
    shadingRateImageFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV;
    getFeatures2(&shadingRateImageFeatures);
    return shadingRateImageFeatures;
}

VkPhysicalDeviceShadingRateImagePropertiesNV PhysicalDevice::getShadingRateImageProperties() const
{
    VkPhysicalDeviceShadingRateImagePropertiesNV shadingRateImageProperties = {};
    shadingRateImageProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV;
    getProperties2(&shadingRateImageProperties);
    return shadingRateImageProperties;
}
#endif // VK_NV_shading_rate_image

#ifdef VK_QCOM_fragment_density_map_offset
VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM PhysicalDevice::getFragmentDensityMapOffsetFeatures() const
{
    VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM fragmentDensityMapOffsetFeatures = {};
    fragmentDensityMapOffsetFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_FEATURES_QCOM;
    getFeatures2(&fragmentDensityMapOffsetFeatures);
    return fragmentDensityMapOffsetFeatures;
}

VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM PhysicalDevice::getFragmentDensityMapOffsetProperties() const
{
    VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM fragmentDensityMapOffsetProperties = {};
    fragmentDensityMapOffsetProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_PROPERTIES_QCOM;
    getProperties2(&fragmentDensityMapOffsetProperties);
    return fragmentDensityMapOffsetProperties;
}
#endif // VK_QCOM_fragment_density_map_offset

#ifdef VK_QCOM_image_processing
VkPhysicalDeviceImageProcessingFeaturesQCOM PhysicalDevice::getImageProcessingFeatures() const
{
    VkPhysicalDeviceImageProcessingFeaturesQCOM imageProcessingFeatures = {};
    imageProcessingFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_FEATURES_QCOM;
    getFeatures2(&imageProcessingFeatures);
    return imageProcessingFeatures;
}

VkPhysicalDeviceImageProcessingPropertiesQCOM PhysicalDevice::getImageProcessingProperties() const
{
    VkPhysicalDeviceImageProcessingPropertiesQCOM imageProcessingProperties = {};
    imageProcessingProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_PROPERTIES_QCOM;
    getProperties2(&imageProcessingProperties);
    return imageProcessingProperties;
}
#endif // VK_QCOM_image_processing

#ifdef VK_QCOM_tile_properties
VkPhysicalDeviceTilePropertiesFeaturesQCOM PhysicalDevice::getTilePropertiesFeatures() const
{
    VkPhysicalDeviceTilePropertiesFeaturesQCOM tilePropertiesFeatures = {};
    tilePropertiesFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_PROPERTIES_FEATURES_QCOM;
    getFeatures2(&tilePropertiesFeatures);
    return tilePropertiesFeatures;
}
#endif // VK_QCOM_tile_properties

#ifdef VK_SEC_amigo_profiling
VkPhysicalDeviceAmigoProfilingFeaturesSEC PhysicalDevice::getAmigoProfilingFeatures() const
{
    VkPhysicalDeviceAmigoProfilingFeaturesSEC amigoProfilingFeatures = {};
    amigoProfilingFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_AMIGO_PROFILING_FEATURES_SEC;
    getFeatures2(&amigoProfilingFeatures);
    return amigoProfilingFeatures;
}
#endif // VK_SEC_amigo_profiling

#ifdef VK_VALVE_descriptor_set_host_mapping
VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE PhysicalDevice::getDescriptorSetHostMappingFeatures() const
{
    VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE descriptorSetHostMappingFeatures = {};
    descriptorSetHostMappingFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_SET_HOST_MAPPING_FEATURES_VALVE;
    getFeatures2(&descriptorSetHostMappingFeatures);
    return descriptorSetHostMappingFeatures;
}
#endif // VK_VALVE_descriptor_set_host_mapping

#ifdef VK_VALVE_mutable_descriptor_type
VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE PhysicalDevice::getMutableDescriptorTypeFeatures() const
{
    VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE mutableDescriptorTypeFeatures = {};
    mutableDescriptorTypeFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE;
    getFeatures2(&mutableDescriptorTypeFeatures);
    return mutableDescriptorTypeFeatures;
}
#endif // VK_VALVE_mutable_descriptor_type
} // namespace magma
