// *** THIS FILE IS GENERATED - DO NOT EDIT ***
// See feature_not_present.py for modifications

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

#include "chassis/dispatch_object.h"
#include "generated/dispatch_functions.h"
#include "error_message/error_location.h"

namespace vvl {

void DispatchInstance::ReportErrorFeatureNotPresent(VkPhysicalDevice gpu, const VkDeviceCreateInfo& create_info) {
    std::ostringstream ss;
    ss << "returned VK_ERROR_FEATURE_NOT_PRESENT because the following features were not supported on this physical device:\n";

    // First do 1.0 VkPhysicalDeviceFeatures
    const auto* features2_in = vku::FindStructInPNextChain<VkPhysicalDeviceFeatures2>(create_info.pNext);
    if (create_info.pEnabledFeatures || features2_in) {
        const VkPhysicalDeviceFeatures& enabling =
            create_info.pEnabledFeatures ? *create_info.pEnabledFeatures : features2_in->features;

        VkPhysicalDeviceFeatures supported = {};
        DispatchGetPhysicalDeviceFeatures(gpu, &supported);
        if (enabling.robustBufferAccess && !supported.robustBufferAccess) {
            ss << "VkPhysicalDeviceFeatures::robustBufferAccess is not supported\n";
        }
        if (enabling.fullDrawIndexUint32 && !supported.fullDrawIndexUint32) {
            ss << "VkPhysicalDeviceFeatures::fullDrawIndexUint32 is not supported\n";
        }
        if (enabling.imageCubeArray && !supported.imageCubeArray) {
            ss << "VkPhysicalDeviceFeatures::imageCubeArray is not supported\n";
        }
        if (enabling.independentBlend && !supported.independentBlend) {
            ss << "VkPhysicalDeviceFeatures::independentBlend is not supported\n";
        }
        if (enabling.geometryShader && !supported.geometryShader) {
            ss << "VkPhysicalDeviceFeatures::geometryShader is not supported\n";
        }
        if (enabling.tessellationShader && !supported.tessellationShader) {
            ss << "VkPhysicalDeviceFeatures::tessellationShader is not supported\n";
        }
        if (enabling.sampleRateShading && !supported.sampleRateShading) {
            ss << "VkPhysicalDeviceFeatures::sampleRateShading is not supported\n";
        }
        if (enabling.dualSrcBlend && !supported.dualSrcBlend) {
            ss << "VkPhysicalDeviceFeatures::dualSrcBlend is not supported\n";
        }
        if (enabling.logicOp && !supported.logicOp) {
            ss << "VkPhysicalDeviceFeatures::logicOp is not supported\n";
        }
        if (enabling.multiDrawIndirect && !supported.multiDrawIndirect) {
            ss << "VkPhysicalDeviceFeatures::multiDrawIndirect is not supported\n";
        }
        if (enabling.drawIndirectFirstInstance && !supported.drawIndirectFirstInstance) {
            ss << "VkPhysicalDeviceFeatures::drawIndirectFirstInstance is not supported\n";
        }
        if (enabling.depthClamp && !supported.depthClamp) {
            ss << "VkPhysicalDeviceFeatures::depthClamp is not supported\n";
        }
        if (enabling.depthBiasClamp && !supported.depthBiasClamp) {
            ss << "VkPhysicalDeviceFeatures::depthBiasClamp is not supported\n";
        }
        if (enabling.fillModeNonSolid && !supported.fillModeNonSolid) {
            ss << "VkPhysicalDeviceFeatures::fillModeNonSolid is not supported\n";
        }
        if (enabling.depthBounds && !supported.depthBounds) {
            ss << "VkPhysicalDeviceFeatures::depthBounds is not supported\n";
        }
        if (enabling.wideLines && !supported.wideLines) {
            ss << "VkPhysicalDeviceFeatures::wideLines is not supported\n";
        }
        if (enabling.largePoints && !supported.largePoints) {
            ss << "VkPhysicalDeviceFeatures::largePoints is not supported\n";
        }
        if (enabling.alphaToOne && !supported.alphaToOne) {
            ss << "VkPhysicalDeviceFeatures::alphaToOne is not supported\n";
        }
        if (enabling.multiViewport && !supported.multiViewport) {
            ss << "VkPhysicalDeviceFeatures::multiViewport is not supported\n";
        }
        if (enabling.samplerAnisotropy && !supported.samplerAnisotropy) {
            ss << "VkPhysicalDeviceFeatures::samplerAnisotropy is not supported\n";
        }
        if (enabling.textureCompressionETC2 && !supported.textureCompressionETC2) {
            ss << "VkPhysicalDeviceFeatures::textureCompressionETC2 is not supported\n";
        }
        if (enabling.textureCompressionASTC_LDR && !supported.textureCompressionASTC_LDR) {
            ss << "VkPhysicalDeviceFeatures::textureCompressionASTC_LDR is not supported\n";
        }
        if (enabling.textureCompressionBC && !supported.textureCompressionBC) {
            ss << "VkPhysicalDeviceFeatures::textureCompressionBC is not supported\n";
        }
        if (enabling.occlusionQueryPrecise && !supported.occlusionQueryPrecise) {
            ss << "VkPhysicalDeviceFeatures::occlusionQueryPrecise is not supported\n";
        }
        if (enabling.pipelineStatisticsQuery && !supported.pipelineStatisticsQuery) {
            ss << "VkPhysicalDeviceFeatures::pipelineStatisticsQuery is not supported\n";
        }
        if (enabling.vertexPipelineStoresAndAtomics && !supported.vertexPipelineStoresAndAtomics) {
            ss << "VkPhysicalDeviceFeatures::vertexPipelineStoresAndAtomics is not supported\n";
        }
        if (enabling.fragmentStoresAndAtomics && !supported.fragmentStoresAndAtomics) {
            ss << "VkPhysicalDeviceFeatures::fragmentStoresAndAtomics is not supported\n";
        }
        if (enabling.shaderTessellationAndGeometryPointSize && !supported.shaderTessellationAndGeometryPointSize) {
            ss << "VkPhysicalDeviceFeatures::shaderTessellationAndGeometryPointSize is not supported\n";
        }
        if (enabling.shaderImageGatherExtended && !supported.shaderImageGatherExtended) {
            ss << "VkPhysicalDeviceFeatures::shaderImageGatherExtended is not supported\n";
        }
        if (enabling.shaderStorageImageExtendedFormats && !supported.shaderStorageImageExtendedFormats) {
            ss << "VkPhysicalDeviceFeatures::shaderStorageImageExtendedFormats is not supported\n";
        }
        if (enabling.shaderStorageImageMultisample && !supported.shaderStorageImageMultisample) {
            ss << "VkPhysicalDeviceFeatures::shaderStorageImageMultisample is not supported\n";
        }
        if (enabling.shaderStorageImageReadWithoutFormat && !supported.shaderStorageImageReadWithoutFormat) {
            ss << "VkPhysicalDeviceFeatures::shaderStorageImageReadWithoutFormat is not supported\n";
        }
        if (enabling.shaderStorageImageWriteWithoutFormat && !supported.shaderStorageImageWriteWithoutFormat) {
            ss << "VkPhysicalDeviceFeatures::shaderStorageImageWriteWithoutFormat is not supported\n";
        }
        if (enabling.shaderUniformBufferArrayDynamicIndexing && !supported.shaderUniformBufferArrayDynamicIndexing) {
            ss << "VkPhysicalDeviceFeatures::shaderUniformBufferArrayDynamicIndexing is not supported\n";
        }
        if (enabling.shaderSampledImageArrayDynamicIndexing && !supported.shaderSampledImageArrayDynamicIndexing) {
            ss << "VkPhysicalDeviceFeatures::shaderSampledImageArrayDynamicIndexing is not supported\n";
        }
        if (enabling.shaderStorageBufferArrayDynamicIndexing && !supported.shaderStorageBufferArrayDynamicIndexing) {
            ss << "VkPhysicalDeviceFeatures::shaderStorageBufferArrayDynamicIndexing is not supported\n";
        }
        if (enabling.shaderStorageImageArrayDynamicIndexing && !supported.shaderStorageImageArrayDynamicIndexing) {
            ss << "VkPhysicalDeviceFeatures::shaderStorageImageArrayDynamicIndexing is not supported\n";
        }
        if (enabling.shaderClipDistance && !supported.shaderClipDistance) {
            ss << "VkPhysicalDeviceFeatures::shaderClipDistance is not supported\n";
        }
        if (enabling.shaderCullDistance && !supported.shaderCullDistance) {
            ss << "VkPhysicalDeviceFeatures::shaderCullDistance is not supported\n";
        }
        if (enabling.shaderFloat64 && !supported.shaderFloat64) {
            ss << "VkPhysicalDeviceFeatures::shaderFloat64 is not supported\n";
        }
        if (enabling.shaderInt64 && !supported.shaderInt64) {
            ss << "VkPhysicalDeviceFeatures::shaderInt64 is not supported\n";
        }
        if (enabling.shaderInt16 && !supported.shaderInt16) {
            ss << "VkPhysicalDeviceFeatures::shaderInt16 is not supported\n";
        }
        if (enabling.shaderResourceResidency && !supported.shaderResourceResidency) {
            ss << "VkPhysicalDeviceFeatures::shaderResourceResidency is not supported\n";
        }
        if (enabling.shaderResourceMinLod && !supported.shaderResourceMinLod) {
            ss << "VkPhysicalDeviceFeatures::shaderResourceMinLod is not supported\n";
        }
        if (enabling.sparseBinding && !supported.sparseBinding) {
            ss << "VkPhysicalDeviceFeatures::sparseBinding is not supported\n";
        }
        if (enabling.sparseResidencyBuffer && !supported.sparseResidencyBuffer) {
            ss << "VkPhysicalDeviceFeatures::sparseResidencyBuffer is not supported\n";
        }
        if (enabling.sparseResidencyImage2D && !supported.sparseResidencyImage2D) {
            ss << "VkPhysicalDeviceFeatures::sparseResidencyImage2D is not supported\n";
        }
        if (enabling.sparseResidencyImage3D && !supported.sparseResidencyImage3D) {
            ss << "VkPhysicalDeviceFeatures::sparseResidencyImage3D is not supported\n";
        }
        if (enabling.sparseResidency2Samples && !supported.sparseResidency2Samples) {
            ss << "VkPhysicalDeviceFeatures::sparseResidency2Samples is not supported\n";
        }
        if (enabling.sparseResidency4Samples && !supported.sparseResidency4Samples) {
            ss << "VkPhysicalDeviceFeatures::sparseResidency4Samples is not supported\n";
        }
        if (enabling.sparseResidency8Samples && !supported.sparseResidency8Samples) {
            ss << "VkPhysicalDeviceFeatures::sparseResidency8Samples is not supported\n";
        }
        if (enabling.sparseResidency16Samples && !supported.sparseResidency16Samples) {
            ss << "VkPhysicalDeviceFeatures::sparseResidency16Samples is not supported\n";
        }
        if (enabling.sparseResidencyAliased && !supported.sparseResidencyAliased) {
            ss << "VkPhysicalDeviceFeatures::sparseResidencyAliased is not supported\n";
        }
        if (enabling.variableMultisampleRate && !supported.variableMultisampleRate) {
            ss << "VkPhysicalDeviceFeatures::variableMultisampleRate is not supported\n";
        }
        if (enabling.inheritedQueries && !supported.inheritedQueries) {
            ss << "VkPhysicalDeviceFeatures::inheritedQueries is not supported\n";
        }
    }
    VkPhysicalDeviceFeatures2 features_2 = vku::InitStructHelper();
    for (const VkBaseInStructure* current = static_cast<const VkBaseInStructure*>(create_info.pNext); current != nullptr;
         current = current->pNext) {
        switch (current->sType) {
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES: {
                VkPhysicalDevice16BitStorageFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevice16BitStorageFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDevice16BitStorageFeatures*>(current);
                if (enabling->storageBuffer16BitAccess && !supported.storageBuffer16BitAccess) {
                    ss << "VkPhysicalDevice16BitStorageFeatures::storageBuffer16BitAccess is not supported\n";
                }
                if (enabling->uniformAndStorageBuffer16BitAccess && !supported.uniformAndStorageBuffer16BitAccess) {
                    ss << "VkPhysicalDevice16BitStorageFeatures::uniformAndStorageBuffer16BitAccess is not supported\n";
                }
                if (enabling->storagePushConstant16 && !supported.storagePushConstant16) {
                    ss << "VkPhysicalDevice16BitStorageFeatures::storagePushConstant16 is not supported\n";
                }
                if (enabling->storageInputOutput16 && !supported.storageInputOutput16) {
                    ss << "VkPhysicalDevice16BitStorageFeatures::storageInputOutput16 is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT: {
                VkPhysicalDevice4444FormatsFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevice4444FormatsFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDevice4444FormatsFeaturesEXT*>(current);
                if (enabling->formatA4R4G4B4 && !supported.formatA4R4G4B4) {
                    ss << "VkPhysicalDevice4444FormatsFeaturesEXT::formatA4R4G4B4 is not supported\n";
                }
                if (enabling->formatA4B4G4R4 && !supported.formatA4B4G4R4) {
                    ss << "VkPhysicalDevice4444FormatsFeaturesEXT::formatA4B4G4R4 is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES: {
                VkPhysicalDevice8BitStorageFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevice8BitStorageFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDevice8BitStorageFeatures*>(current);
                if (enabling->storageBuffer8BitAccess && !supported.storageBuffer8BitAccess) {
                    ss << "VkPhysicalDevice8BitStorageFeatures::storageBuffer8BitAccess is not supported\n";
                }
                if (enabling->uniformAndStorageBuffer8BitAccess && !supported.uniformAndStorageBuffer8BitAccess) {
                    ss << "VkPhysicalDevice8BitStorageFeatures::uniformAndStorageBuffer8BitAccess is not supported\n";
                }
                if (enabling->storagePushConstant8 && !supported.storagePushConstant8) {
                    ss << "VkPhysicalDevice8BitStorageFeatures::storagePushConstant8 is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT: {
                VkPhysicalDeviceASTCDecodeFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceASTCDecodeFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceASTCDecodeFeaturesEXT*>(current);
                if (enabling->decodeModeSharedExponent && !supported.decodeModeSharedExponent) {
                    ss << "VkPhysicalDeviceASTCDecodeFeaturesEXT::decodeModeSharedExponent is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR: {
                VkPhysicalDeviceAccelerationStructureFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceAccelerationStructureFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(current);
                if (enabling->accelerationStructure && !supported.accelerationStructure) {
                    ss << "VkPhysicalDeviceAccelerationStructureFeaturesKHR::accelerationStructure is not supported\n";
                }
                if (enabling->accelerationStructureCaptureReplay && !supported.accelerationStructureCaptureReplay) {
                    ss << "VkPhysicalDeviceAccelerationStructureFeaturesKHR::accelerationStructureCaptureReplay is not supported\n";
                }
                if (enabling->accelerationStructureIndirectBuild && !supported.accelerationStructureIndirectBuild) {
                    ss << "VkPhysicalDeviceAccelerationStructureFeaturesKHR::accelerationStructureIndirectBuild is not supported\n";
                }
                if (enabling->accelerationStructureHostCommands && !supported.accelerationStructureHostCommands) {
                    ss << "VkPhysicalDeviceAccelerationStructureFeaturesKHR::accelerationStructureHostCommands is not supported\n";
                }
                if (enabling->descriptorBindingAccelerationStructureUpdateAfterBind &&
                    !supported.descriptorBindingAccelerationStructureUpdateAfterBind) {
                    ss << "VkPhysicalDeviceAccelerationStructureFeaturesKHR::descriptorBindingAccelerationStructureUpdateAfterBind "
                          "is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ADDRESS_BINDING_REPORT_FEATURES_EXT: {
                VkPhysicalDeviceAddressBindingReportFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceAddressBindingReportFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceAddressBindingReportFeaturesEXT*>(current);
                if (enabling->reportAddressBinding && !supported.reportAddressBinding) {
                    ss << "VkPhysicalDeviceAddressBindingReportFeaturesEXT::reportAddressBinding is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_AMIGO_PROFILING_FEATURES_SEC: {
                VkPhysicalDeviceAmigoProfilingFeaturesSEC supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceAmigoProfilingFeaturesSEC* enabling =
                    reinterpret_cast<const VkPhysicalDeviceAmigoProfilingFeaturesSEC*>(current);
                if (enabling->amigoProfiling && !supported.amigoProfiling) {
                    ss << "VkPhysicalDeviceAmigoProfilingFeaturesSEC::amigoProfiling is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ANTI_LAG_FEATURES_AMD: {
                VkPhysicalDeviceAntiLagFeaturesAMD supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceAntiLagFeaturesAMD* enabling =
                    reinterpret_cast<const VkPhysicalDeviceAntiLagFeaturesAMD*>(current);
                if (enabling->antiLag && !supported.antiLag) {
                    ss << "VkPhysicalDeviceAntiLagFeaturesAMD::antiLag is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_FEATURES_EXT: {
                VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT*>(current);
                if (enabling->attachmentFeedbackLoopDynamicState && !supported.attachmentFeedbackLoopDynamicState) {
                    ss << "VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT::attachmentFeedbackLoopDynamicState is "
                          "not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT: {
                VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT*>(current);
                if (enabling->attachmentFeedbackLoopLayout && !supported.attachmentFeedbackLoopLayout) {
                    ss << "VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT::attachmentFeedbackLoopLayout is not "
                          "supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT: {
                VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(current);
                if (enabling->advancedBlendCoherentOperations && !supported.advancedBlendCoherentOperations) {
                    ss << "VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT::advancedBlendCoherentOperations is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT: {
                VkPhysicalDeviceBorderColorSwizzleFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceBorderColorSwizzleFeaturesEXT*>(current);
                if (enabling->borderColorSwizzle && !supported.borderColorSwizzle) {
                    ss << "VkPhysicalDeviceBorderColorSwizzleFeaturesEXT::borderColorSwizzle is not supported\n";
                }
                if (enabling->borderColorSwizzleFromImage && !supported.borderColorSwizzleFromImage) {
                    ss << "VkPhysicalDeviceBorderColorSwizzleFeaturesEXT::borderColorSwizzleFromImage is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES: {
                VkPhysicalDeviceBufferDeviceAddressFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceBufferDeviceAddressFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeatures*>(current);
                if (enabling->bufferDeviceAddress && !supported.bufferDeviceAddress) {
                    ss << "VkPhysicalDeviceBufferDeviceAddressFeatures::bufferDeviceAddress is not supported\n";
                }
                if (enabling->bufferDeviceAddressCaptureReplay && !supported.bufferDeviceAddressCaptureReplay) {
                    ss << "VkPhysicalDeviceBufferDeviceAddressFeatures::bufferDeviceAddressCaptureReplay is not supported\n";
                }
                if (enabling->bufferDeviceAddressMultiDevice && !supported.bufferDeviceAddressMultiDevice) {
                    ss << "VkPhysicalDeviceBufferDeviceAddressFeatures::bufferDeviceAddressMultiDevice is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT: {
                VkPhysicalDeviceBufferDeviceAddressFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(current);
                if (enabling->bufferDeviceAddress && !supported.bufferDeviceAddress) {
                    ss << "VkPhysicalDeviceBufferDeviceAddressFeaturesEXT::bufferDeviceAddress is not supported\n";
                }
                if (enabling->bufferDeviceAddressCaptureReplay && !supported.bufferDeviceAddressCaptureReplay) {
                    ss << "VkPhysicalDeviceBufferDeviceAddressFeaturesEXT::bufferDeviceAddressCaptureReplay is not supported\n";
                }
                if (enabling->bufferDeviceAddressMultiDevice && !supported.bufferDeviceAddressMultiDevice) {
                    ss << "VkPhysicalDeviceBufferDeviceAddressFeaturesEXT::bufferDeviceAddressMultiDevice is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_ACCELERATION_STRUCTURE_FEATURES_NV: {
                VkPhysicalDeviceClusterAccelerationStructureFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceClusterAccelerationStructureFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceClusterAccelerationStructureFeaturesNV*>(current);
                if (enabling->clusterAccelerationStructure && !supported.clusterAccelerationStructure) {
                    ss << "VkPhysicalDeviceClusterAccelerationStructureFeaturesNV::clusterAccelerationStructure is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_FEATURES_HUAWEI: {
                VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI* enabling =
                    reinterpret_cast<const VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI*>(current);
                if (enabling->clustercullingShader && !supported.clustercullingShader) {
                    ss << "VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI::clustercullingShader is not supported\n";
                }
                if (enabling->multiviewClusterCullingShader && !supported.multiviewClusterCullingShader) {
                    ss << "VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI::multiviewClusterCullingShader is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD: {
                VkPhysicalDeviceCoherentMemoryFeaturesAMD supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceCoherentMemoryFeaturesAMD* enabling =
                    reinterpret_cast<const VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(current);
                if (enabling->deviceCoherentMemory && !supported.deviceCoherentMemory) {
                    ss << "VkPhysicalDeviceCoherentMemoryFeaturesAMD::deviceCoherentMemory is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT: {
                VkPhysicalDeviceColorWriteEnableFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceColorWriteEnableFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceColorWriteEnableFeaturesEXT*>(current);
                if (enabling->colorWriteEnable && !supported.colorWriteEnable) {
                    ss << "VkPhysicalDeviceColorWriteEnableFeaturesEXT::colorWriteEnable is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMMAND_BUFFER_INHERITANCE_FEATURES_NV: {
                VkPhysicalDeviceCommandBufferInheritanceFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceCommandBufferInheritanceFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceCommandBufferInheritanceFeaturesNV*>(current);
                if (enabling->commandBufferInheritance && !supported.commandBufferInheritance) {
                    ss << "VkPhysicalDeviceCommandBufferInheritanceFeaturesNV::commandBufferInheritance is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_OCCUPANCY_PRIORITY_FEATURES_NV: {
                VkPhysicalDeviceComputeOccupancyPriorityFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceComputeOccupancyPriorityFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceComputeOccupancyPriorityFeaturesNV*>(current);
                if (enabling->computeOccupancyPriority && !supported.computeOccupancyPriority) {
                    ss << "VkPhysicalDeviceComputeOccupancyPriorityFeaturesNV::computeOccupancyPriority is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_KHR: {
                VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR*>(current);
                if (enabling->computeDerivativeGroupQuads && !supported.computeDerivativeGroupQuads) {
                    ss << "VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR::computeDerivativeGroupQuads is not supported\n";
                }
                if (enabling->computeDerivativeGroupLinear && !supported.computeDerivativeGroupLinear) {
                    ss << "VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR::computeDerivativeGroupLinear is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT: {
                VkPhysicalDeviceConditionalRenderingFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceConditionalRenderingFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(current);
                if (enabling->conditionalRendering && !supported.conditionalRendering) {
                    ss << "VkPhysicalDeviceConditionalRenderingFeaturesEXT::conditionalRendering is not supported\n";
                }
                if (enabling->inheritedConditionalRendering && !supported.inheritedConditionalRendering) {
                    ss << "VkPhysicalDeviceConditionalRenderingFeaturesEXT::inheritedConditionalRendering is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_2_FEATURES_NV: {
                VkPhysicalDeviceCooperativeMatrix2FeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceCooperativeMatrix2FeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceCooperativeMatrix2FeaturesNV*>(current);
                if (enabling->cooperativeMatrixWorkgroupScope && !supported.cooperativeMatrixWorkgroupScope) {
                    ss << "VkPhysicalDeviceCooperativeMatrix2FeaturesNV::cooperativeMatrixWorkgroupScope is not supported\n";
                }
                if (enabling->cooperativeMatrixFlexibleDimensions && !supported.cooperativeMatrixFlexibleDimensions) {
                    ss << "VkPhysicalDeviceCooperativeMatrix2FeaturesNV::cooperativeMatrixFlexibleDimensions is not supported\n";
                }
                if (enabling->cooperativeMatrixReductions && !supported.cooperativeMatrixReductions) {
                    ss << "VkPhysicalDeviceCooperativeMatrix2FeaturesNV::cooperativeMatrixReductions is not supported\n";
                }
                if (enabling->cooperativeMatrixConversions && !supported.cooperativeMatrixConversions) {
                    ss << "VkPhysicalDeviceCooperativeMatrix2FeaturesNV::cooperativeMatrixConversions is not supported\n";
                }
                if (enabling->cooperativeMatrixPerElementOperations && !supported.cooperativeMatrixPerElementOperations) {
                    ss << "VkPhysicalDeviceCooperativeMatrix2FeaturesNV::cooperativeMatrixPerElementOperations is not supported\n";
                }
                if (enabling->cooperativeMatrixTensorAddressing && !supported.cooperativeMatrixTensorAddressing) {
                    ss << "VkPhysicalDeviceCooperativeMatrix2FeaturesNV::cooperativeMatrixTensorAddressing is not supported\n";
                }
                if (enabling->cooperativeMatrixBlockLoads && !supported.cooperativeMatrixBlockLoads) {
                    ss << "VkPhysicalDeviceCooperativeMatrix2FeaturesNV::cooperativeMatrixBlockLoads is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_CONVERSION_FEATURES_QCOM: {
                VkPhysicalDeviceCooperativeMatrixConversionFeaturesQCOM supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceCooperativeMatrixConversionFeaturesQCOM* enabling =
                    reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixConversionFeaturesQCOM*>(current);
                if (enabling->cooperativeMatrixConversion && !supported.cooperativeMatrixConversion) {
                    ss << "VkPhysicalDeviceCooperativeMatrixConversionFeaturesQCOM::cooperativeMatrixConversion is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR: {
                VkPhysicalDeviceCooperativeMatrixFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceCooperativeMatrixFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixFeaturesKHR*>(current);
                if (enabling->cooperativeMatrix && !supported.cooperativeMatrix) {
                    ss << "VkPhysicalDeviceCooperativeMatrixFeaturesKHR::cooperativeMatrix is not supported\n";
                }
                if (enabling->cooperativeMatrixRobustBufferAccess && !supported.cooperativeMatrixRobustBufferAccess) {
                    ss << "VkPhysicalDeviceCooperativeMatrixFeaturesKHR::cooperativeMatrixRobustBufferAccess is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV: {
                VkPhysicalDeviceCooperativeMatrixFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceCooperativeMatrixFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(current);
                if (enabling->cooperativeMatrix && !supported.cooperativeMatrix) {
                    ss << "VkPhysicalDeviceCooperativeMatrixFeaturesNV::cooperativeMatrix is not supported\n";
                }
                if (enabling->cooperativeMatrixRobustBufferAccess && !supported.cooperativeMatrixRobustBufferAccess) {
                    ss << "VkPhysicalDeviceCooperativeMatrixFeaturesNV::cooperativeMatrixRobustBufferAccess is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_VECTOR_FEATURES_NV: {
                VkPhysicalDeviceCooperativeVectorFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceCooperativeVectorFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceCooperativeVectorFeaturesNV*>(current);
                if (enabling->cooperativeVector && !supported.cooperativeVector) {
                    ss << "VkPhysicalDeviceCooperativeVectorFeaturesNV::cooperativeVector is not supported\n";
                }
                if (enabling->cooperativeVectorTraining && !supported.cooperativeVectorTraining) {
                    ss << "VkPhysicalDeviceCooperativeVectorFeaturesNV::cooperativeVectorTraining is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_FEATURES_KHR: {
                VkPhysicalDeviceCopyMemoryIndirectFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceCopyMemoryIndirectFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceCopyMemoryIndirectFeaturesKHR*>(current);
                if (enabling->indirectMemoryCopy && !supported.indirectMemoryCopy) {
                    ss << "VkPhysicalDeviceCopyMemoryIndirectFeaturesKHR::indirectMemoryCopy is not supported\n";
                }
                if (enabling->indirectMemoryToImageCopy && !supported.indirectMemoryToImageCopy) {
                    ss << "VkPhysicalDeviceCopyMemoryIndirectFeaturesKHR::indirectMemoryToImageCopy is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_FEATURES_NV: {
                VkPhysicalDeviceCopyMemoryIndirectFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceCopyMemoryIndirectFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceCopyMemoryIndirectFeaturesNV*>(current);
                if (enabling->indirectCopy && !supported.indirectCopy) {
                    ss << "VkPhysicalDeviceCopyMemoryIndirectFeaturesNV::indirectCopy is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV: {
                VkPhysicalDeviceCornerSampledImageFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceCornerSampledImageFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceCornerSampledImageFeaturesNV*>(current);
                if (enabling->cornerSampledImage && !supported.cornerSampledImage) {
                    ss << "VkPhysicalDeviceCornerSampledImageFeaturesNV::cornerSampledImage is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV: {
                VkPhysicalDeviceCoverageReductionModeFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceCoverageReductionModeFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(current);
                if (enabling->coverageReductionMode && !supported.coverageReductionMode) {
                    ss << "VkPhysicalDeviceCoverageReductionModeFeaturesNV::coverageReductionMode is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUBIC_CLAMP_FEATURES_QCOM: {
                VkPhysicalDeviceCubicClampFeaturesQCOM supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceCubicClampFeaturesQCOM* enabling =
                    reinterpret_cast<const VkPhysicalDeviceCubicClampFeaturesQCOM*>(current);
                if (enabling->cubicRangeClamp && !supported.cubicRangeClamp) {
                    ss << "VkPhysicalDeviceCubicClampFeaturesQCOM::cubicRangeClamp is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUBIC_WEIGHTS_FEATURES_QCOM: {
                VkPhysicalDeviceCubicWeightsFeaturesQCOM supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceCubicWeightsFeaturesQCOM* enabling =
                    reinterpret_cast<const VkPhysicalDeviceCubicWeightsFeaturesQCOM*>(current);
                if (enabling->selectableCubicWeights && !supported.selectableCubicWeights) {
                    ss << "VkPhysicalDeviceCubicWeightsFeaturesQCOM::selectableCubicWeights is not supported\n";
                }
                break;
            }
#ifdef VK_ENABLE_BETA_EXTENSIONS
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUDA_KERNEL_LAUNCH_FEATURES_NV: {
                VkPhysicalDeviceCudaKernelLaunchFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceCudaKernelLaunchFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceCudaKernelLaunchFeaturesNV*>(current);
                if (enabling->cudaKernelLaunchFeatures && !supported.cudaKernelLaunchFeatures) {
                    ss << "VkPhysicalDeviceCudaKernelLaunchFeaturesNV::cudaKernelLaunchFeatures is not supported\n";
                }
                break;
            }
#endif  // VK_ENABLE_BETA_EXTENSIONS
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT: {
                VkPhysicalDeviceCustomBorderColorFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceCustomBorderColorFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(current);
                if (enabling->customBorderColors && !supported.customBorderColors) {
                    ss << "VkPhysicalDeviceCustomBorderColorFeaturesEXT::customBorderColors is not supported\n";
                }
                if (enabling->customBorderColorWithoutFormat && !supported.customBorderColorWithoutFormat) {
                    ss << "VkPhysicalDeviceCustomBorderColorFeaturesEXT::customBorderColorWithoutFormat is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_RESOLVE_FEATURES_EXT: {
                VkPhysicalDeviceCustomResolveFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceCustomResolveFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceCustomResolveFeaturesEXT*>(current);
                if (enabling->customResolve && !supported.customResolve) {
                    ss << "VkPhysicalDeviceCustomResolveFeaturesEXT::customResolve is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DATA_GRAPH_FEATURES_ARM: {
                VkPhysicalDeviceDataGraphFeaturesARM supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDataGraphFeaturesARM* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDataGraphFeaturesARM*>(current);
                if (enabling->dataGraph && !supported.dataGraph) {
                    ss << "VkPhysicalDeviceDataGraphFeaturesARM::dataGraph is not supported\n";
                }
                if (enabling->dataGraphUpdateAfterBind && !supported.dataGraphUpdateAfterBind) {
                    ss << "VkPhysicalDeviceDataGraphFeaturesARM::dataGraphUpdateAfterBind is not supported\n";
                }
                if (enabling->dataGraphSpecializationConstants && !supported.dataGraphSpecializationConstants) {
                    ss << "VkPhysicalDeviceDataGraphFeaturesARM::dataGraphSpecializationConstants is not supported\n";
                }
                if (enabling->dataGraphDescriptorBuffer && !supported.dataGraphDescriptorBuffer) {
                    ss << "VkPhysicalDeviceDataGraphFeaturesARM::dataGraphDescriptorBuffer is not supported\n";
                }
                if (enabling->dataGraphShaderModule && !supported.dataGraphShaderModule) {
                    ss << "VkPhysicalDeviceDataGraphFeaturesARM::dataGraphShaderModule is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DATA_GRAPH_MODEL_FEATURES_QCOM: {
                VkPhysicalDeviceDataGraphModelFeaturesQCOM supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDataGraphModelFeaturesQCOM* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDataGraphModelFeaturesQCOM*>(current);
                if (enabling->dataGraphModel && !supported.dataGraphModel) {
                    ss << "VkPhysicalDeviceDataGraphModelFeaturesQCOM::dataGraphModel is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DATA_GRAPH_NEURAL_ACCELERATOR_STATISTICS_FEATURES_ARM: {
                VkPhysicalDeviceDataGraphNeuralAcceleratorStatisticsFeaturesARM supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDataGraphNeuralAcceleratorStatisticsFeaturesARM* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDataGraphNeuralAcceleratorStatisticsFeaturesARM*>(current);
                if (enabling->dataGraphNeuralAcceleratorStatistics && !supported.dataGraphNeuralAcceleratorStatistics) {
                    ss << "VkPhysicalDeviceDataGraphNeuralAcceleratorStatisticsFeaturesARM::dataGraphNeuralAcceleratorStatistics "
                          "is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DATA_GRAPH_OPTICAL_FLOW_FEATURES_ARM: {
                VkPhysicalDeviceDataGraphOpticalFlowFeaturesARM supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDataGraphOpticalFlowFeaturesARM* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDataGraphOpticalFlowFeaturesARM*>(current);
                if (enabling->dataGraphOpticalFlow && !supported.dataGraphOpticalFlow) {
                    ss << "VkPhysicalDeviceDataGraphOpticalFlowFeaturesARM::dataGraphOpticalFlow is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV: {
                VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(current);
                if (enabling->dedicatedAllocationImageAliasing && !supported.dedicatedAllocationImageAliasing) {
                    ss << "VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV::dedicatedAllocationImageAliasing is not "
                          "supported\n";
                }
                break;
            }
#ifdef VK_ENABLE_BETA_EXTENSIONS
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DENSE_GEOMETRY_FORMAT_FEATURES_AMDX: {
                VkPhysicalDeviceDenseGeometryFormatFeaturesAMDX supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDenseGeometryFormatFeaturesAMDX* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDenseGeometryFormatFeaturesAMDX*>(current);
                if (enabling->denseGeometryFormat && !supported.denseGeometryFormat) {
                    ss << "VkPhysicalDeviceDenseGeometryFormatFeaturesAMDX::denseGeometryFormat is not supported\n";
                }
                break;
            }
#endif  // VK_ENABLE_BETA_EXTENSIONS
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_BIAS_CONTROL_FEATURES_EXT: {
                VkPhysicalDeviceDepthBiasControlFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDepthBiasControlFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDepthBiasControlFeaturesEXT*>(current);
                if (enabling->depthBiasControl && !supported.depthBiasControl) {
                    ss << "VkPhysicalDeviceDepthBiasControlFeaturesEXT::depthBiasControl is not supported\n";
                }
                if (enabling->leastRepresentableValueForceUnormRepresentation &&
                    !supported.leastRepresentableValueForceUnormRepresentation) {
                    ss << "VkPhysicalDeviceDepthBiasControlFeaturesEXT::leastRepresentableValueForceUnormRepresentation is not "
                          "supported\n";
                }
                if (enabling->floatRepresentation && !supported.floatRepresentation) {
                    ss << "VkPhysicalDeviceDepthBiasControlFeaturesEXT::floatRepresentation is not supported\n";
                }
                if (enabling->depthBiasExact && !supported.depthBiasExact) {
                    ss << "VkPhysicalDeviceDepthBiasControlFeaturesEXT::depthBiasExact is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_CONTROL_FEATURES_EXT: {
                VkPhysicalDeviceDepthClampControlFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDepthClampControlFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDepthClampControlFeaturesEXT*>(current);
                if (enabling->depthClampControl && !supported.depthClampControl) {
                    ss << "VkPhysicalDeviceDepthClampControlFeaturesEXT::depthClampControl is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_KHR: {
                VkPhysicalDeviceDepthClampZeroOneFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDepthClampZeroOneFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDepthClampZeroOneFeaturesKHR*>(current);
                if (enabling->depthClampZeroOne && !supported.depthClampZeroOne) {
                    ss << "VkPhysicalDeviceDepthClampZeroOneFeaturesKHR::depthClampZeroOne is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT: {
                VkPhysicalDeviceDepthClipControlFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDepthClipControlFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDepthClipControlFeaturesEXT*>(current);
                if (enabling->depthClipControl && !supported.depthClipControl) {
                    ss << "VkPhysicalDeviceDepthClipControlFeaturesEXT::depthClipControl is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT: {
                VkPhysicalDeviceDepthClipEnableFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDepthClipEnableFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(current);
                if (enabling->depthClipEnable && !supported.depthClipEnable) {
                    ss << "VkPhysicalDeviceDepthClipEnableFeaturesEXT::depthClipEnable is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT: {
                VkPhysicalDeviceDescriptorBufferFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDescriptorBufferFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDescriptorBufferFeaturesEXT*>(current);
                if (enabling->descriptorBuffer && !supported.descriptorBuffer) {
                    ss << "VkPhysicalDeviceDescriptorBufferFeaturesEXT::descriptorBuffer is not supported\n";
                }
                if (enabling->descriptorBufferCaptureReplay && !supported.descriptorBufferCaptureReplay) {
                    ss << "VkPhysicalDeviceDescriptorBufferFeaturesEXT::descriptorBufferCaptureReplay is not supported\n";
                }
                if (enabling->descriptorBufferImageLayoutIgnored && !supported.descriptorBufferImageLayoutIgnored) {
                    ss << "VkPhysicalDeviceDescriptorBufferFeaturesEXT::descriptorBufferImageLayoutIgnored is not supported\n";
                }
                if (enabling->descriptorBufferPushDescriptors && !supported.descriptorBufferPushDescriptors) {
                    ss << "VkPhysicalDeviceDescriptorBufferFeaturesEXT::descriptorBufferPushDescriptors is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_TENSOR_FEATURES_ARM: {
                VkPhysicalDeviceDescriptorBufferTensorFeaturesARM supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDescriptorBufferTensorFeaturesARM* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDescriptorBufferTensorFeaturesARM*>(current);
                if (enabling->descriptorBufferTensorDescriptors && !supported.descriptorBufferTensorDescriptors) {
                    ss << "VkPhysicalDeviceDescriptorBufferTensorFeaturesARM::descriptorBufferTensorDescriptors is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_HEAP_FEATURES_EXT: {
                VkPhysicalDeviceDescriptorHeapFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDescriptorHeapFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDescriptorHeapFeaturesEXT*>(current);
                if (enabling->descriptorHeap && !supported.descriptorHeap) {
                    ss << "VkPhysicalDeviceDescriptorHeapFeaturesEXT::descriptorHeap is not supported\n";
                }
                if (enabling->descriptorHeapCaptureReplay && !supported.descriptorHeapCaptureReplay) {
                    ss << "VkPhysicalDeviceDescriptorHeapFeaturesEXT::descriptorHeapCaptureReplay is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES: {
                VkPhysicalDeviceDescriptorIndexingFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDescriptorIndexingFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingFeatures*>(current);
                if (enabling->shaderInputAttachmentArrayDynamicIndexing && !supported.shaderInputAttachmentArrayDynamicIndexing) {
                    ss << "VkPhysicalDeviceDescriptorIndexingFeatures::shaderInputAttachmentArrayDynamicIndexing is not "
                          "supported\n";
                }
                if (enabling->shaderUniformTexelBufferArrayDynamicIndexing &&
                    !supported.shaderUniformTexelBufferArrayDynamicIndexing) {
                    ss << "VkPhysicalDeviceDescriptorIndexingFeatures::shaderUniformTexelBufferArrayDynamicIndexing is not "
                          "supported\n";
                }
                if (enabling->shaderStorageTexelBufferArrayDynamicIndexing &&
                    !supported.shaderStorageTexelBufferArrayDynamicIndexing) {
                    ss << "VkPhysicalDeviceDescriptorIndexingFeatures::shaderStorageTexelBufferArrayDynamicIndexing is not "
                          "supported\n";
                }
                if (enabling->shaderUniformBufferArrayNonUniformIndexing && !supported.shaderUniformBufferArrayNonUniformIndexing) {
                    ss << "VkPhysicalDeviceDescriptorIndexingFeatures::shaderUniformBufferArrayNonUniformIndexing is not "
                          "supported\n";
                }
                if (enabling->shaderSampledImageArrayNonUniformIndexing && !supported.shaderSampledImageArrayNonUniformIndexing) {
                    ss << "VkPhysicalDeviceDescriptorIndexingFeatures::shaderSampledImageArrayNonUniformIndexing is not "
                          "supported\n";
                }
                if (enabling->shaderStorageBufferArrayNonUniformIndexing && !supported.shaderStorageBufferArrayNonUniformIndexing) {
                    ss << "VkPhysicalDeviceDescriptorIndexingFeatures::shaderStorageBufferArrayNonUniformIndexing is not "
                          "supported\n";
                }
                if (enabling->shaderStorageImageArrayNonUniformIndexing && !supported.shaderStorageImageArrayNonUniformIndexing) {
                    ss << "VkPhysicalDeviceDescriptorIndexingFeatures::shaderStorageImageArrayNonUniformIndexing is not "
                          "supported\n";
                }
                if (enabling->shaderInputAttachmentArrayNonUniformIndexing &&
                    !supported.shaderInputAttachmentArrayNonUniformIndexing) {
                    ss << "VkPhysicalDeviceDescriptorIndexingFeatures::shaderInputAttachmentArrayNonUniformIndexing is not "
                          "supported\n";
                }
                if (enabling->shaderUniformTexelBufferArrayNonUniformIndexing &&
                    !supported.shaderUniformTexelBufferArrayNonUniformIndexing) {
                    ss << "VkPhysicalDeviceDescriptorIndexingFeatures::shaderUniformTexelBufferArrayNonUniformIndexing is not "
                          "supported\n";
                }
                if (enabling->shaderStorageTexelBufferArrayNonUniformIndexing &&
                    !supported.shaderStorageTexelBufferArrayNonUniformIndexing) {
                    ss << "VkPhysicalDeviceDescriptorIndexingFeatures::shaderStorageTexelBufferArrayNonUniformIndexing is not "
                          "supported\n";
                }
                if (enabling->descriptorBindingUniformBufferUpdateAfterBind &&
                    !supported.descriptorBindingUniformBufferUpdateAfterBind) {
                    ss << "VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingUniformBufferUpdateAfterBind is not "
                          "supported\n";
                }
                if (enabling->descriptorBindingSampledImageUpdateAfterBind &&
                    !supported.descriptorBindingSampledImageUpdateAfterBind) {
                    ss << "VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingSampledImageUpdateAfterBind is not "
                          "supported\n";
                }
                if (enabling->descriptorBindingStorageImageUpdateAfterBind &&
                    !supported.descriptorBindingStorageImageUpdateAfterBind) {
                    ss << "VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingStorageImageUpdateAfterBind is not "
                          "supported\n";
                }
                if (enabling->descriptorBindingStorageBufferUpdateAfterBind &&
                    !supported.descriptorBindingStorageBufferUpdateAfterBind) {
                    ss << "VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingStorageBufferUpdateAfterBind is not "
                          "supported\n";
                }
                if (enabling->descriptorBindingUniformTexelBufferUpdateAfterBind &&
                    !supported.descriptorBindingUniformTexelBufferUpdateAfterBind) {
                    ss << "VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingUniformTexelBufferUpdateAfterBind is not "
                          "supported\n";
                }
                if (enabling->descriptorBindingStorageTexelBufferUpdateAfterBind &&
                    !supported.descriptorBindingStorageTexelBufferUpdateAfterBind) {
                    ss << "VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingStorageTexelBufferUpdateAfterBind is not "
                          "supported\n";
                }
                if (enabling->descriptorBindingUpdateUnusedWhilePending && !supported.descriptorBindingUpdateUnusedWhilePending) {
                    ss << "VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingUpdateUnusedWhilePending is not "
                          "supported\n";
                }
                if (enabling->descriptorBindingPartiallyBound && !supported.descriptorBindingPartiallyBound) {
                    ss << "VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingPartiallyBound is not supported\n";
                }
                if (enabling->descriptorBindingVariableDescriptorCount && !supported.descriptorBindingVariableDescriptorCount) {
                    ss << "VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingVariableDescriptorCount is not supported\n";
                }
                if (enabling->runtimeDescriptorArray && !supported.runtimeDescriptorArray) {
                    ss << "VkPhysicalDeviceDescriptorIndexingFeatures::runtimeDescriptorArray is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_POOL_OVERALLOCATION_FEATURES_NV: {
                VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV*>(current);
                if (enabling->descriptorPoolOverallocation && !supported.descriptorPoolOverallocation) {
                    ss << "VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV::descriptorPoolOverallocation is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_SET_HOST_MAPPING_FEATURES_VALVE: {
                VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE*>(current);
                if (enabling->descriptorSetHostMapping && !supported.descriptorSetHostMapping) {
                    ss << "VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE::descriptorSetHostMapping is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_ADDRESS_COMMANDS_FEATURES_KHR: {
                VkPhysicalDeviceDeviceAddressCommandsFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDeviceAddressCommandsFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDeviceAddressCommandsFeaturesKHR*>(current);
                if (enabling->deviceAddressCommands && !supported.deviceAddressCommands) {
                    ss << "VkPhysicalDeviceDeviceAddressCommandsFeaturesKHR::deviceAddressCommands is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_COMPUTE_FEATURES_NV: {
                VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV*>(current);
                if (enabling->deviceGeneratedCompute && !supported.deviceGeneratedCompute) {
                    ss << "VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV::deviceGeneratedCompute is not supported\n";
                }
                if (enabling->deviceGeneratedComputePipelines && !supported.deviceGeneratedComputePipelines) {
                    ss << "VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV::deviceGeneratedComputePipelines is not "
                          "supported\n";
                }
                if (enabling->deviceGeneratedComputeCaptureReplay && !supported.deviceGeneratedComputeCaptureReplay) {
                    ss << "VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV::deviceGeneratedComputeCaptureReplay is not "
                          "supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_EXT: {
                VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT*>(current);
                if (enabling->deviceGeneratedCommands && !supported.deviceGeneratedCommands) {
                    ss << "VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT::deviceGeneratedCommands is not supported\n";
                }
                if (enabling->dynamicGeneratedPipelineLayout && !supported.dynamicGeneratedPipelineLayout) {
                    ss << "VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT::dynamicGeneratedPipelineLayout is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV: {
                VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(current);
                if (enabling->deviceGeneratedCommands && !supported.deviceGeneratedCommands) {
                    ss << "VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::deviceGeneratedCommands is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT: {
                VkPhysicalDeviceDeviceMemoryReportFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(current);
                if (enabling->deviceMemoryReport && !supported.deviceMemoryReport) {
                    ss << "VkPhysicalDeviceDeviceMemoryReportFeaturesEXT::deviceMemoryReport is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV: {
                VkPhysicalDeviceDiagnosticsConfigFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDiagnosticsConfigFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(current);
                if (enabling->diagnosticsConfig && !supported.diagnosticsConfig) {
                    ss << "VkPhysicalDeviceDiagnosticsConfigFeaturesNV::diagnosticsConfig is not supported\n";
                }
                break;
            }
#ifdef VK_ENABLE_BETA_EXTENSIONS
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISPLACEMENT_MICROMAP_FEATURES_NV: {
                VkPhysicalDeviceDisplacementMicromapFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDisplacementMicromapFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDisplacementMicromapFeaturesNV*>(current);
                if (enabling->displacementMicromap && !supported.displacementMicromap) {
                    ss << "VkPhysicalDeviceDisplacementMicromapFeaturesNV::displacementMicromap is not supported\n";
                }
                break;
            }
#endif  // VK_ENABLE_BETA_EXTENSIONS
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES: {
                VkPhysicalDeviceDynamicRenderingFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDynamicRenderingFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDynamicRenderingFeatures*>(current);
                if (enabling->dynamicRendering && !supported.dynamicRendering) {
                    ss << "VkPhysicalDeviceDynamicRenderingFeatures::dynamicRendering is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_LOCAL_READ_FEATURES: {
                VkPhysicalDeviceDynamicRenderingLocalReadFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDynamicRenderingLocalReadFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDynamicRenderingLocalReadFeatures*>(current);
                if (enabling->dynamicRenderingLocalRead && !supported.dynamicRenderingLocalRead) {
                    ss << "VkPhysicalDeviceDynamicRenderingLocalReadFeatures::dynamicRenderingLocalRead is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_FEATURES_EXT: {
                VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT*>(current);
                if (enabling->dynamicRenderingUnusedAttachments && !supported.dynamicRenderingUnusedAttachments) {
                    ss << "VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT::dynamicRenderingUnusedAttachments is not "
                          "supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV: {
                VkPhysicalDeviceExclusiveScissorFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceExclusiveScissorFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceExclusiveScissorFeaturesNV*>(current);
                if (enabling->exclusiveScissor && !supported.exclusiveScissor) {
                    ss << "VkPhysicalDeviceExclusiveScissorFeaturesNV::exclusiveScissor is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT: {
                VkPhysicalDeviceExtendedDynamicState2FeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT*>(current);
                if (enabling->extendedDynamicState2 && !supported.extendedDynamicState2) {
                    ss << "VkPhysicalDeviceExtendedDynamicState2FeaturesEXT::extendedDynamicState2 is not supported\n";
                }
                if (enabling->extendedDynamicState2LogicOp && !supported.extendedDynamicState2LogicOp) {
                    ss << "VkPhysicalDeviceExtendedDynamicState2FeaturesEXT::extendedDynamicState2LogicOp is not supported\n";
                }
                if (enabling->extendedDynamicState2PatchControlPoints && !supported.extendedDynamicState2PatchControlPoints) {
                    ss << "VkPhysicalDeviceExtendedDynamicState2FeaturesEXT::extendedDynamicState2PatchControlPoints is not "
                          "supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT: {
                VkPhysicalDeviceExtendedDynamicState3FeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceExtendedDynamicState3FeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceExtendedDynamicState3FeaturesEXT*>(current);
                if (enabling->extendedDynamicState3TessellationDomainOrigin &&
                    !supported.extendedDynamicState3TessellationDomainOrigin) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3TessellationDomainOrigin is not "
                          "supported\n";
                }
                if (enabling->extendedDynamicState3DepthClampEnable && !supported.extendedDynamicState3DepthClampEnable) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3DepthClampEnable is not "
                          "supported\n";
                }
                if (enabling->extendedDynamicState3PolygonMode && !supported.extendedDynamicState3PolygonMode) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3PolygonMode is not supported\n";
                }
                if (enabling->extendedDynamicState3RasterizationSamples && !supported.extendedDynamicState3RasterizationSamples) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3RasterizationSamples is not "
                          "supported\n";
                }
                if (enabling->extendedDynamicState3SampleMask && !supported.extendedDynamicState3SampleMask) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3SampleMask is not supported\n";
                }
                if (enabling->extendedDynamicState3AlphaToCoverageEnable && !supported.extendedDynamicState3AlphaToCoverageEnable) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3AlphaToCoverageEnable is not "
                          "supported\n";
                }
                if (enabling->extendedDynamicState3AlphaToOneEnable && !supported.extendedDynamicState3AlphaToOneEnable) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3AlphaToOneEnable is not "
                          "supported\n";
                }
                if (enabling->extendedDynamicState3LogicOpEnable && !supported.extendedDynamicState3LogicOpEnable) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3LogicOpEnable is not supported\n";
                }
                if (enabling->extendedDynamicState3ColorBlendEnable && !supported.extendedDynamicState3ColorBlendEnable) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3ColorBlendEnable is not "
                          "supported\n";
                }
                if (enabling->extendedDynamicState3ColorBlendEquation && !supported.extendedDynamicState3ColorBlendEquation) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3ColorBlendEquation is not "
                          "supported\n";
                }
                if (enabling->extendedDynamicState3ColorWriteMask && !supported.extendedDynamicState3ColorWriteMask) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3ColorWriteMask is not "
                          "supported\n";
                }
                if (enabling->extendedDynamicState3RasterizationStream && !supported.extendedDynamicState3RasterizationStream) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3RasterizationStream is not "
                          "supported\n";
                }
                if (enabling->extendedDynamicState3ConservativeRasterizationMode &&
                    !supported.extendedDynamicState3ConservativeRasterizationMode) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3ConservativeRasterizationMode is "
                          "not supported\n";
                }
                if (enabling->extendedDynamicState3ExtraPrimitiveOverestimationSize &&
                    !supported.extendedDynamicState3ExtraPrimitiveOverestimationSize) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3ExtraPrimitiveOverestimationSize "
                          "is not supported\n";
                }
                if (enabling->extendedDynamicState3DepthClipEnable && !supported.extendedDynamicState3DepthClipEnable) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3DepthClipEnable is not "
                          "supported\n";
                }
                if (enabling->extendedDynamicState3SampleLocationsEnable && !supported.extendedDynamicState3SampleLocationsEnable) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3SampleLocationsEnable is not "
                          "supported\n";
                }
                if (enabling->extendedDynamicState3ColorBlendAdvanced && !supported.extendedDynamicState3ColorBlendAdvanced) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3ColorBlendAdvanced is not "
                          "supported\n";
                }
                if (enabling->extendedDynamicState3ProvokingVertexMode && !supported.extendedDynamicState3ProvokingVertexMode) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3ProvokingVertexMode is not "
                          "supported\n";
                }
                if (enabling->extendedDynamicState3LineRasterizationMode && !supported.extendedDynamicState3LineRasterizationMode) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3LineRasterizationMode is not "
                          "supported\n";
                }
                if (enabling->extendedDynamicState3LineStippleEnable && !supported.extendedDynamicState3LineStippleEnable) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3LineStippleEnable is not "
                          "supported\n";
                }
                if (enabling->extendedDynamicState3DepthClipNegativeOneToOne &&
                    !supported.extendedDynamicState3DepthClipNegativeOneToOne) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3DepthClipNegativeOneToOne is not "
                          "supported\n";
                }
                if (enabling->extendedDynamicState3ViewportWScalingEnable &&
                    !supported.extendedDynamicState3ViewportWScalingEnable) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3ViewportWScalingEnable is not "
                          "supported\n";
                }
                if (enabling->extendedDynamicState3ViewportSwizzle && !supported.extendedDynamicState3ViewportSwizzle) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3ViewportSwizzle is not "
                          "supported\n";
                }
                if (enabling->extendedDynamicState3CoverageToColorEnable && !supported.extendedDynamicState3CoverageToColorEnable) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3CoverageToColorEnable is not "
                          "supported\n";
                }
                if (enabling->extendedDynamicState3CoverageToColorLocation &&
                    !supported.extendedDynamicState3CoverageToColorLocation) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3CoverageToColorLocation is not "
                          "supported\n";
                }
                if (enabling->extendedDynamicState3CoverageModulationMode &&
                    !supported.extendedDynamicState3CoverageModulationMode) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3CoverageModulationMode is not "
                          "supported\n";
                }
                if (enabling->extendedDynamicState3CoverageModulationTableEnable &&
                    !supported.extendedDynamicState3CoverageModulationTableEnable) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3CoverageModulationTableEnable is "
                          "not supported\n";
                }
                if (enabling->extendedDynamicState3CoverageModulationTable &&
                    !supported.extendedDynamicState3CoverageModulationTable) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3CoverageModulationTable is not "
                          "supported\n";
                }
                if (enabling->extendedDynamicState3CoverageReductionMode && !supported.extendedDynamicState3CoverageReductionMode) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3CoverageReductionMode is not "
                          "supported\n";
                }
                if (enabling->extendedDynamicState3RepresentativeFragmentTestEnable &&
                    !supported.extendedDynamicState3RepresentativeFragmentTestEnable) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3RepresentativeFragmentTestEnable "
                          "is not supported\n";
                }
                if (enabling->extendedDynamicState3ShadingRateImageEnable &&
                    !supported.extendedDynamicState3ShadingRateImageEnable) {
                    ss << "VkPhysicalDeviceExtendedDynamicState3FeaturesEXT::extendedDynamicState3ShadingRateImageEnable is not "
                          "supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT: {
                VkPhysicalDeviceExtendedDynamicStateFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(current);
                if (enabling->extendedDynamicState && !supported.extendedDynamicState) {
                    ss << "VkPhysicalDeviceExtendedDynamicStateFeaturesEXT::extendedDynamicState is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_SPARSE_ADDRESS_SPACE_FEATURES_NV: {
                VkPhysicalDeviceExtendedSparseAddressSpaceFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceExtendedSparseAddressSpaceFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceExtendedSparseAddressSpaceFeaturesNV*>(current);
                if (enabling->extendedSparseAddressSpace && !supported.extendedSparseAddressSpace) {
                    ss << "VkPhysicalDeviceExtendedSparseAddressSpaceFeaturesNV::extendedSparseAddressSpace is not supported\n";
                }
                break;
            }
#ifdef VK_USE_PLATFORM_ANDROID_KHR
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FORMAT_RESOLVE_FEATURES_ANDROID: {
                VkPhysicalDeviceExternalFormatResolveFeaturesANDROID supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceExternalFormatResolveFeaturesANDROID* enabling =
                    reinterpret_cast<const VkPhysicalDeviceExternalFormatResolveFeaturesANDROID*>(current);
                if (enabling->externalFormatResolve && !supported.externalFormatResolve) {
                    ss << "VkPhysicalDeviceExternalFormatResolveFeaturesANDROID::externalFormatResolve is not supported\n";
                }
                break;
            }
#endif  // VK_USE_PLATFORM_ANDROID_KHR
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV: {
                VkPhysicalDeviceExternalMemoryRDMAFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceExternalMemoryRDMAFeaturesNV*>(current);
                if (enabling->externalMemoryRDMA && !supported.externalMemoryRDMA) {
                    ss << "VkPhysicalDeviceExternalMemoryRDMAFeaturesNV::externalMemoryRDMA is not supported\n";
                }
                break;
            }
#ifdef VK_USE_PLATFORM_SCREEN_QNX
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_SCREEN_BUFFER_FEATURES_QNX: {
                VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX* enabling =
                    reinterpret_cast<const VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX*>(current);
                if (enabling->screenBufferImport && !supported.screenBufferImport) {
                    ss << "VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX::screenBufferImport is not supported\n";
                }
                break;
            }
#endif  // VK_USE_PLATFORM_SCREEN_QNX
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FAULT_FEATURES_EXT: {
                VkPhysicalDeviceFaultFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceFaultFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceFaultFeaturesEXT*>(current);
                if (enabling->deviceFault && !supported.deviceFault) {
                    ss << "VkPhysicalDeviceFaultFeaturesEXT::deviceFault is not supported\n";
                }
                if (enabling->deviceFaultVendorBinary && !supported.deviceFaultVendorBinary) {
                    ss << "VkPhysicalDeviceFaultFeaturesEXT::deviceFaultVendorBinary is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FAULT_FEATURES_KHR: {
                VkPhysicalDeviceFaultFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceFaultFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceFaultFeaturesKHR*>(current);
                if (enabling->deviceFault && !supported.deviceFault) {
                    ss << "VkPhysicalDeviceFaultFeaturesKHR::deviceFault is not supported\n";
                }
                if (enabling->deviceFaultVendorBinary && !supported.deviceFaultVendorBinary) {
                    ss << "VkPhysicalDeviceFaultFeaturesKHR::deviceFaultVendorBinary is not supported\n";
                }
                if (enabling->deviceFaultReportMasked && !supported.deviceFaultReportMasked) {
                    ss << "VkPhysicalDeviceFaultFeaturesKHR::deviceFaultReportMasked is not supported\n";
                }
                if (enabling->deviceFaultDeviceLostOnMasked && !supported.deviceFaultDeviceLostOnMasked) {
                    ss << "VkPhysicalDeviceFaultFeaturesKHR::deviceFaultDeviceLostOnMasked is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FORMAT_PACK_FEATURES_ARM: {
                VkPhysicalDeviceFormatPackFeaturesARM supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceFormatPackFeaturesARM* enabling =
                    reinterpret_cast<const VkPhysicalDeviceFormatPackFeaturesARM*>(current);
                if (enabling->formatPack && !supported.formatPack) {
                    ss << "VkPhysicalDeviceFormatPackFeaturesARM::formatPack is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT: {
                VkPhysicalDeviceFragmentDensityMap2FeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(current);
                if (enabling->fragmentDensityMapDeferred && !supported.fragmentDensityMapDeferred) {
                    ss << "VkPhysicalDeviceFragmentDensityMap2FeaturesEXT::fragmentDensityMapDeferred is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT: {
                VkPhysicalDeviceFragmentDensityMapFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceFragmentDensityMapFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(current);
                if (enabling->fragmentDensityMap && !supported.fragmentDensityMap) {
                    ss << "VkPhysicalDeviceFragmentDensityMapFeaturesEXT::fragmentDensityMap is not supported\n";
                }
                if (enabling->fragmentDensityMapDynamic && !supported.fragmentDensityMapDynamic) {
                    ss << "VkPhysicalDeviceFragmentDensityMapFeaturesEXT::fragmentDensityMapDynamic is not supported\n";
                }
                if (enabling->fragmentDensityMapNonSubsampledImages && !supported.fragmentDensityMapNonSubsampledImages) {
                    ss << "VkPhysicalDeviceFragmentDensityMapFeaturesEXT::fragmentDensityMapNonSubsampledImages is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_LAYERED_FEATURES_VALVE: {
                VkPhysicalDeviceFragmentDensityMapLayeredFeaturesVALVE supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceFragmentDensityMapLayeredFeaturesVALVE* enabling =
                    reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapLayeredFeaturesVALVE*>(current);
                if (enabling->fragmentDensityMapLayered && !supported.fragmentDensityMapLayered) {
                    ss << "VkPhysicalDeviceFragmentDensityMapLayeredFeaturesVALVE::fragmentDensityMapLayered is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_FEATURES_EXT: {
                VkPhysicalDeviceFragmentDensityMapOffsetFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceFragmentDensityMapOffsetFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapOffsetFeaturesEXT*>(current);
                if (enabling->fragmentDensityMapOffset && !supported.fragmentDensityMapOffset) {
                    ss << "VkPhysicalDeviceFragmentDensityMapOffsetFeaturesEXT::fragmentDensityMapOffset is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR: {
                VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR*>(current);
                if (enabling->fragmentShaderBarycentric && !supported.fragmentShaderBarycentric) {
                    ss << "VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR::fragmentShaderBarycentric is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT: {
                VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(current);
                if (enabling->fragmentShaderSampleInterlock && !supported.fragmentShaderSampleInterlock) {
                    ss << "VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT::fragmentShaderSampleInterlock is not supported\n";
                }
                if (enabling->fragmentShaderPixelInterlock && !supported.fragmentShaderPixelInterlock) {
                    ss << "VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT::fragmentShaderPixelInterlock is not supported\n";
                }
                if (enabling->fragmentShaderShadingRateInterlock && !supported.fragmentShaderShadingRateInterlock) {
                    ss << "VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT::fragmentShaderShadingRateInterlock is not "
                          "supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV: {
                VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(current);
                if (enabling->fragmentShadingRateEnums && !supported.fragmentShadingRateEnums) {
                    ss << "VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV::fragmentShadingRateEnums is not supported\n";
                }
                if (enabling->supersampleFragmentShadingRates && !supported.supersampleFragmentShadingRates) {
                    ss << "VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV::supersampleFragmentShadingRates is not supported\n";
                }
                if (enabling->noInvocationFragmentShadingRates && !supported.noInvocationFragmentShadingRates) {
                    ss << "VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV::noInvocationFragmentShadingRates is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR: {
                VkPhysicalDeviceFragmentShadingRateFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceFragmentShadingRateFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(current);
                if (enabling->pipelineFragmentShadingRate && !supported.pipelineFragmentShadingRate) {
                    ss << "VkPhysicalDeviceFragmentShadingRateFeaturesKHR::pipelineFragmentShadingRate is not supported\n";
                }
                if (enabling->primitiveFragmentShadingRate && !supported.primitiveFragmentShadingRate) {
                    ss << "VkPhysicalDeviceFragmentShadingRateFeaturesKHR::primitiveFragmentShadingRate is not supported\n";
                }
                if (enabling->attachmentFragmentShadingRate && !supported.attachmentFragmentShadingRate) {
                    ss << "VkPhysicalDeviceFragmentShadingRateFeaturesKHR::attachmentFragmentShadingRate is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAME_BOUNDARY_FEATURES_EXT: {
                VkPhysicalDeviceFrameBoundaryFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceFrameBoundaryFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceFrameBoundaryFeaturesEXT*>(current);
                if (enabling->frameBoundary && !supported.frameBoundary) {
                    ss << "VkPhysicalDeviceFrameBoundaryFeaturesEXT::frameBoundary is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES: {
                VkPhysicalDeviceGlobalPriorityQueryFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceGlobalPriorityQueryFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceGlobalPriorityQueryFeatures*>(current);
                if (enabling->globalPriorityQuery && !supported.globalPriorityQuery) {
                    ss << "VkPhysicalDeviceGlobalPriorityQueryFeatures::globalPriorityQuery is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT: {
                VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT*>(current);
                if (enabling->graphicsPipelineLibrary && !supported.graphicsPipelineLibrary) {
                    ss << "VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT::graphicsPipelineLibrary is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HDR_VIVID_FEATURES_HUAWEI: {
                VkPhysicalDeviceHdrVividFeaturesHUAWEI supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceHdrVividFeaturesHUAWEI* enabling =
                    reinterpret_cast<const VkPhysicalDeviceHdrVividFeaturesHUAWEI*>(current);
                if (enabling->hdrVivid && !supported.hdrVivid) {
                    ss << "VkPhysicalDeviceHdrVividFeaturesHUAWEI::hdrVivid is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES: {
                VkPhysicalDeviceHostImageCopyFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceHostImageCopyFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceHostImageCopyFeatures*>(current);
                if (enabling->hostImageCopy && !supported.hostImageCopy) {
                    ss << "VkPhysicalDeviceHostImageCopyFeatures::hostImageCopy is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES: {
                VkPhysicalDeviceHostQueryResetFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceHostQueryResetFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceHostQueryResetFeatures*>(current);
                if (enabling->hostQueryReset && !supported.hostQueryReset) {
                    ss << "VkPhysicalDeviceHostQueryResetFeatures::hostQueryReset is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT: {
                VkPhysicalDeviceImage2DViewOf3DFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceImage2DViewOf3DFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceImage2DViewOf3DFeaturesEXT*>(current);
                if (enabling->image2DViewOf3D && !supported.image2DViewOf3D) {
                    ss << "VkPhysicalDeviceImage2DViewOf3DFeaturesEXT::image2DViewOf3D is not supported\n";
                }
                if (enabling->sampler2DViewOf3D && !supported.sampler2DViewOf3D) {
                    ss << "VkPhysicalDeviceImage2DViewOf3DFeaturesEXT::sampler2DViewOf3D is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ALIGNMENT_CONTROL_FEATURES_MESA: {
                VkPhysicalDeviceImageAlignmentControlFeaturesMESA supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceImageAlignmentControlFeaturesMESA* enabling =
                    reinterpret_cast<const VkPhysicalDeviceImageAlignmentControlFeaturesMESA*>(current);
                if (enabling->imageAlignmentControl && !supported.imageAlignmentControl) {
                    ss << "VkPhysicalDeviceImageAlignmentControlFeaturesMESA::imageAlignmentControl is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_FEATURES_EXT: {
                VkPhysicalDeviceImageCompressionControlFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceImageCompressionControlFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceImageCompressionControlFeaturesEXT*>(current);
                if (enabling->imageCompressionControl && !supported.imageCompressionControl) {
                    ss << "VkPhysicalDeviceImageCompressionControlFeaturesEXT::imageCompressionControl is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_FEATURES_EXT: {
                VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT*>(current);
                if (enabling->imageCompressionControlSwapchain && !supported.imageCompressionControlSwapchain) {
                    ss << "VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT::imageCompressionControlSwapchain is not "
                          "supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_2_FEATURES_QCOM: {
                VkPhysicalDeviceImageProcessing2FeaturesQCOM supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceImageProcessing2FeaturesQCOM* enabling =
                    reinterpret_cast<const VkPhysicalDeviceImageProcessing2FeaturesQCOM*>(current);
                if (enabling->textureBlockMatch2 && !supported.textureBlockMatch2) {
                    ss << "VkPhysicalDeviceImageProcessing2FeaturesQCOM::textureBlockMatch2 is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_FEATURES_QCOM: {
                VkPhysicalDeviceImageProcessingFeaturesQCOM supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceImageProcessingFeaturesQCOM* enabling =
                    reinterpret_cast<const VkPhysicalDeviceImageProcessingFeaturesQCOM*>(current);
                if (enabling->textureSampleWeighted && !supported.textureSampleWeighted) {
                    ss << "VkPhysicalDeviceImageProcessingFeaturesQCOM::textureSampleWeighted is not supported\n";
                }
                if (enabling->textureBoxFilter && !supported.textureBoxFilter) {
                    ss << "VkPhysicalDeviceImageProcessingFeaturesQCOM::textureBoxFilter is not supported\n";
                }
                if (enabling->textureBlockMatch && !supported.textureBlockMatch) {
                    ss << "VkPhysicalDeviceImageProcessingFeaturesQCOM::textureBlockMatch is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES: {
                VkPhysicalDeviceImageRobustnessFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceImageRobustnessFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceImageRobustnessFeatures*>(current);
                if (enabling->robustImageAccess && !supported.robustImageAccess) {
                    ss << "VkPhysicalDeviceImageRobustnessFeatures::robustImageAccess is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_SLICED_VIEW_OF_3D_FEATURES_EXT: {
                VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT*>(current);
                if (enabling->imageSlicedViewOf3D && !supported.imageSlicedViewOf3D) {
                    ss << "VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT::imageSlicedViewOf3D is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT: {
                VkPhysicalDeviceImageViewMinLodFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceImageViewMinLodFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceImageViewMinLodFeaturesEXT*>(current);
                if (enabling->minLod && !supported.minLod) {
                    ss << "VkPhysicalDeviceImageViewMinLodFeaturesEXT::minLod is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES: {
                VkPhysicalDeviceImagelessFramebufferFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceImagelessFramebufferFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceImagelessFramebufferFeatures*>(current);
                if (enabling->imagelessFramebuffer && !supported.imagelessFramebuffer) {
                    ss << "VkPhysicalDeviceImagelessFramebufferFeatures::imagelessFramebuffer is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES: {
                VkPhysicalDeviceIndexTypeUint8Features supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceIndexTypeUint8Features* enabling =
                    reinterpret_cast<const VkPhysicalDeviceIndexTypeUint8Features*>(current);
                if (enabling->indexTypeUint8 && !supported.indexTypeUint8) {
                    ss << "VkPhysicalDeviceIndexTypeUint8Features::indexTypeUint8 is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV: {
                VkPhysicalDeviceInheritedViewportScissorFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceInheritedViewportScissorFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceInheritedViewportScissorFeaturesNV*>(current);
                if (enabling->inheritedViewportScissor2D && !supported.inheritedViewportScissor2D) {
                    ss << "VkPhysicalDeviceInheritedViewportScissorFeaturesNV::inheritedViewportScissor2D is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES: {
                VkPhysicalDeviceInlineUniformBlockFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceInlineUniformBlockFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockFeatures*>(current);
                if (enabling->inlineUniformBlock && !supported.inlineUniformBlock) {
                    ss << "VkPhysicalDeviceInlineUniformBlockFeatures::inlineUniformBlock is not supported\n";
                }
                if (enabling->descriptorBindingInlineUniformBlockUpdateAfterBind &&
                    !supported.descriptorBindingInlineUniformBlockUpdateAfterBind) {
                    ss << "VkPhysicalDeviceInlineUniformBlockFeatures::descriptorBindingInlineUniformBlockUpdateAfterBind is not "
                          "supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INTERNALLY_SYNCHRONIZED_QUEUES_FEATURES_KHR: {
                VkPhysicalDeviceInternallySynchronizedQueuesFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceInternallySynchronizedQueuesFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceInternallySynchronizedQueuesFeaturesKHR*>(current);
                if (enabling->internallySynchronizedQueues && !supported.internallySynchronizedQueues) {
                    ss << "VkPhysicalDeviceInternallySynchronizedQueuesFeaturesKHR::internallySynchronizedQueues is not "
                          "supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI: {
                VkPhysicalDeviceInvocationMaskFeaturesHUAWEI supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* enabling =
                    reinterpret_cast<const VkPhysicalDeviceInvocationMaskFeaturesHUAWEI*>(current);
                if (enabling->invocationMask && !supported.invocationMask) {
                    ss << "VkPhysicalDeviceInvocationMaskFeaturesHUAWEI::invocationMask is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_DITHERING_FEATURES_EXT: {
                VkPhysicalDeviceLegacyDitheringFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceLegacyDitheringFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceLegacyDitheringFeaturesEXT*>(current);
                if (enabling->legacyDithering && !supported.legacyDithering) {
                    ss << "VkPhysicalDeviceLegacyDitheringFeaturesEXT::legacyDithering is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_VERTEX_ATTRIBUTES_FEATURES_EXT: {
                VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT*>(current);
                if (enabling->legacyVertexAttributes && !supported.legacyVertexAttributes) {
                    ss << "VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT::legacyVertexAttributes is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES: {
                VkPhysicalDeviceLineRasterizationFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceLineRasterizationFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceLineRasterizationFeatures*>(current);
                if (enabling->rectangularLines && !supported.rectangularLines) {
                    ss << "VkPhysicalDeviceLineRasterizationFeatures::rectangularLines is not supported\n";
                }
                if (enabling->bresenhamLines && !supported.bresenhamLines) {
                    ss << "VkPhysicalDeviceLineRasterizationFeatures::bresenhamLines is not supported\n";
                }
                if (enabling->smoothLines && !supported.smoothLines) {
                    ss << "VkPhysicalDeviceLineRasterizationFeatures::smoothLines is not supported\n";
                }
                if (enabling->stippledRectangularLines && !supported.stippledRectangularLines) {
                    ss << "VkPhysicalDeviceLineRasterizationFeatures::stippledRectangularLines is not supported\n";
                }
                if (enabling->stippledBresenhamLines && !supported.stippledBresenhamLines) {
                    ss << "VkPhysicalDeviceLineRasterizationFeatures::stippledBresenhamLines is not supported\n";
                }
                if (enabling->stippledSmoothLines && !supported.stippledSmoothLines) {
                    ss << "VkPhysicalDeviceLineRasterizationFeatures::stippledSmoothLines is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINEAR_COLOR_ATTACHMENT_FEATURES_NV: {
                VkPhysicalDeviceLinearColorAttachmentFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceLinearColorAttachmentFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceLinearColorAttachmentFeaturesNV*>(current);
                if (enabling->linearColorAttachment && !supported.linearColorAttachment) {
                    ss << "VkPhysicalDeviceLinearColorAttachmentFeaturesNV::linearColorAttachment is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_10_FEATURES_KHR: {
                VkPhysicalDeviceMaintenance10FeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceMaintenance10FeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceMaintenance10FeaturesKHR*>(current);
                if (enabling->maintenance10 && !supported.maintenance10) {
                    ss << "VkPhysicalDeviceMaintenance10FeaturesKHR::maintenance10 is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_11_FEATURES_KHR: {
                VkPhysicalDeviceMaintenance11FeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceMaintenance11FeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceMaintenance11FeaturesKHR*>(current);
                if (enabling->maintenance11 && !supported.maintenance11) {
                    ss << "VkPhysicalDeviceMaintenance11FeaturesKHR::maintenance11 is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES: {
                VkPhysicalDeviceMaintenance4Features supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceMaintenance4Features* enabling =
                    reinterpret_cast<const VkPhysicalDeviceMaintenance4Features*>(current);
                if (enabling->maintenance4 && !supported.maintenance4) {
                    ss << "VkPhysicalDeviceMaintenance4Features::maintenance4 is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES: {
                VkPhysicalDeviceMaintenance5Features supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceMaintenance5Features* enabling =
                    reinterpret_cast<const VkPhysicalDeviceMaintenance5Features*>(current);
                if (enabling->maintenance5 && !supported.maintenance5) {
                    ss << "VkPhysicalDeviceMaintenance5Features::maintenance5 is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES: {
                VkPhysicalDeviceMaintenance6Features supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceMaintenance6Features* enabling =
                    reinterpret_cast<const VkPhysicalDeviceMaintenance6Features*>(current);
                if (enabling->maintenance6 && !supported.maintenance6) {
                    ss << "VkPhysicalDeviceMaintenance6Features::maintenance6 is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_7_FEATURES_KHR: {
                VkPhysicalDeviceMaintenance7FeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceMaintenance7FeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceMaintenance7FeaturesKHR*>(current);
                if (enabling->maintenance7 && !supported.maintenance7) {
                    ss << "VkPhysicalDeviceMaintenance7FeaturesKHR::maintenance7 is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_8_FEATURES_KHR: {
                VkPhysicalDeviceMaintenance8FeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceMaintenance8FeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceMaintenance8FeaturesKHR*>(current);
                if (enabling->maintenance8 && !supported.maintenance8) {
                    ss << "VkPhysicalDeviceMaintenance8FeaturesKHR::maintenance8 is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_9_FEATURES_KHR: {
                VkPhysicalDeviceMaintenance9FeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceMaintenance9FeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceMaintenance9FeaturesKHR*>(current);
                if (enabling->maintenance9 && !supported.maintenance9) {
                    ss << "VkPhysicalDeviceMaintenance9FeaturesKHR::maintenance9 is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAP_MEMORY_PLACED_FEATURES_EXT: {
                VkPhysicalDeviceMapMemoryPlacedFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceMapMemoryPlacedFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceMapMemoryPlacedFeaturesEXT*>(current);
                if (enabling->memoryMapPlaced && !supported.memoryMapPlaced) {
                    ss << "VkPhysicalDeviceMapMemoryPlacedFeaturesEXT::memoryMapPlaced is not supported\n";
                }
                if (enabling->memoryMapRangePlaced && !supported.memoryMapRangePlaced) {
                    ss << "VkPhysicalDeviceMapMemoryPlacedFeaturesEXT::memoryMapRangePlaced is not supported\n";
                }
                if (enabling->memoryUnmapReserve && !supported.memoryUnmapReserve) {
                    ss << "VkPhysicalDeviceMapMemoryPlacedFeaturesEXT::memoryUnmapReserve is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_FEATURES_EXT: {
                VkPhysicalDeviceMemoryDecompressionFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceMemoryDecompressionFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceMemoryDecompressionFeaturesEXT*>(current);
                if (enabling->memoryDecompression && !supported.memoryDecompression) {
                    ss << "VkPhysicalDeviceMemoryDecompressionFeaturesEXT::memoryDecompression is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT: {
                VkPhysicalDeviceMemoryPriorityFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceMemoryPriorityFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(current);
                if (enabling->memoryPriority && !supported.memoryPriority) {
                    ss << "VkPhysicalDeviceMemoryPriorityFeaturesEXT::memoryPriority is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT: {
                VkPhysicalDeviceMeshShaderFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceMeshShaderFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceMeshShaderFeaturesEXT*>(current);
                if (enabling->taskShader && !supported.taskShader) {
                    ss << "VkPhysicalDeviceMeshShaderFeaturesEXT::taskShader is not supported\n";
                }
                if (enabling->meshShader && !supported.meshShader) {
                    ss << "VkPhysicalDeviceMeshShaderFeaturesEXT::meshShader is not supported\n";
                }
                if (enabling->multiviewMeshShader && !supported.multiviewMeshShader) {
                    ss << "VkPhysicalDeviceMeshShaderFeaturesEXT::multiviewMeshShader is not supported\n";
                }
                if (enabling->primitiveFragmentShadingRateMeshShader && !supported.primitiveFragmentShadingRateMeshShader) {
                    ss << "VkPhysicalDeviceMeshShaderFeaturesEXT::primitiveFragmentShadingRateMeshShader is not supported\n";
                }
                if (enabling->meshShaderQueries && !supported.meshShaderQueries) {
                    ss << "VkPhysicalDeviceMeshShaderFeaturesEXT::meshShaderQueries is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV: {
                VkPhysicalDeviceMeshShaderFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceMeshShaderFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceMeshShaderFeaturesNV*>(current);
                if (enabling->taskShader && !supported.taskShader) {
                    ss << "VkPhysicalDeviceMeshShaderFeaturesNV::taskShader is not supported\n";
                }
                if (enabling->meshShader && !supported.meshShader) {
                    ss << "VkPhysicalDeviceMeshShaderFeaturesNV::meshShader is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT: {
                VkPhysicalDeviceMultiDrawFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceMultiDrawFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceMultiDrawFeaturesEXT*>(current);
                if (enabling->multiDraw && !supported.multiDraw) {
                    ss << "VkPhysicalDeviceMultiDrawFeaturesEXT::multiDraw is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT: {
                VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT*>(current);
                if (enabling->multisampledRenderToSingleSampled && !supported.multisampledRenderToSingleSampled) {
                    ss << "VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT::multisampledRenderToSingleSampled is not "
                          "supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: {
                VkPhysicalDeviceMultiviewFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceMultiviewFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceMultiviewFeatures*>(current);
                if (enabling->multiview && !supported.multiview) {
                    ss << "VkPhysicalDeviceMultiviewFeatures::multiview is not supported\n";
                }
                if (enabling->multiviewGeometryShader && !supported.multiviewGeometryShader) {
                    ss << "VkPhysicalDeviceMultiviewFeatures::multiviewGeometryShader is not supported\n";
                }
                if (enabling->multiviewTessellationShader && !supported.multiviewTessellationShader) {
                    ss << "VkPhysicalDeviceMultiviewFeatures::multiviewTessellationShader is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_RENDER_AREAS_FEATURES_QCOM: {
                VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM* enabling =
                    reinterpret_cast<const VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM*>(current);
                if (enabling->multiviewPerViewRenderAreas && !supported.multiviewPerViewRenderAreas) {
                    ss << "VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM::multiviewPerViewRenderAreas is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_VIEWPORTS_FEATURES_QCOM: {
                VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM* enabling =
                    reinterpret_cast<const VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM*>(current);
                if (enabling->multiviewPerViewViewports && !supported.multiviewPerViewViewports) {
                    ss << "VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM::multiviewPerViewViewports is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT: {
                VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT*>(current);
                if (enabling->mutableDescriptorType && !supported.mutableDescriptorType) {
                    ss << "VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT::mutableDescriptorType is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NESTED_COMMAND_BUFFER_FEATURES_EXT: {
                VkPhysicalDeviceNestedCommandBufferFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceNestedCommandBufferFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceNestedCommandBufferFeaturesEXT*>(current);
                if (enabling->nestedCommandBuffer && !supported.nestedCommandBuffer) {
                    ss << "VkPhysicalDeviceNestedCommandBufferFeaturesEXT::nestedCommandBuffer is not supported\n";
                }
                if (enabling->nestedCommandBufferRendering && !supported.nestedCommandBufferRendering) {
                    ss << "VkPhysicalDeviceNestedCommandBufferFeaturesEXT::nestedCommandBufferRendering is not supported\n";
                }
                if (enabling->nestedCommandBufferSimultaneousUse && !supported.nestedCommandBufferSimultaneousUse) {
                    ss << "VkPhysicalDeviceNestedCommandBufferFeaturesEXT::nestedCommandBufferSimultaneousUse is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT: {
                VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT*>(current);
                if (enabling->nonSeamlessCubeMap && !supported.nonSeamlessCubeMap) {
                    ss << "VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT::nonSeamlessCubeMap is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_FEATURES_EXT: {
                VkPhysicalDeviceOpacityMicromapFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceOpacityMicromapFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceOpacityMicromapFeaturesEXT*>(current);
                if (enabling->micromap && !supported.micromap) {
                    ss << "VkPhysicalDeviceOpacityMicromapFeaturesEXT::micromap is not supported\n";
                }
                if (enabling->micromapCaptureReplay && !supported.micromapCaptureReplay) {
                    ss << "VkPhysicalDeviceOpacityMicromapFeaturesEXT::micromapCaptureReplay is not supported\n";
                }
                if (enabling->micromapHostCommands && !supported.micromapHostCommands) {
                    ss << "VkPhysicalDeviceOpacityMicromapFeaturesEXT::micromapHostCommands is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_FEATURES_NV: {
                VkPhysicalDeviceOpticalFlowFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceOpticalFlowFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceOpticalFlowFeaturesNV*>(current);
                if (enabling->opticalFlow && !supported.opticalFlow) {
                    ss << "VkPhysicalDeviceOpticalFlowFeaturesNV::opticalFlow is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT: {
                VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT*>(current);
                if (enabling->pageableDeviceLocalMemory && !supported.pageableDeviceLocalMemory) {
                    ss << "VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT::pageableDeviceLocalMemory is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PARTITIONED_ACCELERATION_STRUCTURE_FEATURES_NV: {
                VkPhysicalDevicePartitionedAccelerationStructureFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePartitionedAccelerationStructureFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDevicePartitionedAccelerationStructureFeaturesNV*>(current);
                if (enabling->partitionedAccelerationStructure && !supported.partitionedAccelerationStructure) {
                    ss << "VkPhysicalDevicePartitionedAccelerationStructureFeaturesNV::partitionedAccelerationStructure is not "
                          "supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PER_STAGE_DESCRIPTOR_SET_FEATURES_NV: {
                VkPhysicalDevicePerStageDescriptorSetFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePerStageDescriptorSetFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDevicePerStageDescriptorSetFeaturesNV*>(current);
                if (enabling->perStageDescriptorSet && !supported.perStageDescriptorSet) {
                    ss << "VkPhysicalDevicePerStageDescriptorSetFeaturesNV::perStageDescriptorSet is not supported\n";
                }
                if (enabling->dynamicPipelineLayout && !supported.dynamicPipelineLayout) {
                    ss << "VkPhysicalDevicePerStageDescriptorSetFeaturesNV::dynamicPipelineLayout is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_COUNTERS_BY_REGION_FEATURES_ARM: {
                VkPhysicalDevicePerformanceCountersByRegionFeaturesARM supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePerformanceCountersByRegionFeaturesARM* enabling =
                    reinterpret_cast<const VkPhysicalDevicePerformanceCountersByRegionFeaturesARM*>(current);
                if (enabling->performanceCountersByRegion && !supported.performanceCountersByRegion) {
                    ss << "VkPhysicalDevicePerformanceCountersByRegionFeaturesARM::performanceCountersByRegion is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR: {
                VkPhysicalDevicePerformanceQueryFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePerformanceQueryFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDevicePerformanceQueryFeaturesKHR*>(current);
                if (enabling->performanceCounterQueryPools && !supported.performanceCounterQueryPools) {
                    ss << "VkPhysicalDevicePerformanceQueryFeaturesKHR::performanceCounterQueryPools is not supported\n";
                }
                if (enabling->performanceCounterMultipleQueryPools && !supported.performanceCounterMultipleQueryPools) {
                    ss << "VkPhysicalDevicePerformanceQueryFeaturesKHR::performanceCounterMultipleQueryPools is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_BINARY_FEATURES_KHR: {
                VkPhysicalDevicePipelineBinaryFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePipelineBinaryFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDevicePipelineBinaryFeaturesKHR*>(current);
                if (enabling->pipelineBinaries && !supported.pipelineBinaries) {
                    ss << "VkPhysicalDevicePipelineBinaryFeaturesKHR::pipelineBinaries is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CACHE_INCREMENTAL_MODE_FEATURES_SEC: {
                VkPhysicalDevicePipelineCacheIncrementalModeFeaturesSEC supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePipelineCacheIncrementalModeFeaturesSEC* enabling =
                    reinterpret_cast<const VkPhysicalDevicePipelineCacheIncrementalModeFeaturesSEC*>(current);
                if (enabling->pipelineCacheIncrementalMode && !supported.pipelineCacheIncrementalMode) {
                    ss << "VkPhysicalDevicePipelineCacheIncrementalModeFeaturesSEC::pipelineCacheIncrementalMode is not "
                          "supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES: {
                VkPhysicalDevicePipelineCreationCacheControlFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePipelineCreationCacheControlFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDevicePipelineCreationCacheControlFeatures*>(current);
                if (enabling->pipelineCreationCacheControl && !supported.pipelineCreationCacheControl) {
                    ss << "VkPhysicalDevicePipelineCreationCacheControlFeatures::pipelineCreationCacheControl is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR: {
                VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(current);
                if (enabling->pipelineExecutableInfo && !supported.pipelineExecutableInfo) {
                    ss << "VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR::pipelineExecutableInfo is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_LIBRARY_GROUP_HANDLES_FEATURES_EXT: {
                VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT*>(current);
                if (enabling->pipelineLibraryGroupHandles && !supported.pipelineLibraryGroupHandles) {
                    ss << "VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT::pipelineLibraryGroupHandles is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_OPACITY_MICROMAP_FEATURES_ARM: {
                VkPhysicalDevicePipelineOpacityMicromapFeaturesARM supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePipelineOpacityMicromapFeaturesARM* enabling =
                    reinterpret_cast<const VkPhysicalDevicePipelineOpacityMicromapFeaturesARM*>(current);
                if (enabling->pipelineOpacityMicromap && !supported.pipelineOpacityMicromap) {
                    ss << "VkPhysicalDevicePipelineOpacityMicromapFeaturesARM::pipelineOpacityMicromap is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROPERTIES_FEATURES_EXT: {
                VkPhysicalDevicePipelinePropertiesFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePipelinePropertiesFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDevicePipelinePropertiesFeaturesEXT*>(current);
                if (enabling->pipelinePropertiesIdentifier && !supported.pipelinePropertiesIdentifier) {
                    ss << "VkPhysicalDevicePipelinePropertiesFeaturesEXT::pipelinePropertiesIdentifier is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES: {
                VkPhysicalDevicePipelineProtectedAccessFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePipelineProtectedAccessFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDevicePipelineProtectedAccessFeatures*>(current);
                if (enabling->pipelineProtectedAccess && !supported.pipelineProtectedAccess) {
                    ss << "VkPhysicalDevicePipelineProtectedAccessFeatures::pipelineProtectedAccess is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES: {
                VkPhysicalDevicePipelineRobustnessFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePipelineRobustnessFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDevicePipelineRobustnessFeatures*>(current);
                if (enabling->pipelineRobustness && !supported.pipelineRobustness) {
                    ss << "VkPhysicalDevicePipelineRobustnessFeatures::pipelineRobustness is not supported\n";
                }
                break;
            }
#ifdef VK_ENABLE_BETA_EXTENSIONS
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR: {
                VkPhysicalDevicePortabilitySubsetFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePortabilitySubsetFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(current);
                if (enabling->constantAlphaColorBlendFactors && !supported.constantAlphaColorBlendFactors) {
                    ss << "VkPhysicalDevicePortabilitySubsetFeaturesKHR::constantAlphaColorBlendFactors is not supported\n";
                }
                if (enabling->events && !supported.events) {
                    ss << "VkPhysicalDevicePortabilitySubsetFeaturesKHR::events is not supported\n";
                }
                if (enabling->imageViewFormatReinterpretation && !supported.imageViewFormatReinterpretation) {
                    ss << "VkPhysicalDevicePortabilitySubsetFeaturesKHR::imageViewFormatReinterpretation is not supported\n";
                }
                if (enabling->imageViewFormatSwizzle && !supported.imageViewFormatSwizzle) {
                    ss << "VkPhysicalDevicePortabilitySubsetFeaturesKHR::imageViewFormatSwizzle is not supported\n";
                }
                if (enabling->imageView2DOn3DImage && !supported.imageView2DOn3DImage) {
                    ss << "VkPhysicalDevicePortabilitySubsetFeaturesKHR::imageView2DOn3DImage is not supported\n";
                }
                if (enabling->multisampleArrayImage && !supported.multisampleArrayImage) {
                    ss << "VkPhysicalDevicePortabilitySubsetFeaturesKHR::multisampleArrayImage is not supported\n";
                }
                if (enabling->mutableComparisonSamplers && !supported.mutableComparisonSamplers) {
                    ss << "VkPhysicalDevicePortabilitySubsetFeaturesKHR::mutableComparisonSamplers is not supported\n";
                }
                if (enabling->pointPolygons && !supported.pointPolygons) {
                    ss << "VkPhysicalDevicePortabilitySubsetFeaturesKHR::pointPolygons is not supported\n";
                }
                if (enabling->samplerMipLodBias && !supported.samplerMipLodBias) {
                    ss << "VkPhysicalDevicePortabilitySubsetFeaturesKHR::samplerMipLodBias is not supported\n";
                }
                if (enabling->separateStencilMaskRef && !supported.separateStencilMaskRef) {
                    ss << "VkPhysicalDevicePortabilitySubsetFeaturesKHR::separateStencilMaskRef is not supported\n";
                }
                if (enabling->shaderSampleRateInterpolationFunctions && !supported.shaderSampleRateInterpolationFunctions) {
                    ss << "VkPhysicalDevicePortabilitySubsetFeaturesKHR::shaderSampleRateInterpolationFunctions is not supported\n";
                }
                if (enabling->tessellationIsolines && !supported.tessellationIsolines) {
                    ss << "VkPhysicalDevicePortabilitySubsetFeaturesKHR::tessellationIsolines is not supported\n";
                }
                if (enabling->tessellationPointMode && !supported.tessellationPointMode) {
                    ss << "VkPhysicalDevicePortabilitySubsetFeaturesKHR::tessellationPointMode is not supported\n";
                }
                if (enabling->triangleFans && !supported.triangleFans) {
                    ss << "VkPhysicalDevicePortabilitySubsetFeaturesKHR::triangleFans is not supported\n";
                }
                if (enabling->vertexAttributeAccessBeyondStride && !supported.vertexAttributeAccessBeyondStride) {
                    ss << "VkPhysicalDevicePortabilitySubsetFeaturesKHR::vertexAttributeAccessBeyondStride is not supported\n";
                }
                break;
            }
#endif  // VK_ENABLE_BETA_EXTENSIONS
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_BARRIER_FEATURES_NV: {
                VkPhysicalDevicePresentBarrierFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePresentBarrierFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDevicePresentBarrierFeaturesNV*>(current);
                if (enabling->presentBarrier && !supported.presentBarrier) {
                    ss << "VkPhysicalDevicePresentBarrierFeaturesNV::presentBarrier is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_2_FEATURES_KHR: {
                VkPhysicalDevicePresentId2FeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePresentId2FeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDevicePresentId2FeaturesKHR*>(current);
                if (enabling->presentId2 && !supported.presentId2) {
                    ss << "VkPhysicalDevicePresentId2FeaturesKHR::presentId2 is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR: {
                VkPhysicalDevicePresentIdFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePresentIdFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDevicePresentIdFeaturesKHR*>(current);
                if (enabling->presentId && !supported.presentId) {
                    ss << "VkPhysicalDevicePresentIdFeaturesKHR::presentId is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_METERING_FEATURES_NV: {
                VkPhysicalDevicePresentMeteringFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePresentMeteringFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDevicePresentMeteringFeaturesNV*>(current);
                if (enabling->presentMetering && !supported.presentMetering) {
                    ss << "VkPhysicalDevicePresentMeteringFeaturesNV::presentMetering is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_MODE_FIFO_LATEST_READY_FEATURES_KHR: {
                VkPhysicalDevicePresentModeFifoLatestReadyFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePresentModeFifoLatestReadyFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDevicePresentModeFifoLatestReadyFeaturesKHR*>(current);
                if (enabling->presentModeFifoLatestReady && !supported.presentModeFifoLatestReady) {
                    ss << "VkPhysicalDevicePresentModeFifoLatestReadyFeaturesKHR::presentModeFifoLatestReady is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_TIMING_FEATURES_EXT: {
                VkPhysicalDevicePresentTimingFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePresentTimingFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDevicePresentTimingFeaturesEXT*>(current);
                if (enabling->presentTiming && !supported.presentTiming) {
                    ss << "VkPhysicalDevicePresentTimingFeaturesEXT::presentTiming is not supported\n";
                }
                if (enabling->presentAtAbsoluteTime && !supported.presentAtAbsoluteTime) {
                    ss << "VkPhysicalDevicePresentTimingFeaturesEXT::presentAtAbsoluteTime is not supported\n";
                }
                if (enabling->presentAtRelativeTime && !supported.presentAtRelativeTime) {
                    ss << "VkPhysicalDevicePresentTimingFeaturesEXT::presentAtRelativeTime is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_2_FEATURES_KHR: {
                VkPhysicalDevicePresentWait2FeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePresentWait2FeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDevicePresentWait2FeaturesKHR*>(current);
                if (enabling->presentWait2 && !supported.presentWait2) {
                    ss << "VkPhysicalDevicePresentWait2FeaturesKHR::presentWait2 is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR: {
                VkPhysicalDevicePresentWaitFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePresentWaitFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDevicePresentWaitFeaturesKHR*>(current);
                if (enabling->presentWait && !supported.presentWait) {
                    ss << "VkPhysicalDevicePresentWaitFeaturesKHR::presentWait is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_RESTART_INDEX_FEATURES_EXT: {
                VkPhysicalDevicePrimitiveRestartIndexFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePrimitiveRestartIndexFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDevicePrimitiveRestartIndexFeaturesEXT*>(current);
                if (enabling->primitiveRestartIndex && !supported.primitiveRestartIndex) {
                    ss << "VkPhysicalDevicePrimitiveRestartIndexFeaturesEXT::primitiveRestartIndex is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT: {
                VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT*>(current);
                if (enabling->primitiveTopologyListRestart && !supported.primitiveTopologyListRestart) {
                    ss << "VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT::primitiveTopologyListRestart is not "
                          "supported\n";
                }
                if (enabling->primitiveTopologyPatchListRestart && !supported.primitiveTopologyPatchListRestart) {
                    ss << "VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT::primitiveTopologyPatchListRestart is not "
                          "supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT: {
                VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT*>(current);
                if (enabling->primitivesGeneratedQuery && !supported.primitivesGeneratedQuery) {
                    ss << "VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT::primitivesGeneratedQuery is not supported\n";
                }
                if (enabling->primitivesGeneratedQueryWithRasterizerDiscard &&
                    !supported.primitivesGeneratedQueryWithRasterizerDiscard) {
                    ss << "VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT::primitivesGeneratedQueryWithRasterizerDiscard is "
                          "not supported\n";
                }
                if (enabling->primitivesGeneratedQueryWithNonZeroStreams && !supported.primitivesGeneratedQueryWithNonZeroStreams) {
                    ss << "VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT::primitivesGeneratedQueryWithNonZeroStreams is not "
                          "supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES: {
                VkPhysicalDevicePrivateDataFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePrivateDataFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDevicePrivateDataFeatures*>(current);
                if (enabling->privateData && !supported.privateData) {
                    ss << "VkPhysicalDevicePrivateDataFeatures::privateData is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES: {
                VkPhysicalDeviceProtectedMemoryFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceProtectedMemoryFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceProtectedMemoryFeatures*>(current);
                if (enabling->protectedMemory && !supported.protectedMemory) {
                    ss << "VkPhysicalDeviceProtectedMemoryFeatures::protectedMemory is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT: {
                VkPhysicalDeviceProvokingVertexFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceProvokingVertexFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceProvokingVertexFeaturesEXT*>(current);
                if (enabling->provokingVertexLast && !supported.provokingVertexLast) {
                    ss << "VkPhysicalDeviceProvokingVertexFeaturesEXT::provokingVertexLast is not supported\n";
                }
                if (enabling->transformFeedbackPreservesProvokingVertex && !supported.transformFeedbackPreservesProvokingVertex) {
                    ss << "VkPhysicalDeviceProvokingVertexFeaturesEXT::transformFeedbackPreservesProvokingVertex is not "
                          "supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_CONSTANT_BANK_FEATURES_NV: {
                VkPhysicalDevicePushConstantBankFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDevicePushConstantBankFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDevicePushConstantBankFeaturesNV*>(current);
                if (enabling->pushConstantBank && !supported.pushConstantBank) {
                    ss << "VkPhysicalDevicePushConstantBankFeaturesNV::pushConstantBank is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_QUEUE_PERF_HINT_FEATURES_QCOM: {
                VkPhysicalDeviceQueuePerfHintFeaturesQCOM supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceQueuePerfHintFeaturesQCOM* enabling =
                    reinterpret_cast<const VkPhysicalDeviceQueuePerfHintFeaturesQCOM*>(current);
                if (enabling->queuePerfHint && !supported.queuePerfHint) {
                    ss << "VkPhysicalDeviceQueuePerfHintFeaturesQCOM::queuePerfHint is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT: {
                VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT*>(current);
                if (enabling->formatRgba10x6WithoutYCbCrSampler && !supported.formatRgba10x6WithoutYCbCrSampler) {
                    ss << "VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT::formatRgba10x6WithoutYCbCrSampler is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT: {
                VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT*>(current);
                if (enabling->rasterizationOrderColorAttachmentAccess && !supported.rasterizationOrderColorAttachmentAccess) {
                    ss << "VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT::rasterizationOrderColorAttachmentAccess "
                          "is not supported\n";
                }
                if (enabling->rasterizationOrderDepthAttachmentAccess && !supported.rasterizationOrderDepthAttachmentAccess) {
                    ss << "VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT::rasterizationOrderDepthAttachmentAccess "
                          "is not supported\n";
                }
                if (enabling->rasterizationOrderStencilAttachmentAccess && !supported.rasterizationOrderStencilAttachmentAccess) {
                    ss << "VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT::"
                          "rasterizationOrderStencilAttachmentAccess is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAW_ACCESS_CHAINS_FEATURES_NV: {
                VkPhysicalDeviceRawAccessChainsFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceRawAccessChainsFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceRawAccessChainsFeaturesNV*>(current);
                if (enabling->shaderRawAccessChains && !supported.shaderRawAccessChains) {
                    ss << "VkPhysicalDeviceRawAccessChainsFeaturesNV::shaderRawAccessChains is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR: {
                VkPhysicalDeviceRayQueryFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceRayQueryFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceRayQueryFeaturesKHR*>(current);
                if (enabling->rayQuery && !supported.rayQuery) {
                    ss << "VkPhysicalDeviceRayQueryFeaturesKHR::rayQuery is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_EXT: {
                VkPhysicalDeviceRayTracingInvocationReorderFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceRayTracingInvocationReorderFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceRayTracingInvocationReorderFeaturesEXT*>(current);
                if (enabling->rayTracingInvocationReorder && !supported.rayTracingInvocationReorder) {
                    ss << "VkPhysicalDeviceRayTracingInvocationReorderFeaturesEXT::rayTracingInvocationReorder is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV: {
                VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV*>(current);
                if (enabling->rayTracingInvocationReorder && !supported.rayTracingInvocationReorder) {
                    ss << "VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV::rayTracingInvocationReorder is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_LINEAR_SWEPT_SPHERES_FEATURES_NV: {
                VkPhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV*>(current);
                if (enabling->spheres && !supported.spheres) {
                    ss << "VkPhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV::spheres is not supported\n";
                }
                if (enabling->linearSweptSpheres && !supported.linearSweptSpheres) {
                    ss << "VkPhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV::linearSweptSpheres is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR: {
                VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR*>(current);
                if (enabling->rayTracingMaintenance1 && !supported.rayTracingMaintenance1) {
                    ss << "VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR::rayTracingMaintenance1 is not supported\n";
                }
                if (enabling->rayTracingPipelineTraceRaysIndirect2 && !supported.rayTracingPipelineTraceRaysIndirect2) {
                    ss << "VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR::rayTracingPipelineTraceRaysIndirect2 is not "
                          "supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV: {
                VkPhysicalDeviceRayTracingMotionBlurFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceRayTracingMotionBlurFeaturesNV*>(current);
                if (enabling->rayTracingMotionBlur && !supported.rayTracingMotionBlur) {
                    ss << "VkPhysicalDeviceRayTracingMotionBlurFeaturesNV::rayTracingMotionBlur is not supported\n";
                }
                if (enabling->rayTracingMotionBlurPipelineTraceRaysIndirect &&
                    !supported.rayTracingMotionBlurPipelineTraceRaysIndirect) {
                    ss << "VkPhysicalDeviceRayTracingMotionBlurFeaturesNV::rayTracingMotionBlurPipelineTraceRaysIndirect is not "
                          "supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR: {
                VkPhysicalDeviceRayTracingPipelineFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceRayTracingPipelineFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(current);
                if (enabling->rayTracingPipeline && !supported.rayTracingPipeline) {
                    ss << "VkPhysicalDeviceRayTracingPipelineFeaturesKHR::rayTracingPipeline is not supported\n";
                }
                if (enabling->rayTracingPipelineShaderGroupHandleCaptureReplay &&
                    !supported.rayTracingPipelineShaderGroupHandleCaptureReplay) {
                    ss << "VkPhysicalDeviceRayTracingPipelineFeaturesKHR::rayTracingPipelineShaderGroupHandleCaptureReplay is not "
                          "supported\n";
                }
                if (enabling->rayTracingPipelineShaderGroupHandleCaptureReplayMixed &&
                    !supported.rayTracingPipelineShaderGroupHandleCaptureReplayMixed) {
                    ss << "VkPhysicalDeviceRayTracingPipelineFeaturesKHR::rayTracingPipelineShaderGroupHandleCaptureReplayMixed is "
                          "not supported\n";
                }
                if (enabling->rayTracingPipelineTraceRaysIndirect && !supported.rayTracingPipelineTraceRaysIndirect) {
                    ss << "VkPhysicalDeviceRayTracingPipelineFeaturesKHR::rayTracingPipelineTraceRaysIndirect is not supported\n";
                }
                if (enabling->rayTraversalPrimitiveCulling && !supported.rayTraversalPrimitiveCulling) {
                    ss << "VkPhysicalDeviceRayTracingPipelineFeaturesKHR::rayTraversalPrimitiveCulling is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_POSITION_FETCH_FEATURES_KHR: {
                VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR*>(current);
                if (enabling->rayTracingPositionFetch && !supported.rayTracingPositionFetch) {
                    ss << "VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR::rayTracingPositionFetch is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_VALIDATION_FEATURES_NV: {
                VkPhysicalDeviceRayTracingValidationFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceRayTracingValidationFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceRayTracingValidationFeaturesNV*>(current);
                if (enabling->rayTracingValidation && !supported.rayTracingValidation) {
                    ss << "VkPhysicalDeviceRayTracingValidationFeaturesNV::rayTracingValidation is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RELAXED_LINE_RASTERIZATION_FEATURES_IMG: {
                VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG* enabling =
                    reinterpret_cast<const VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG*>(current);
                if (enabling->relaxedLineRasterization && !supported.relaxedLineRasterization) {
                    ss << "VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG::relaxedLineRasterization is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RENDER_PASS_STRIPED_FEATURES_ARM: {
                VkPhysicalDeviceRenderPassStripedFeaturesARM supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceRenderPassStripedFeaturesARM* enabling =
                    reinterpret_cast<const VkPhysicalDeviceRenderPassStripedFeaturesARM*>(current);
                if (enabling->renderPassStriped && !supported.renderPassStriped) {
                    ss << "VkPhysicalDeviceRenderPassStripedFeaturesARM::renderPassStriped is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV: {
                VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(current);
                if (enabling->representativeFragmentTest && !supported.representativeFragmentTest) {
                    ss << "VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV::representativeFragmentTest is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_KHR: {
                VkPhysicalDeviceRobustness2FeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceRobustness2FeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceRobustness2FeaturesKHR*>(current);
                if (enabling->robustBufferAccess2 && !supported.robustBufferAccess2) {
                    ss << "VkPhysicalDeviceRobustness2FeaturesKHR::robustBufferAccess2 is not supported\n";
                }
                if (enabling->robustImageAccess2 && !supported.robustImageAccess2) {
                    ss << "VkPhysicalDeviceRobustness2FeaturesKHR::robustImageAccess2 is not supported\n";
                }
                if (enabling->nullDescriptor && !supported.nullDescriptor) {
                    ss << "VkPhysicalDeviceRobustness2FeaturesKHR::nullDescriptor is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: {
                VkPhysicalDeviceSamplerYcbcrConversionFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceSamplerYcbcrConversionFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(current);
                if (enabling->samplerYcbcrConversion && !supported.samplerYcbcrConversion) {
                    ss << "VkPhysicalDeviceSamplerYcbcrConversionFeatures::samplerYcbcrConversion is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES: {
                VkPhysicalDeviceScalarBlockLayoutFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceScalarBlockLayoutFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceScalarBlockLayoutFeatures*>(current);
                if (enabling->scalarBlockLayout && !supported.scalarBlockLayout) {
                    ss << "VkPhysicalDeviceScalarBlockLayoutFeatures::scalarBlockLayout is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_FEATURES_ARM: {
                VkPhysicalDeviceSchedulingControlsFeaturesARM supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceSchedulingControlsFeaturesARM* enabling =
                    reinterpret_cast<const VkPhysicalDeviceSchedulingControlsFeaturesARM*>(current);
                if (enabling->schedulingControls && !supported.schedulingControls) {
                    ss << "VkPhysicalDeviceSchedulingControlsFeaturesARM::schedulingControls is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES: {
                VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(current);
                if (enabling->separateDepthStencilLayouts && !supported.separateDepthStencilLayouts) {
                    ss << "VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures::separateDepthStencilLayouts is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_64_BIT_INDEXING_FEATURES_EXT: {
                VkPhysicalDeviceShader64BitIndexingFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShader64BitIndexingFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShader64BitIndexingFeaturesEXT*>(current);
                if (enabling->shader64BitIndexing && !supported.shader64BitIndexing) {
                    ss << "VkPhysicalDeviceShader64BitIndexingFeaturesEXT::shader64BitIndexing is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ABORT_FEATURES_KHR: {
                VkPhysicalDeviceShaderAbortFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderAbortFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderAbortFeaturesKHR*>(current);
                if (enabling->shaderAbort && !supported.shaderAbort) {
                    ss << "VkPhysicalDeviceShaderAbortFeaturesKHR::shaderAbort is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT16_VECTOR_FEATURES_NV: {
                VkPhysicalDeviceShaderAtomicFloat16VectorFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderAtomicFloat16VectorFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloat16VectorFeaturesNV*>(current);
                if (enabling->shaderFloat16VectorAtomics && !supported.shaderFloat16VectorAtomics) {
                    ss << "VkPhysicalDeviceShaderAtomicFloat16VectorFeaturesNV::shaderFloat16VectorAtomics is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT: {
                VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT*>(current);
                if (enabling->shaderBufferFloat16Atomics && !supported.shaderBufferFloat16Atomics) {
                    ss << "VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::shaderBufferFloat16Atomics is not supported\n";
                }
                if (enabling->shaderBufferFloat16AtomicAdd && !supported.shaderBufferFloat16AtomicAdd) {
                    ss << "VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::shaderBufferFloat16AtomicAdd is not supported\n";
                }
                if (enabling->shaderBufferFloat16AtomicMinMax && !supported.shaderBufferFloat16AtomicMinMax) {
                    ss << "VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::shaderBufferFloat16AtomicMinMax is not supported\n";
                }
                if (enabling->shaderBufferFloat32AtomicMinMax && !supported.shaderBufferFloat32AtomicMinMax) {
                    ss << "VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::shaderBufferFloat32AtomicMinMax is not supported\n";
                }
                if (enabling->shaderBufferFloat64AtomicMinMax && !supported.shaderBufferFloat64AtomicMinMax) {
                    ss << "VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::shaderBufferFloat64AtomicMinMax is not supported\n";
                }
                if (enabling->shaderSharedFloat16Atomics && !supported.shaderSharedFloat16Atomics) {
                    ss << "VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::shaderSharedFloat16Atomics is not supported\n";
                }
                if (enabling->shaderSharedFloat16AtomicAdd && !supported.shaderSharedFloat16AtomicAdd) {
                    ss << "VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::shaderSharedFloat16AtomicAdd is not supported\n";
                }
                if (enabling->shaderSharedFloat16AtomicMinMax && !supported.shaderSharedFloat16AtomicMinMax) {
                    ss << "VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::shaderSharedFloat16AtomicMinMax is not supported\n";
                }
                if (enabling->shaderSharedFloat32AtomicMinMax && !supported.shaderSharedFloat32AtomicMinMax) {
                    ss << "VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::shaderSharedFloat32AtomicMinMax is not supported\n";
                }
                if (enabling->shaderSharedFloat64AtomicMinMax && !supported.shaderSharedFloat64AtomicMinMax) {
                    ss << "VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::shaderSharedFloat64AtomicMinMax is not supported\n";
                }
                if (enabling->shaderImageFloat32AtomicMinMax && !supported.shaderImageFloat32AtomicMinMax) {
                    ss << "VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::shaderImageFloat32AtomicMinMax is not supported\n";
                }
                if (enabling->sparseImageFloat32AtomicMinMax && !supported.sparseImageFloat32AtomicMinMax) {
                    ss << "VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT::sparseImageFloat32AtomicMinMax is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT: {
                VkPhysicalDeviceShaderAtomicFloatFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(current);
                if (enabling->shaderBufferFloat32Atomics && !supported.shaderBufferFloat32Atomics) {
                    ss << "VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::shaderBufferFloat32Atomics is not supported\n";
                }
                if (enabling->shaderBufferFloat32AtomicAdd && !supported.shaderBufferFloat32AtomicAdd) {
                    ss << "VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::shaderBufferFloat32AtomicAdd is not supported\n";
                }
                if (enabling->shaderBufferFloat64Atomics && !supported.shaderBufferFloat64Atomics) {
                    ss << "VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::shaderBufferFloat64Atomics is not supported\n";
                }
                if (enabling->shaderBufferFloat64AtomicAdd && !supported.shaderBufferFloat64AtomicAdd) {
                    ss << "VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::shaderBufferFloat64AtomicAdd is not supported\n";
                }
                if (enabling->shaderSharedFloat32Atomics && !supported.shaderSharedFloat32Atomics) {
                    ss << "VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::shaderSharedFloat32Atomics is not supported\n";
                }
                if (enabling->shaderSharedFloat32AtomicAdd && !supported.shaderSharedFloat32AtomicAdd) {
                    ss << "VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::shaderSharedFloat32AtomicAdd is not supported\n";
                }
                if (enabling->shaderSharedFloat64Atomics && !supported.shaderSharedFloat64Atomics) {
                    ss << "VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::shaderSharedFloat64Atomics is not supported\n";
                }
                if (enabling->shaderSharedFloat64AtomicAdd && !supported.shaderSharedFloat64AtomicAdd) {
                    ss << "VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::shaderSharedFloat64AtomicAdd is not supported\n";
                }
                if (enabling->shaderImageFloat32Atomics && !supported.shaderImageFloat32Atomics) {
                    ss << "VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::shaderImageFloat32Atomics is not supported\n";
                }
                if (enabling->shaderImageFloat32AtomicAdd && !supported.shaderImageFloat32AtomicAdd) {
                    ss << "VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::shaderImageFloat32AtomicAdd is not supported\n";
                }
                if (enabling->sparseImageFloat32Atomics && !supported.sparseImageFloat32Atomics) {
                    ss << "VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::sparseImageFloat32Atomics is not supported\n";
                }
                if (enabling->sparseImageFloat32AtomicAdd && !supported.sparseImageFloat32AtomicAdd) {
                    ss << "VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::sparseImageFloat32AtomicAdd is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES: {
                VkPhysicalDeviceShaderAtomicInt64Features supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderAtomicInt64Features* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderAtomicInt64Features*>(current);
                if (enabling->shaderBufferInt64Atomics && !supported.shaderBufferInt64Atomics) {
                    ss << "VkPhysicalDeviceShaderAtomicInt64Features::shaderBufferInt64Atomics is not supported\n";
                }
                if (enabling->shaderSharedInt64Atomics && !supported.shaderSharedInt64Atomics) {
                    ss << "VkPhysicalDeviceShaderAtomicInt64Features::shaderSharedInt64Atomics is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_BFLOAT16_FEATURES_KHR: {
                VkPhysicalDeviceShaderBfloat16FeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderBfloat16FeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderBfloat16FeaturesKHR*>(current);
                if (enabling->shaderBFloat16Type && !supported.shaderBFloat16Type) {
                    ss << "VkPhysicalDeviceShaderBfloat16FeaturesKHR::shaderBFloat16Type is not supported\n";
                }
                if (enabling->shaderBFloat16DotProduct && !supported.shaderBFloat16DotProduct) {
                    ss << "VkPhysicalDeviceShaderBfloat16FeaturesKHR::shaderBFloat16DotProduct is not supported\n";
                }
                if (enabling->shaderBFloat16CooperativeMatrix && !supported.shaderBFloat16CooperativeMatrix) {
                    ss << "VkPhysicalDeviceShaderBfloat16FeaturesKHR::shaderBFloat16CooperativeMatrix is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR: {
                VkPhysicalDeviceShaderClockFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderClockFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderClockFeaturesKHR*>(current);
                if (enabling->shaderSubgroupClock && !supported.shaderSubgroupClock) {
                    ss << "VkPhysicalDeviceShaderClockFeaturesKHR::shaderSubgroupClock is not supported\n";
                }
                if (enabling->shaderDeviceClock && !supported.shaderDeviceClock) {
                    ss << "VkPhysicalDeviceShaderClockFeaturesKHR::shaderDeviceClock is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CONSTANT_DATA_FEATURES_KHR: {
                VkPhysicalDeviceShaderConstantDataFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderConstantDataFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderConstantDataFeaturesKHR*>(current);
                if (enabling->shaderConstantData && !supported.shaderConstantData) {
                    ss << "VkPhysicalDeviceShaderConstantDataFeaturesKHR::shaderConstantData is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_FEATURES_ARM: {
                VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM*>(current);
                if (enabling->shaderCoreBuiltins && !supported.shaderCoreBuiltins) {
                    ss << "VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM::shaderCoreBuiltins is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES: {
                VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures*>(current);
                if (enabling->shaderDemoteToHelperInvocation && !supported.shaderDemoteToHelperInvocation) {
                    ss << "VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures::shaderDemoteToHelperInvocation is not "
                          "supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES: {
                VkPhysicalDeviceShaderDrawParametersFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderDrawParametersFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderDrawParametersFeatures*>(current);
                if (enabling->shaderDrawParameters && !supported.shaderDrawParameters) {
                    ss << "VkPhysicalDeviceShaderDrawParametersFeatures::shaderDrawParameters is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_FEATURES_AMD: {
                VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD*>(current);
                if (enabling->shaderEarlyAndLateFragmentTests && !supported.shaderEarlyAndLateFragmentTests) {
                    ss << "VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD::shaderEarlyAndLateFragmentTests is not "
                          "supported\n";
                }
                break;
            }
#ifdef VK_ENABLE_BETA_EXTENSIONS
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ENQUEUE_FEATURES_AMDX: {
                VkPhysicalDeviceShaderEnqueueFeaturesAMDX supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderEnqueueFeaturesAMDX* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderEnqueueFeaturesAMDX*>(current);
                if (enabling->shaderEnqueue && !supported.shaderEnqueue) {
                    ss << "VkPhysicalDeviceShaderEnqueueFeaturesAMDX::shaderEnqueue is not supported\n";
                }
                if (enabling->shaderMeshEnqueue && !supported.shaderMeshEnqueue) {
                    ss << "VkPhysicalDeviceShaderEnqueueFeaturesAMDX::shaderMeshEnqueue is not supported\n";
                }
                break;
            }
#endif  // VK_ENABLE_BETA_EXTENSIONS
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES: {
                VkPhysicalDeviceShaderExpectAssumeFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderExpectAssumeFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderExpectAssumeFeatures*>(current);
                if (enabling->shaderExpectAssume && !supported.shaderExpectAssume) {
                    ss << "VkPhysicalDeviceShaderExpectAssumeFeatures::shaderExpectAssume is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES: {
                VkPhysicalDeviceShaderFloat16Int8Features supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderFloat16Int8Features* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderFloat16Int8Features*>(current);
                if (enabling->shaderFloat16 && !supported.shaderFloat16) {
                    ss << "VkPhysicalDeviceShaderFloat16Int8Features::shaderFloat16 is not supported\n";
                }
                if (enabling->shaderInt8 && !supported.shaderInt8) {
                    ss << "VkPhysicalDeviceShaderFloat16Int8Features::shaderInt8 is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT8_FEATURES_EXT: {
                VkPhysicalDeviceShaderFloat8FeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderFloat8FeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderFloat8FeaturesEXT*>(current);
                if (enabling->shaderFloat8 && !supported.shaderFloat8) {
                    ss << "VkPhysicalDeviceShaderFloat8FeaturesEXT::shaderFloat8 is not supported\n";
                }
                if (enabling->shaderFloat8CooperativeMatrix && !supported.shaderFloat8CooperativeMatrix) {
                    ss << "VkPhysicalDeviceShaderFloat8FeaturesEXT::shaderFloat8CooperativeMatrix is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT_CONTROLS_2_FEATURES: {
                VkPhysicalDeviceShaderFloatControls2Features supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderFloatControls2Features* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderFloatControls2Features*>(current);
                if (enabling->shaderFloatControls2 && !supported.shaderFloatControls2) {
                    ss << "VkPhysicalDeviceShaderFloatControls2Features::shaderFloatControls2 is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FMA_FEATURES_KHR: {
                VkPhysicalDeviceShaderFmaFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderFmaFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderFmaFeaturesKHR*>(current);
                if (enabling->shaderFmaFloat16 && !supported.shaderFmaFloat16) {
                    ss << "VkPhysicalDeviceShaderFmaFeaturesKHR::shaderFmaFloat16 is not supported\n";
                }
                if (enabling->shaderFmaFloat32 && !supported.shaderFmaFloat32) {
                    ss << "VkPhysicalDeviceShaderFmaFeaturesKHR::shaderFmaFloat32 is not supported\n";
                }
                if (enabling->shaderFmaFloat64 && !supported.shaderFmaFloat64) {
                    ss << "VkPhysicalDeviceShaderFmaFeaturesKHR::shaderFmaFloat64 is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT: {
                VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(current);
                if (enabling->shaderImageInt64Atomics && !supported.shaderImageInt64Atomics) {
                    ss << "VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT::shaderImageInt64Atomics is not supported\n";
                }
                if (enabling->sparseImageInt64Atomics && !supported.sparseImageInt64Atomics) {
                    ss << "VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT::sparseImageInt64Atomics is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV: {
                VkPhysicalDeviceShaderImageFootprintFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderImageFootprintFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(current);
                if (enabling->imageFootprint && !supported.imageFootprint) {
                    ss << "VkPhysicalDeviceShaderImageFootprintFeaturesNV::imageFootprint is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INSTRUMENTATION_FEATURES_ARM: {
                VkPhysicalDeviceShaderInstrumentationFeaturesARM supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderInstrumentationFeaturesARM* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderInstrumentationFeaturesARM*>(current);
                if (enabling->shaderInstrumentation && !supported.shaderInstrumentation) {
                    ss << "VkPhysicalDeviceShaderInstrumentationFeaturesARM::shaderInstrumentation is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES: {
                VkPhysicalDeviceShaderIntegerDotProductFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderIntegerDotProductFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderIntegerDotProductFeatures*>(current);
                if (enabling->shaderIntegerDotProduct && !supported.shaderIntegerDotProduct) {
                    ss << "VkPhysicalDeviceShaderIntegerDotProductFeatures::shaderIntegerDotProduct is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL: {
                VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(current);
                if (enabling->shaderIntegerFunctions2 && !supported.shaderIntegerFunctions2) {
                    ss << "VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL::shaderIntegerFunctions2 is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_LONG_VECTOR_FEATURES_EXT: {
                VkPhysicalDeviceShaderLongVectorFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderLongVectorFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderLongVectorFeaturesEXT*>(current);
                if (enabling->longVector && !supported.longVector) {
                    ss << "VkPhysicalDeviceShaderLongVectorFeaturesEXT::longVector is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MAXIMAL_RECONVERGENCE_FEATURES_KHR: {
                VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR*>(current);
                if (enabling->shaderMaximalReconvergence && !supported.shaderMaximalReconvergence) {
                    ss << "VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR::shaderMaximalReconvergence is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MIXED_FLOAT_DOT_PRODUCT_FEATURES_VALVE: {
                VkPhysicalDeviceShaderMixedFloatDotProductFeaturesVALVE supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderMixedFloatDotProductFeaturesVALVE* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderMixedFloatDotProductFeaturesVALVE*>(current);
                if (enabling->shaderMixedFloatDotProductFloat16AccFloat32 &&
                    !supported.shaderMixedFloatDotProductFloat16AccFloat32) {
                    ss << "VkPhysicalDeviceShaderMixedFloatDotProductFeaturesVALVE::shaderMixedFloatDotProductFloat16AccFloat32 is "
                          "not supported\n";
                }
                if (enabling->shaderMixedFloatDotProductFloat16AccFloat16 &&
                    !supported.shaderMixedFloatDotProductFloat16AccFloat16) {
                    ss << "VkPhysicalDeviceShaderMixedFloatDotProductFeaturesVALVE::shaderMixedFloatDotProductFloat16AccFloat16 is "
                          "not supported\n";
                }
                if (enabling->shaderMixedFloatDotProductBFloat16Acc && !supported.shaderMixedFloatDotProductBFloat16Acc) {
                    ss << "VkPhysicalDeviceShaderMixedFloatDotProductFeaturesVALVE::shaderMixedFloatDotProductBFloat16Acc is not "
                          "supported\n";
                }
                if (enabling->shaderMixedFloatDotProductFloat8AccFloat32 && !supported.shaderMixedFloatDotProductFloat8AccFloat32) {
                    ss << "VkPhysicalDeviceShaderMixedFloatDotProductFeaturesVALVE::shaderMixedFloatDotProductFloat8AccFloat32 is "
                          "not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_FEATURES_EXT: {
                VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT*>(current);
                if (enabling->shaderModuleIdentifier && !supported.shaderModuleIdentifier) {
                    ss << "VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT::shaderModuleIdentifier is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT: {
                VkPhysicalDeviceShaderObjectFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderObjectFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderObjectFeaturesEXT*>(current);
                if (enabling->shaderObject && !supported.shaderObject) {
                    ss << "VkPhysicalDeviceShaderObjectFeaturesEXT::shaderObject is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_QUAD_CONTROL_FEATURES_KHR: {
                VkPhysicalDeviceShaderQuadControlFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderQuadControlFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderQuadControlFeaturesKHR*>(current);
                if (enabling->shaderQuadControl && !supported.shaderQuadControl) {
                    ss << "VkPhysicalDeviceShaderQuadControlFeaturesKHR::shaderQuadControl is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_RELAXED_EXTENDED_INSTRUCTION_FEATURES_KHR: {
                VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR*>(current);
                if (enabling->shaderRelaxedExtendedInstruction && !supported.shaderRelaxedExtendedInstruction) {
                    ss << "VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR::shaderRelaxedExtendedInstruction is not "
                          "supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_REPLICATED_COMPOSITES_FEATURES_EXT: {
                VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT*>(current);
                if (enabling->shaderReplicatedComposites && !supported.shaderReplicatedComposites) {
                    ss << "VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT::shaderReplicatedComposites is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV: {
                VkPhysicalDeviceShaderSMBuiltinsFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(current);
                if (enabling->shaderSMBuiltins && !supported.shaderSMBuiltins) {
                    ss << "VkPhysicalDeviceShaderSMBuiltinsFeaturesNV::shaderSMBuiltins is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES: {
                VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(current);
                if (enabling->shaderSubgroupExtendedTypes && !supported.shaderSubgroupExtendedTypes) {
                    ss << "VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures::shaderSubgroupExtendedTypes is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_PARTITIONED_FEATURES_EXT: {
                VkPhysicalDeviceShaderSubgroupPartitionedFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderSubgroupPartitionedFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderSubgroupPartitionedFeaturesEXT*>(current);
                if (enabling->shaderSubgroupPartitioned && !supported.shaderSubgroupPartitioned) {
                    ss << "VkPhysicalDeviceShaderSubgroupPartitionedFeaturesEXT::shaderSubgroupPartitioned is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES: {
                VkPhysicalDeviceShaderSubgroupRotateFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderSubgroupRotateFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderSubgroupRotateFeatures*>(current);
                if (enabling->shaderSubgroupRotate && !supported.shaderSubgroupRotate) {
                    ss << "VkPhysicalDeviceShaderSubgroupRotateFeatures::shaderSubgroupRotate is not supported\n";
                }
                if (enabling->shaderSubgroupRotateClustered && !supported.shaderSubgroupRotateClustered) {
                    ss << "VkPhysicalDeviceShaderSubgroupRotateFeatures::shaderSubgroupRotateClustered is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR: {
                VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR*>(current);
                if (enabling->shaderSubgroupUniformControlFlow && !supported.shaderSubgroupUniformControlFlow) {
                    ss << "VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR::shaderSubgroupUniformControlFlow is not "
                          "supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES: {
                VkPhysicalDeviceShaderTerminateInvocationFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderTerminateInvocationFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderTerminateInvocationFeatures*>(current);
                if (enabling->shaderTerminateInvocation && !supported.shaderTerminateInvocation) {
                    ss << "VkPhysicalDeviceShaderTerminateInvocationFeatures::shaderTerminateInvocation is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TILE_IMAGE_FEATURES_EXT: {
                VkPhysicalDeviceShaderTileImageFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderTileImageFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderTileImageFeaturesEXT*>(current);
                if (enabling->shaderTileImageColorReadAccess && !supported.shaderTileImageColorReadAccess) {
                    ss << "VkPhysicalDeviceShaderTileImageFeaturesEXT::shaderTileImageColorReadAccess is not supported\n";
                }
                if (enabling->shaderTileImageDepthReadAccess && !supported.shaderTileImageDepthReadAccess) {
                    ss << "VkPhysicalDeviceShaderTileImageFeaturesEXT::shaderTileImageDepthReadAccess is not supported\n";
                }
                if (enabling->shaderTileImageStencilReadAccess && !supported.shaderTileImageStencilReadAccess) {
                    ss << "VkPhysicalDeviceShaderTileImageFeaturesEXT::shaderTileImageStencilReadAccess is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_UNIFORM_BUFFER_UNSIZED_ARRAY_FEATURES_EXT: {
                VkPhysicalDeviceShaderUniformBufferUnsizedArrayFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderUniformBufferUnsizedArrayFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderUniformBufferUnsizedArrayFeaturesEXT*>(current);
                if (enabling->shaderUniformBufferUnsizedArray && !supported.shaderUniformBufferUnsizedArray) {
                    ss << "VkPhysicalDeviceShaderUniformBufferUnsizedArrayFeaturesEXT::shaderUniformBufferUnsizedArray is not "
                          "supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_UNTYPED_POINTERS_FEATURES_KHR: {
                VkPhysicalDeviceShaderUntypedPointersFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShaderUntypedPointersFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShaderUntypedPointersFeaturesKHR*>(current);
                if (enabling->shaderUntypedPointers && !supported.shaderUntypedPointers) {
                    ss << "VkPhysicalDeviceShaderUntypedPointersFeaturesKHR::shaderUntypedPointers is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV: {
                VkPhysicalDeviceShadingRateImageFeaturesNV supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceShadingRateImageFeaturesNV* enabling =
                    reinterpret_cast<const VkPhysicalDeviceShadingRateImageFeaturesNV*>(current);
                if (enabling->shadingRateImage && !supported.shadingRateImage) {
                    ss << "VkPhysicalDeviceShadingRateImageFeaturesNV::shadingRateImage is not supported\n";
                }
                if (enabling->shadingRateCoarseSampleOrder && !supported.shadingRateCoarseSampleOrder) {
                    ss << "VkPhysicalDeviceShadingRateImageFeaturesNV::shadingRateCoarseSampleOrder is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES: {
                VkPhysicalDeviceSubgroupSizeControlFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceSubgroupSizeControlFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlFeatures*>(current);
                if (enabling->subgroupSizeControl && !supported.subgroupSizeControl) {
                    ss << "VkPhysicalDeviceSubgroupSizeControlFeatures::subgroupSizeControl is not supported\n";
                }
                if (enabling->computeFullSubgroups && !supported.computeFullSubgroups) {
                    ss << "VkPhysicalDeviceSubgroupSizeControlFeatures::computeFullSubgroups is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_MERGE_FEEDBACK_FEATURES_EXT: {
                VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT*>(current);
                if (enabling->subpassMergeFeedback && !supported.subpassMergeFeedback) {
                    ss << "VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT::subpassMergeFeedback is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI: {
                VkPhysicalDeviceSubpassShadingFeaturesHUAWEI supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* enabling =
                    reinterpret_cast<const VkPhysicalDeviceSubpassShadingFeaturesHUAWEI*>(current);
                if (enabling->subpassShading && !supported.subpassShading) {
                    ss << "VkPhysicalDeviceSubpassShadingFeaturesHUAWEI::subpassShading is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_KHR: {
                VkPhysicalDeviceSwapchainMaintenance1FeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceSwapchainMaintenance1FeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceSwapchainMaintenance1FeaturesKHR*>(current);
                if (enabling->swapchainMaintenance1 && !supported.swapchainMaintenance1) {
                    ss << "VkPhysicalDeviceSwapchainMaintenance1FeaturesKHR::swapchainMaintenance1 is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES: {
                VkPhysicalDeviceSynchronization2Features supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceSynchronization2Features* enabling =
                    reinterpret_cast<const VkPhysicalDeviceSynchronization2Features*>(current);
                if (enabling->synchronization2 && !supported.synchronization2) {
                    ss << "VkPhysicalDeviceSynchronization2Features::synchronization2 is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TENSOR_FEATURES_ARM: {
                VkPhysicalDeviceTensorFeaturesARM supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceTensorFeaturesARM* enabling =
                    reinterpret_cast<const VkPhysicalDeviceTensorFeaturesARM*>(current);
                if (enabling->tensorNonPacked && !supported.tensorNonPacked) {
                    ss << "VkPhysicalDeviceTensorFeaturesARM::tensorNonPacked is not supported\n";
                }
                if (enabling->shaderTensorAccess && !supported.shaderTensorAccess) {
                    ss << "VkPhysicalDeviceTensorFeaturesARM::shaderTensorAccess is not supported\n";
                }
                if (enabling->shaderStorageTensorArrayDynamicIndexing && !supported.shaderStorageTensorArrayDynamicIndexing) {
                    ss << "VkPhysicalDeviceTensorFeaturesARM::shaderStorageTensorArrayDynamicIndexing is not supported\n";
                }
                if (enabling->shaderStorageTensorArrayNonUniformIndexing && !supported.shaderStorageTensorArrayNonUniformIndexing) {
                    ss << "VkPhysicalDeviceTensorFeaturesARM::shaderStorageTensorArrayNonUniformIndexing is not supported\n";
                }
                if (enabling->descriptorBindingStorageTensorUpdateAfterBind &&
                    !supported.descriptorBindingStorageTensorUpdateAfterBind) {
                    ss << "VkPhysicalDeviceTensorFeaturesARM::descriptorBindingStorageTensorUpdateAfterBind is not supported\n";
                }
                if (enabling->tensors && !supported.tensors) {
                    ss << "VkPhysicalDeviceTensorFeaturesARM::tensors is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: {
                VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(current);
                if (enabling->texelBufferAlignment && !supported.texelBufferAlignment) {
                    ss << "VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT::texelBufferAlignment is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_3D_FEATURES_EXT: {
                VkPhysicalDeviceTextureCompressionASTC3DFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceTextureCompressionASTC3DFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceTextureCompressionASTC3DFeaturesEXT*>(current);
                if (enabling->textureCompressionASTC_3D && !supported.textureCompressionASTC_3D) {
                    ss << "VkPhysicalDeviceTextureCompressionASTC3DFeaturesEXT::textureCompressionASTC_3D is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES: {
                VkPhysicalDeviceTextureCompressionASTCHDRFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceTextureCompressionASTCHDRFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceTextureCompressionASTCHDRFeatures*>(current);
                if (enabling->textureCompressionASTC_HDR && !supported.textureCompressionASTC_HDR) {
                    ss << "VkPhysicalDeviceTextureCompressionASTCHDRFeatures::textureCompressionASTC_HDR is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_THROTTLE_HINT_FEATURES_SEC: {
                VkPhysicalDeviceThrottleHintFeaturesSEC supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceThrottleHintFeaturesSEC* enabling =
                    reinterpret_cast<const VkPhysicalDeviceThrottleHintFeaturesSEC*>(current);
                if (enabling->throttleHint && !supported.throttleHint) {
                    ss << "VkPhysicalDeviceThrottleHintFeaturesSEC::throttleHint is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_MEMORY_HEAP_FEATURES_QCOM: {
                VkPhysicalDeviceTileMemoryHeapFeaturesQCOM supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceTileMemoryHeapFeaturesQCOM* enabling =
                    reinterpret_cast<const VkPhysicalDeviceTileMemoryHeapFeaturesQCOM*>(current);
                if (enabling->tileMemoryHeap && !supported.tileMemoryHeap) {
                    ss << "VkPhysicalDeviceTileMemoryHeapFeaturesQCOM::tileMemoryHeap is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_PROPERTIES_FEATURES_QCOM: {
                VkPhysicalDeviceTilePropertiesFeaturesQCOM supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceTilePropertiesFeaturesQCOM* enabling =
                    reinterpret_cast<const VkPhysicalDeviceTilePropertiesFeaturesQCOM*>(current);
                if (enabling->tileProperties && !supported.tileProperties) {
                    ss << "VkPhysicalDeviceTilePropertiesFeaturesQCOM::tileProperties is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_SHADING_FEATURES_QCOM: {
                VkPhysicalDeviceTileShadingFeaturesQCOM supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceTileShadingFeaturesQCOM* enabling =
                    reinterpret_cast<const VkPhysicalDeviceTileShadingFeaturesQCOM*>(current);
                if (enabling->tileShading && !supported.tileShading) {
                    ss << "VkPhysicalDeviceTileShadingFeaturesQCOM::tileShading is not supported\n";
                }
                if (enabling->tileShadingFragmentStage && !supported.tileShadingFragmentStage) {
                    ss << "VkPhysicalDeviceTileShadingFeaturesQCOM::tileShadingFragmentStage is not supported\n";
                }
                if (enabling->tileShadingColorAttachments && !supported.tileShadingColorAttachments) {
                    ss << "VkPhysicalDeviceTileShadingFeaturesQCOM::tileShadingColorAttachments is not supported\n";
                }
                if (enabling->tileShadingDepthAttachments && !supported.tileShadingDepthAttachments) {
                    ss << "VkPhysicalDeviceTileShadingFeaturesQCOM::tileShadingDepthAttachments is not supported\n";
                }
                if (enabling->tileShadingStencilAttachments && !supported.tileShadingStencilAttachments) {
                    ss << "VkPhysicalDeviceTileShadingFeaturesQCOM::tileShadingStencilAttachments is not supported\n";
                }
                if (enabling->tileShadingInputAttachments && !supported.tileShadingInputAttachments) {
                    ss << "VkPhysicalDeviceTileShadingFeaturesQCOM::tileShadingInputAttachments is not supported\n";
                }
                if (enabling->tileShadingSampledAttachments && !supported.tileShadingSampledAttachments) {
                    ss << "VkPhysicalDeviceTileShadingFeaturesQCOM::tileShadingSampledAttachments is not supported\n";
                }
                if (enabling->tileShadingPerTileDraw && !supported.tileShadingPerTileDraw) {
                    ss << "VkPhysicalDeviceTileShadingFeaturesQCOM::tileShadingPerTileDraw is not supported\n";
                }
                if (enabling->tileShadingPerTileDispatch && !supported.tileShadingPerTileDispatch) {
                    ss << "VkPhysicalDeviceTileShadingFeaturesQCOM::tileShadingPerTileDispatch is not supported\n";
                }
                if (enabling->tileShadingDispatchTile && !supported.tileShadingDispatchTile) {
                    ss << "VkPhysicalDeviceTileShadingFeaturesQCOM::tileShadingDispatchTile is not supported\n";
                }
                if (enabling->tileShadingApron && !supported.tileShadingApron) {
                    ss << "VkPhysicalDeviceTileShadingFeaturesQCOM::tileShadingApron is not supported\n";
                }
                if (enabling->tileShadingAnisotropicApron && !supported.tileShadingAnisotropicApron) {
                    ss << "VkPhysicalDeviceTileShadingFeaturesQCOM::tileShadingAnisotropicApron is not supported\n";
                }
                if (enabling->tileShadingAtomicOps && !supported.tileShadingAtomicOps) {
                    ss << "VkPhysicalDeviceTileShadingFeaturesQCOM::tileShadingAtomicOps is not supported\n";
                }
                if (enabling->tileShadingImageProcessing && !supported.tileShadingImageProcessing) {
                    ss << "VkPhysicalDeviceTileShadingFeaturesQCOM::tileShadingImageProcessing is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES: {
                VkPhysicalDeviceTimelineSemaphoreFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceTimelineSemaphoreFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreFeatures*>(current);
                if (enabling->timelineSemaphore && !supported.timelineSemaphore) {
                    ss << "VkPhysicalDeviceTimelineSemaphoreFeatures::timelineSemaphore is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT: {
                VkPhysicalDeviceTransformFeedbackFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceTransformFeedbackFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(current);
                if (enabling->transformFeedback && !supported.transformFeedback) {
                    ss << "VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback is not supported\n";
                }
                if (enabling->geometryStreams && !supported.geometryStreams) {
                    ss << "VkPhysicalDeviceTransformFeedbackFeaturesEXT::geometryStreams is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFIED_IMAGE_LAYOUTS_FEATURES_KHR: {
                VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR*>(current);
                if (enabling->unifiedImageLayouts && !supported.unifiedImageLayouts) {
                    ss << "VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR::unifiedImageLayouts is not supported\n";
                }
                if (enabling->unifiedImageLayoutsVideo && !supported.unifiedImageLayoutsVideo) {
                    ss << "VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR::unifiedImageLayoutsVideo is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES: {
                VkPhysicalDeviceUniformBufferStandardLayoutFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceUniformBufferStandardLayoutFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(current);
                if (enabling->uniformBufferStandardLayout && !supported.uniformBufferStandardLayout) {
                    ss << "VkPhysicalDeviceUniformBufferStandardLayoutFeatures::uniformBufferStandardLayout is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES: {
                VkPhysicalDeviceVariablePointersFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceVariablePointersFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceVariablePointersFeatures*>(current);
                if (enabling->variablePointersStorageBuffer && !supported.variablePointersStorageBuffer) {
                    ss << "VkPhysicalDeviceVariablePointersFeatures::variablePointersStorageBuffer is not supported\n";
                }
                if (enabling->variablePointers && !supported.variablePointers) {
                    ss << "VkPhysicalDeviceVariablePointersFeatures::variablePointers is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES: {
                VkPhysicalDeviceVertexAttributeDivisorFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceVertexAttributeDivisorFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorFeatures*>(current);
                if (enabling->vertexAttributeInstanceRateDivisor && !supported.vertexAttributeInstanceRateDivisor) {
                    ss << "VkPhysicalDeviceVertexAttributeDivisorFeatures::vertexAttributeInstanceRateDivisor is not supported\n";
                }
                if (enabling->vertexAttributeInstanceRateZeroDivisor && !supported.vertexAttributeInstanceRateZeroDivisor) {
                    ss << "VkPhysicalDeviceVertexAttributeDivisorFeatures::vertexAttributeInstanceRateZeroDivisor is not "
                          "supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_ROBUSTNESS_FEATURES_EXT: {
                VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT*>(current);
                if (enabling->vertexAttributeRobustness && !supported.vertexAttributeRobustness) {
                    ss << "VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT::vertexAttributeRobustness is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT: {
                VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT*>(current);
                if (enabling->vertexInputDynamicState && !supported.vertexInputDynamicState) {
                    ss << "VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT::vertexInputDynamicState is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_DECODE_VP9_FEATURES_KHR: {
                VkPhysicalDeviceVideoDecodeVP9FeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceVideoDecodeVP9FeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceVideoDecodeVP9FeaturesKHR*>(current);
                if (enabling->videoDecodeVP9 && !supported.videoDecodeVP9) {
                    ss << "VkPhysicalDeviceVideoDecodeVP9FeaturesKHR::videoDecodeVP9 is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_AV1_FEATURES_KHR: {
                VkPhysicalDeviceVideoEncodeAV1FeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceVideoEncodeAV1FeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceVideoEncodeAV1FeaturesKHR*>(current);
                if (enabling->videoEncodeAV1 && !supported.videoEncodeAV1) {
                    ss << "VkPhysicalDeviceVideoEncodeAV1FeaturesKHR::videoEncodeAV1 is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_INTRA_REFRESH_FEATURES_KHR: {
                VkPhysicalDeviceVideoEncodeIntraRefreshFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceVideoEncodeIntraRefreshFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceVideoEncodeIntraRefreshFeaturesKHR*>(current);
                if (enabling->videoEncodeIntraRefresh && !supported.videoEncodeIntraRefresh) {
                    ss << "VkPhysicalDeviceVideoEncodeIntraRefreshFeaturesKHR::videoEncodeIntraRefresh is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_QUANTIZATION_MAP_FEATURES_KHR: {
                VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR*>(current);
                if (enabling->videoEncodeQuantizationMap && !supported.videoEncodeQuantizationMap) {
                    ss << "VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR::videoEncodeQuantizationMap is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_RGB_CONVERSION_FEATURES_VALVE: {
                VkPhysicalDeviceVideoEncodeRgbConversionFeaturesVALVE supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceVideoEncodeRgbConversionFeaturesVALVE* enabling =
                    reinterpret_cast<const VkPhysicalDeviceVideoEncodeRgbConversionFeaturesVALVE*>(current);
                if (enabling->videoEncodeRgbConversion && !supported.videoEncodeRgbConversion) {
                    ss << "VkPhysicalDeviceVideoEncodeRgbConversionFeaturesVALVE::videoEncodeRgbConversion is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_1_FEATURES_KHR: {
                VkPhysicalDeviceVideoMaintenance1FeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceVideoMaintenance1FeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceVideoMaintenance1FeaturesKHR*>(current);
                if (enabling->videoMaintenance1 && !supported.videoMaintenance1) {
                    ss << "VkPhysicalDeviceVideoMaintenance1FeaturesKHR::videoMaintenance1 is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_2_FEATURES_KHR: {
                VkPhysicalDeviceVideoMaintenance2FeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceVideoMaintenance2FeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceVideoMaintenance2FeaturesKHR*>(current);
                if (enabling->videoMaintenance2 && !supported.videoMaintenance2) {
                    ss << "VkPhysicalDeviceVideoMaintenance2FeaturesKHR::videoMaintenance2 is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: {
                VkPhysicalDeviceVulkan11Features supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceVulkan11Features* enabling =
                    reinterpret_cast<const VkPhysicalDeviceVulkan11Features*>(current);
                if (enabling->storageBuffer16BitAccess && !supported.storageBuffer16BitAccess) {
                    ss << "VkPhysicalDeviceVulkan11Features::storageBuffer16BitAccess is not supported\n";
                }
                if (enabling->uniformAndStorageBuffer16BitAccess && !supported.uniformAndStorageBuffer16BitAccess) {
                    ss << "VkPhysicalDeviceVulkan11Features::uniformAndStorageBuffer16BitAccess is not supported\n";
                }
                if (enabling->storagePushConstant16 && !supported.storagePushConstant16) {
                    ss << "VkPhysicalDeviceVulkan11Features::storagePushConstant16 is not supported\n";
                }
                if (enabling->storageInputOutput16 && !supported.storageInputOutput16) {
                    ss << "VkPhysicalDeviceVulkan11Features::storageInputOutput16 is not supported\n";
                }
                if (enabling->multiview && !supported.multiview) {
                    ss << "VkPhysicalDeviceVulkan11Features::multiview is not supported\n";
                }
                if (enabling->multiviewGeometryShader && !supported.multiviewGeometryShader) {
                    ss << "VkPhysicalDeviceVulkan11Features::multiviewGeometryShader is not supported\n";
                }
                if (enabling->multiviewTessellationShader && !supported.multiviewTessellationShader) {
                    ss << "VkPhysicalDeviceVulkan11Features::multiviewTessellationShader is not supported\n";
                }
                if (enabling->variablePointersStorageBuffer && !supported.variablePointersStorageBuffer) {
                    ss << "VkPhysicalDeviceVulkan11Features::variablePointersStorageBuffer is not supported\n";
                }
                if (enabling->variablePointers && !supported.variablePointers) {
                    ss << "VkPhysicalDeviceVulkan11Features::variablePointers is not supported\n";
                }
                if (enabling->protectedMemory && !supported.protectedMemory) {
                    ss << "VkPhysicalDeviceVulkan11Features::protectedMemory is not supported\n";
                }
                if (enabling->samplerYcbcrConversion && !supported.samplerYcbcrConversion) {
                    ss << "VkPhysicalDeviceVulkan11Features::samplerYcbcrConversion is not supported\n";
                }
                if (enabling->shaderDrawParameters && !supported.shaderDrawParameters) {
                    ss << "VkPhysicalDeviceVulkan11Features::shaderDrawParameters is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: {
                VkPhysicalDeviceVulkan12Features supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceVulkan12Features* enabling =
                    reinterpret_cast<const VkPhysicalDeviceVulkan12Features*>(current);
                if (enabling->samplerMirrorClampToEdge && !supported.samplerMirrorClampToEdge) {
                    ss << "VkPhysicalDeviceVulkan12Features::samplerMirrorClampToEdge is not supported\n";
                }
                if (enabling->drawIndirectCount && !supported.drawIndirectCount) {
                    ss << "VkPhysicalDeviceVulkan12Features::drawIndirectCount is not supported\n";
                }
                if (enabling->storageBuffer8BitAccess && !supported.storageBuffer8BitAccess) {
                    ss << "VkPhysicalDeviceVulkan12Features::storageBuffer8BitAccess is not supported\n";
                }
                if (enabling->uniformAndStorageBuffer8BitAccess && !supported.uniformAndStorageBuffer8BitAccess) {
                    ss << "VkPhysicalDeviceVulkan12Features::uniformAndStorageBuffer8BitAccess is not supported\n";
                }
                if (enabling->storagePushConstant8 && !supported.storagePushConstant8) {
                    ss << "VkPhysicalDeviceVulkan12Features::storagePushConstant8 is not supported\n";
                }
                if (enabling->shaderBufferInt64Atomics && !supported.shaderBufferInt64Atomics) {
                    ss << "VkPhysicalDeviceVulkan12Features::shaderBufferInt64Atomics is not supported\n";
                }
                if (enabling->shaderSharedInt64Atomics && !supported.shaderSharedInt64Atomics) {
                    ss << "VkPhysicalDeviceVulkan12Features::shaderSharedInt64Atomics is not supported\n";
                }
                if (enabling->shaderFloat16 && !supported.shaderFloat16) {
                    ss << "VkPhysicalDeviceVulkan12Features::shaderFloat16 is not supported\n";
                }
                if (enabling->shaderInt8 && !supported.shaderInt8) {
                    ss << "VkPhysicalDeviceVulkan12Features::shaderInt8 is not supported\n";
                }
                if (enabling->descriptorIndexing && !supported.descriptorIndexing) {
                    ss << "VkPhysicalDeviceVulkan12Features::descriptorIndexing is not supported\n";
                }
                if (enabling->shaderInputAttachmentArrayDynamicIndexing && !supported.shaderInputAttachmentArrayDynamicIndexing) {
                    ss << "VkPhysicalDeviceVulkan12Features::shaderInputAttachmentArrayDynamicIndexing is not supported\n";
                }
                if (enabling->shaderUniformTexelBufferArrayDynamicIndexing &&
                    !supported.shaderUniformTexelBufferArrayDynamicIndexing) {
                    ss << "VkPhysicalDeviceVulkan12Features::shaderUniformTexelBufferArrayDynamicIndexing is not supported\n";
                }
                if (enabling->shaderStorageTexelBufferArrayDynamicIndexing &&
                    !supported.shaderStorageTexelBufferArrayDynamicIndexing) {
                    ss << "VkPhysicalDeviceVulkan12Features::shaderStorageTexelBufferArrayDynamicIndexing is not supported\n";
                }
                if (enabling->shaderUniformBufferArrayNonUniformIndexing && !supported.shaderUniformBufferArrayNonUniformIndexing) {
                    ss << "VkPhysicalDeviceVulkan12Features::shaderUniformBufferArrayNonUniformIndexing is not supported\n";
                }
                if (enabling->shaderSampledImageArrayNonUniformIndexing && !supported.shaderSampledImageArrayNonUniformIndexing) {
                    ss << "VkPhysicalDeviceVulkan12Features::shaderSampledImageArrayNonUniformIndexing is not supported\n";
                }
                if (enabling->shaderStorageBufferArrayNonUniformIndexing && !supported.shaderStorageBufferArrayNonUniformIndexing) {
                    ss << "VkPhysicalDeviceVulkan12Features::shaderStorageBufferArrayNonUniformIndexing is not supported\n";
                }
                if (enabling->shaderStorageImageArrayNonUniformIndexing && !supported.shaderStorageImageArrayNonUniformIndexing) {
                    ss << "VkPhysicalDeviceVulkan12Features::shaderStorageImageArrayNonUniformIndexing is not supported\n";
                }
                if (enabling->shaderInputAttachmentArrayNonUniformIndexing &&
                    !supported.shaderInputAttachmentArrayNonUniformIndexing) {
                    ss << "VkPhysicalDeviceVulkan12Features::shaderInputAttachmentArrayNonUniformIndexing is not supported\n";
                }
                if (enabling->shaderUniformTexelBufferArrayNonUniformIndexing &&
                    !supported.shaderUniformTexelBufferArrayNonUniformIndexing) {
                    ss << "VkPhysicalDeviceVulkan12Features::shaderUniformTexelBufferArrayNonUniformIndexing is not supported\n";
                }
                if (enabling->shaderStorageTexelBufferArrayNonUniformIndexing &&
                    !supported.shaderStorageTexelBufferArrayNonUniformIndexing) {
                    ss << "VkPhysicalDeviceVulkan12Features::shaderStorageTexelBufferArrayNonUniformIndexing is not supported\n";
                }
                if (enabling->descriptorBindingUniformBufferUpdateAfterBind &&
                    !supported.descriptorBindingUniformBufferUpdateAfterBind) {
                    ss << "VkPhysicalDeviceVulkan12Features::descriptorBindingUniformBufferUpdateAfterBind is not supported\n";
                }
                if (enabling->descriptorBindingSampledImageUpdateAfterBind &&
                    !supported.descriptorBindingSampledImageUpdateAfterBind) {
                    ss << "VkPhysicalDeviceVulkan12Features::descriptorBindingSampledImageUpdateAfterBind is not supported\n";
                }
                if (enabling->descriptorBindingStorageImageUpdateAfterBind &&
                    !supported.descriptorBindingStorageImageUpdateAfterBind) {
                    ss << "VkPhysicalDeviceVulkan12Features::descriptorBindingStorageImageUpdateAfterBind is not supported\n";
                }
                if (enabling->descriptorBindingStorageBufferUpdateAfterBind &&
                    !supported.descriptorBindingStorageBufferUpdateAfterBind) {
                    ss << "VkPhysicalDeviceVulkan12Features::descriptorBindingStorageBufferUpdateAfterBind is not supported\n";
                }
                if (enabling->descriptorBindingUniformTexelBufferUpdateAfterBind &&
                    !supported.descriptorBindingUniformTexelBufferUpdateAfterBind) {
                    ss << "VkPhysicalDeviceVulkan12Features::descriptorBindingUniformTexelBufferUpdateAfterBind is not supported\n";
                }
                if (enabling->descriptorBindingStorageTexelBufferUpdateAfterBind &&
                    !supported.descriptorBindingStorageTexelBufferUpdateAfterBind) {
                    ss << "VkPhysicalDeviceVulkan12Features::descriptorBindingStorageTexelBufferUpdateAfterBind is not supported\n";
                }
                if (enabling->descriptorBindingUpdateUnusedWhilePending && !supported.descriptorBindingUpdateUnusedWhilePending) {
                    ss << "VkPhysicalDeviceVulkan12Features::descriptorBindingUpdateUnusedWhilePending is not supported\n";
                }
                if (enabling->descriptorBindingPartiallyBound && !supported.descriptorBindingPartiallyBound) {
                    ss << "VkPhysicalDeviceVulkan12Features::descriptorBindingPartiallyBound is not supported\n";
                }
                if (enabling->descriptorBindingVariableDescriptorCount && !supported.descriptorBindingVariableDescriptorCount) {
                    ss << "VkPhysicalDeviceVulkan12Features::descriptorBindingVariableDescriptorCount is not supported\n";
                }
                if (enabling->runtimeDescriptorArray && !supported.runtimeDescriptorArray) {
                    ss << "VkPhysicalDeviceVulkan12Features::runtimeDescriptorArray is not supported\n";
                }
                if (enabling->samplerFilterMinmax && !supported.samplerFilterMinmax) {
                    ss << "VkPhysicalDeviceVulkan12Features::samplerFilterMinmax is not supported\n";
                }
                if (enabling->scalarBlockLayout && !supported.scalarBlockLayout) {
                    ss << "VkPhysicalDeviceVulkan12Features::scalarBlockLayout is not supported\n";
                }
                if (enabling->imagelessFramebuffer && !supported.imagelessFramebuffer) {
                    ss << "VkPhysicalDeviceVulkan12Features::imagelessFramebuffer is not supported\n";
                }
                if (enabling->uniformBufferStandardLayout && !supported.uniformBufferStandardLayout) {
                    ss << "VkPhysicalDeviceVulkan12Features::uniformBufferStandardLayout is not supported\n";
                }
                if (enabling->shaderSubgroupExtendedTypes && !supported.shaderSubgroupExtendedTypes) {
                    ss << "VkPhysicalDeviceVulkan12Features::shaderSubgroupExtendedTypes is not supported\n";
                }
                if (enabling->separateDepthStencilLayouts && !supported.separateDepthStencilLayouts) {
                    ss << "VkPhysicalDeviceVulkan12Features::separateDepthStencilLayouts is not supported\n";
                }
                if (enabling->hostQueryReset && !supported.hostQueryReset) {
                    ss << "VkPhysicalDeviceVulkan12Features::hostQueryReset is not supported\n";
                }
                if (enabling->timelineSemaphore && !supported.timelineSemaphore) {
                    ss << "VkPhysicalDeviceVulkan12Features::timelineSemaphore is not supported\n";
                }
                if (enabling->bufferDeviceAddress && !supported.bufferDeviceAddress) {
                    ss << "VkPhysicalDeviceVulkan12Features::bufferDeviceAddress is not supported\n";
                }
                if (enabling->bufferDeviceAddressCaptureReplay && !supported.bufferDeviceAddressCaptureReplay) {
                    ss << "VkPhysicalDeviceVulkan12Features::bufferDeviceAddressCaptureReplay is not supported\n";
                }
                if (enabling->bufferDeviceAddressMultiDevice && !supported.bufferDeviceAddressMultiDevice) {
                    ss << "VkPhysicalDeviceVulkan12Features::bufferDeviceAddressMultiDevice is not supported\n";
                }
                if (enabling->vulkanMemoryModel && !supported.vulkanMemoryModel) {
                    ss << "VkPhysicalDeviceVulkan12Features::vulkanMemoryModel is not supported\n";
                }
                if (enabling->vulkanMemoryModelDeviceScope && !supported.vulkanMemoryModelDeviceScope) {
                    ss << "VkPhysicalDeviceVulkan12Features::vulkanMemoryModelDeviceScope is not supported\n";
                }
                if (enabling->vulkanMemoryModelAvailabilityVisibilityChains &&
                    !supported.vulkanMemoryModelAvailabilityVisibilityChains) {
                    ss << "VkPhysicalDeviceVulkan12Features::vulkanMemoryModelAvailabilityVisibilityChains is not supported\n";
                }
                if (enabling->shaderOutputViewportIndex && !supported.shaderOutputViewportIndex) {
                    ss << "VkPhysicalDeviceVulkan12Features::shaderOutputViewportIndex is not supported\n";
                }
                if (enabling->shaderOutputLayer && !supported.shaderOutputLayer) {
                    ss << "VkPhysicalDeviceVulkan12Features::shaderOutputLayer is not supported\n";
                }
                if (enabling->subgroupBroadcastDynamicId && !supported.subgroupBroadcastDynamicId) {
                    ss << "VkPhysicalDeviceVulkan12Features::subgroupBroadcastDynamicId is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES: {
                VkPhysicalDeviceVulkan13Features supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceVulkan13Features* enabling =
                    reinterpret_cast<const VkPhysicalDeviceVulkan13Features*>(current);
                if (enabling->robustImageAccess && !supported.robustImageAccess) {
                    ss << "VkPhysicalDeviceVulkan13Features::robustImageAccess is not supported\n";
                }
                if (enabling->inlineUniformBlock && !supported.inlineUniformBlock) {
                    ss << "VkPhysicalDeviceVulkan13Features::inlineUniformBlock is not supported\n";
                }
                if (enabling->descriptorBindingInlineUniformBlockUpdateAfterBind &&
                    !supported.descriptorBindingInlineUniformBlockUpdateAfterBind) {
                    ss << "VkPhysicalDeviceVulkan13Features::descriptorBindingInlineUniformBlockUpdateAfterBind is not supported\n";
                }
                if (enabling->pipelineCreationCacheControl && !supported.pipelineCreationCacheControl) {
                    ss << "VkPhysicalDeviceVulkan13Features::pipelineCreationCacheControl is not supported\n";
                }
                if (enabling->privateData && !supported.privateData) {
                    ss << "VkPhysicalDeviceVulkan13Features::privateData is not supported\n";
                }
                if (enabling->shaderDemoteToHelperInvocation && !supported.shaderDemoteToHelperInvocation) {
                    ss << "VkPhysicalDeviceVulkan13Features::shaderDemoteToHelperInvocation is not supported\n";
                }
                if (enabling->shaderTerminateInvocation && !supported.shaderTerminateInvocation) {
                    ss << "VkPhysicalDeviceVulkan13Features::shaderTerminateInvocation is not supported\n";
                }
                if (enabling->subgroupSizeControl && !supported.subgroupSizeControl) {
                    ss << "VkPhysicalDeviceVulkan13Features::subgroupSizeControl is not supported\n";
                }
                if (enabling->computeFullSubgroups && !supported.computeFullSubgroups) {
                    ss << "VkPhysicalDeviceVulkan13Features::computeFullSubgroups is not supported\n";
                }
                if (enabling->synchronization2 && !supported.synchronization2) {
                    ss << "VkPhysicalDeviceVulkan13Features::synchronization2 is not supported\n";
                }
                if (enabling->textureCompressionASTC_HDR && !supported.textureCompressionASTC_HDR) {
                    ss << "VkPhysicalDeviceVulkan13Features::textureCompressionASTC_HDR is not supported\n";
                }
                if (enabling->shaderZeroInitializeWorkgroupMemory && !supported.shaderZeroInitializeWorkgroupMemory) {
                    ss << "VkPhysicalDeviceVulkan13Features::shaderZeroInitializeWorkgroupMemory is not supported\n";
                }
                if (enabling->dynamicRendering && !supported.dynamicRendering) {
                    ss << "VkPhysicalDeviceVulkan13Features::dynamicRendering is not supported\n";
                }
                if (enabling->shaderIntegerDotProduct && !supported.shaderIntegerDotProduct) {
                    ss << "VkPhysicalDeviceVulkan13Features::shaderIntegerDotProduct is not supported\n";
                }
                if (enabling->maintenance4 && !supported.maintenance4) {
                    ss << "VkPhysicalDeviceVulkan13Features::maintenance4 is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_4_FEATURES: {
                VkPhysicalDeviceVulkan14Features supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceVulkan14Features* enabling =
                    reinterpret_cast<const VkPhysicalDeviceVulkan14Features*>(current);
                if (enabling->globalPriorityQuery && !supported.globalPriorityQuery) {
                    ss << "VkPhysicalDeviceVulkan14Features::globalPriorityQuery is not supported\n";
                }
                if (enabling->shaderSubgroupRotate && !supported.shaderSubgroupRotate) {
                    ss << "VkPhysicalDeviceVulkan14Features::shaderSubgroupRotate is not supported\n";
                }
                if (enabling->shaderSubgroupRotateClustered && !supported.shaderSubgroupRotateClustered) {
                    ss << "VkPhysicalDeviceVulkan14Features::shaderSubgroupRotateClustered is not supported\n";
                }
                if (enabling->shaderFloatControls2 && !supported.shaderFloatControls2) {
                    ss << "VkPhysicalDeviceVulkan14Features::shaderFloatControls2 is not supported\n";
                }
                if (enabling->shaderExpectAssume && !supported.shaderExpectAssume) {
                    ss << "VkPhysicalDeviceVulkan14Features::shaderExpectAssume is not supported\n";
                }
                if (enabling->rectangularLines && !supported.rectangularLines) {
                    ss << "VkPhysicalDeviceVulkan14Features::rectangularLines is not supported\n";
                }
                if (enabling->bresenhamLines && !supported.bresenhamLines) {
                    ss << "VkPhysicalDeviceVulkan14Features::bresenhamLines is not supported\n";
                }
                if (enabling->smoothLines && !supported.smoothLines) {
                    ss << "VkPhysicalDeviceVulkan14Features::smoothLines is not supported\n";
                }
                if (enabling->stippledRectangularLines && !supported.stippledRectangularLines) {
                    ss << "VkPhysicalDeviceVulkan14Features::stippledRectangularLines is not supported\n";
                }
                if (enabling->stippledBresenhamLines && !supported.stippledBresenhamLines) {
                    ss << "VkPhysicalDeviceVulkan14Features::stippledBresenhamLines is not supported\n";
                }
                if (enabling->stippledSmoothLines && !supported.stippledSmoothLines) {
                    ss << "VkPhysicalDeviceVulkan14Features::stippledSmoothLines is not supported\n";
                }
                if (enabling->vertexAttributeInstanceRateDivisor && !supported.vertexAttributeInstanceRateDivisor) {
                    ss << "VkPhysicalDeviceVulkan14Features::vertexAttributeInstanceRateDivisor is not supported\n";
                }
                if (enabling->vertexAttributeInstanceRateZeroDivisor && !supported.vertexAttributeInstanceRateZeroDivisor) {
                    ss << "VkPhysicalDeviceVulkan14Features::vertexAttributeInstanceRateZeroDivisor is not supported\n";
                }
                if (enabling->indexTypeUint8 && !supported.indexTypeUint8) {
                    ss << "VkPhysicalDeviceVulkan14Features::indexTypeUint8 is not supported\n";
                }
                if (enabling->dynamicRenderingLocalRead && !supported.dynamicRenderingLocalRead) {
                    ss << "VkPhysicalDeviceVulkan14Features::dynamicRenderingLocalRead is not supported\n";
                }
                if (enabling->maintenance5 && !supported.maintenance5) {
                    ss << "VkPhysicalDeviceVulkan14Features::maintenance5 is not supported\n";
                }
                if (enabling->maintenance6 && !supported.maintenance6) {
                    ss << "VkPhysicalDeviceVulkan14Features::maintenance6 is not supported\n";
                }
                if (enabling->pipelineProtectedAccess && !supported.pipelineProtectedAccess) {
                    ss << "VkPhysicalDeviceVulkan14Features::pipelineProtectedAccess is not supported\n";
                }
                if (enabling->pipelineRobustness && !supported.pipelineRobustness) {
                    ss << "VkPhysicalDeviceVulkan14Features::pipelineRobustness is not supported\n";
                }
                if (enabling->hostImageCopy && !supported.hostImageCopy) {
                    ss << "VkPhysicalDeviceVulkan14Features::hostImageCopy is not supported\n";
                }
                if (enabling->pushDescriptor && !supported.pushDescriptor) {
                    ss << "VkPhysicalDeviceVulkan14Features::pushDescriptor is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES: {
                VkPhysicalDeviceVulkanMemoryModelFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceVulkanMemoryModelFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceVulkanMemoryModelFeatures*>(current);
                if (enabling->vulkanMemoryModel && !supported.vulkanMemoryModel) {
                    ss << "VkPhysicalDeviceVulkanMemoryModelFeatures::vulkanMemoryModel is not supported\n";
                }
                if (enabling->vulkanMemoryModelDeviceScope && !supported.vulkanMemoryModelDeviceScope) {
                    ss << "VkPhysicalDeviceVulkanMemoryModelFeatures::vulkanMemoryModelDeviceScope is not supported\n";
                }
                if (enabling->vulkanMemoryModelAvailabilityVisibilityChains &&
                    !supported.vulkanMemoryModelAvailabilityVisibilityChains) {
                    ss << "VkPhysicalDeviceVulkanMemoryModelFeatures::vulkanMemoryModelAvailabilityVisibilityChains is not "
                          "supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR: {
                VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* enabling =
                    reinterpret_cast<const VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR*>(current);
                if (enabling->workgroupMemoryExplicitLayout && !supported.workgroupMemoryExplicitLayout) {
                    ss << "VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR::workgroupMemoryExplicitLayout is not "
                          "supported\n";
                }
                if (enabling->workgroupMemoryExplicitLayoutScalarBlockLayout &&
                    !supported.workgroupMemoryExplicitLayoutScalarBlockLayout) {
                    ss << "VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR::"
                          "workgroupMemoryExplicitLayoutScalarBlockLayout is not supported\n";
                }
                if (enabling->workgroupMemoryExplicitLayout8BitAccess && !supported.workgroupMemoryExplicitLayout8BitAccess) {
                    ss << "VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR::workgroupMemoryExplicitLayout8BitAccess is "
                          "not supported\n";
                }
                if (enabling->workgroupMemoryExplicitLayout16BitAccess && !supported.workgroupMemoryExplicitLayout16BitAccess) {
                    ss << "VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR::workgroupMemoryExplicitLayout16BitAccess is "
                          "not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT: {
                VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT*>(current);
                if (enabling->ycbcr2plane444Formats && !supported.ycbcr2plane444Formats) {
                    ss << "VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT::ycbcr2plane444Formats is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_DEGAMMA_FEATURES_QCOM: {
                VkPhysicalDeviceYcbcrDegammaFeaturesQCOM supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceYcbcrDegammaFeaturesQCOM* enabling =
                    reinterpret_cast<const VkPhysicalDeviceYcbcrDegammaFeaturesQCOM*>(current);
                if (enabling->ycbcrDegamma && !supported.ycbcrDegamma) {
                    ss << "VkPhysicalDeviceYcbcrDegammaFeaturesQCOM::ycbcrDegamma is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT: {
                VkPhysicalDeviceYcbcrImageArraysFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(current);
                if (enabling->ycbcrImageArrays && !supported.ycbcrImageArrays) {
                    ss << "VkPhysicalDeviceYcbcrImageArraysFeaturesEXT::ycbcrImageArrays is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_DEVICE_MEMORY_FEATURES_EXT: {
                VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT* enabling =
                    reinterpret_cast<const VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT*>(current);
                if (enabling->zeroInitializeDeviceMemory && !supported.zeroInitializeDeviceMemory) {
                    ss << "VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT::zeroInitializeDeviceMemory is not supported\n";
                }
                break;
            }
            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES: {
                VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures supported = vku::InitStructHelper();
                features_2.pNext = &supported;
                DispatchGetPhysicalDeviceFeatures2(gpu, &features_2);
                const VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures* enabling =
                    reinterpret_cast<const VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures*>(current);
                if (enabling->shaderZeroInitializeWorkgroupMemory && !supported.shaderZeroInitializeWorkgroupMemory) {
                    ss << "VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures::shaderZeroInitializeWorkgroupMemory is not "
                          "supported\n";
                }
                break;
            }

            default:
                break;
        }
    }

    Location loc(vvl::Func::vkCreateDevice);
    LogWarning("WARNING-vkCreateDevice-FeatureNotPresent", instance, loc, "%s", ss.str().c_str());
}  // ReportErrorFeatureNotPresent
}  // namespace vvl
