/*
 * Copyright 2025 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

// This is a Vulkan specific test, ensuring VulkanPreferredFeatures enables extensions and features
// correctly.

#include "include/core/SkTypes.h"

#if defined(SK_VULKAN)
#include "include/gpu/vk/VulkanPreferredFeatures.h"
#include "tests/CtsEnforcement.h"
#include "tests/Test.h"

#include <vulkan/vulkan_core.h>
#include <algorithm>
#include <cstdint>
#include <cstring>
#include <memory>
#include <vector>

// A pretend Vulkan device configuration to expose a subset of Vulkan extensions
//
// Note: Skia doesn't actually enable all of these yet. The test expectations below are commented
// out for the extensions that are planned for the future. Once any extension is enabled, the
// corresponding expectations should be uncommented.
struct VulkanExts {
    bool fRasterizationOrderAttachmentAccessARM = true;
    bool fRasterizationOrderAttachmentAccessEXT = true;
    bool fBlendOperationAdvancedEXT = true;
    bool fExtendedDynamicStateEXT = true;
    bool fExtendedDynamicState2EXT = true;
    bool fVertexInputDynamicStateEXT = true;
    bool fGraphicsPipelineLibraryEXT = true;
    bool fSamplerYcbcrConversionKHR = true;
    bool fRGBA10x6FormatsEXT = true;
    bool fSynchronization2KHR = true;
    bool fDynamicRenderingKHR = true;
    bool fDynamicRenderingLocalReadKHR = true;
    bool fMultisampledRenderToSingleSampledEXT = true;
    bool fHostImageCopyEXT = true;
    bool fPipelineCreationCacheControlEXT = true;
    bool fDriverPropertiesKHR = true;
    bool fCreateRenderpass2KHR = true;
    bool fLoadStoreOpNoneEXT = true;
    bool fLoadStoreOpNoneKHR = true;
    bool fConservativeRasterizationEXT = true;
    bool fPipelineLibraryKHR = true;
    bool fCopyCommands2KHR = true;
    bool fFormatFeatureFlags2KHR = true;
    bool fDepthStencilResolveKHR = true;
    bool fShaderDrawParametersKHR = true;
    bool fDrawIndirectCountKHR = true;
    bool fSamplerMirrorClampToEdgeKHR = true;
    bool fDescriptorIndexingEXT = true;
    bool fSamplerFilterMinmaxEXT = true;
    bool fShaderViewportIndexLayerEXT = true;
    bool fPushDescriptorKHR = true;
};

static std::vector<VkExtensionProperties> get_device_exts(const VulkanExts& config) {
    std::vector<VkExtensionProperties> exts;
#define ADD_EXT(fFlag, EXTNAME)                                  \
    do {                                                         \
        if (config.fFlag) {                                      \
            VkExtensionProperties ext = {};                      \
            strcpy(ext.extensionName, EXTNAME##_EXTENSION_NAME); \
            ext.specVersion = 1;                                 \
            exts.push_back(ext);                                 \
        }                                                        \
    } while (0)
    ADD_EXT(fRasterizationOrderAttachmentAccessARM, VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
    ADD_EXT(fRasterizationOrderAttachmentAccessEXT, VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
    ADD_EXT(fBlendOperationAdvancedEXT, VK_EXT_BLEND_OPERATION_ADVANCED);
    ADD_EXT(fExtendedDynamicStateEXT, VK_EXT_EXTENDED_DYNAMIC_STATE);
    ADD_EXT(fExtendedDynamicState2EXT, VK_EXT_EXTENDED_DYNAMIC_STATE_2);
    ADD_EXT(fVertexInputDynamicStateEXT, VK_EXT_VERTEX_INPUT_DYNAMIC_STATE);
    ADD_EXT(fGraphicsPipelineLibraryEXT, VK_EXT_GRAPHICS_PIPELINE_LIBRARY);
    ADD_EXT(fSamplerYcbcrConversionKHR, VK_KHR_SAMPLER_YCBCR_CONVERSION);
    ADD_EXT(fRGBA10x6FormatsEXT, VK_EXT_RGBA10X6_FORMATS);
    ADD_EXT(fSynchronization2KHR, VK_KHR_SYNCHRONIZATION_2);
    ADD_EXT(fDynamicRenderingKHR, VK_KHR_DYNAMIC_RENDERING);
    ADD_EXT(fDynamicRenderingLocalReadKHR, VK_KHR_DYNAMIC_RENDERING_LOCAL_READ);
    ADD_EXT(fMultisampledRenderToSingleSampledEXT, VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED);
    ADD_EXT(fHostImageCopyEXT, VK_EXT_HOST_IMAGE_COPY);
    ADD_EXT(fPipelineCreationCacheControlEXT, VK_EXT_PIPELINE_CREATION_CACHE_CONTROL);
    ADD_EXT(fDriverPropertiesKHR, VK_KHR_DRIVER_PROPERTIES);
    ADD_EXT(fCreateRenderpass2KHR, VK_KHR_CREATE_RENDERPASS_2);
    ADD_EXT(fLoadStoreOpNoneEXT, VK_EXT_LOAD_STORE_OP_NONE);
    ADD_EXT(fLoadStoreOpNoneKHR, VK_KHR_LOAD_STORE_OP_NONE);
    ADD_EXT(fConservativeRasterizationEXT, VK_EXT_CONSERVATIVE_RASTERIZATION);
    ADD_EXT(fPipelineLibraryKHR, VK_KHR_PIPELINE_LIBRARY);
    ADD_EXT(fCopyCommands2KHR, VK_KHR_COPY_COMMANDS_2);
    ADD_EXT(fFormatFeatureFlags2KHR, VK_KHR_FORMAT_FEATURE_FLAGS_2);
    ADD_EXT(fDepthStencilResolveKHR, VK_KHR_DEPTH_STENCIL_RESOLVE);
    ADD_EXT(fShaderDrawParametersKHR, VK_KHR_SHADER_DRAW_PARAMETERS);
    ADD_EXT(fDrawIndirectCountKHR, VK_KHR_DRAW_INDIRECT_COUNT);
    ADD_EXT(fSamplerMirrorClampToEdgeKHR, VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE);
    ADD_EXT(fDescriptorIndexingEXT, VK_EXT_DESCRIPTOR_INDEXING);
    ADD_EXT(fSamplerFilterMinmaxEXT, VK_EXT_SAMPLER_FILTER_MINMAX);
    ADD_EXT(fShaderViewportIndexLayerEXT, VK_EXT_SHADER_VIEWPORT_INDEX_LAYER);
    ADD_EXT(fPushDescriptorKHR, VK_KHR_PUSH_DESCRIPTOR);
#undef ADD_EXT
    return exts;
}

static void enable_device_features(const VulkanExts& config, void* basePNext) {
#define SET_IF(fFlag, name)           \
    do {                              \
        if (config.fFlag) {           \
            features->name = VK_TRUE; \
        }                             \
    } while (0)
#define SET_FEATURES(STRUCT_NAME, StructName, set)                               \
    case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_##STRUCT_NAME: {                      \
        auto* features = reinterpret_cast<VkPhysicalDevice##StructName*>(pNext); \
        set;                                                                     \
        break;                                                                   \
    }

    VkBaseOutStructure* pNext = static_cast<VkBaseOutStructure*>(basePNext);
    while (pNext) {
        switch (pNext->sType) {
            SET_FEATURES(VULKAN_1_1_FEATURES,
                         Vulkan11Features,
                         SET_IF(fSamplerYcbcrConversionKHR, samplerYcbcrConversion);
                         SET_IF(fShaderDrawParametersKHR, shaderDrawParameters))

            SET_FEATURES(VULKAN_1_2_FEATURES,
                         Vulkan12Features,
                         SET_IF(fSamplerMirrorClampToEdgeKHR, samplerMirrorClampToEdge);
                         SET_IF(fDrawIndirectCountKHR, drawIndirectCount);
                         SET_IF(fDescriptorIndexingEXT, descriptorIndexing);
                         SET_IF(fSamplerFilterMinmaxEXT, samplerFilterMinmax);
                         SET_IF(fShaderViewportIndexLayerEXT, shaderOutputViewportIndex);
                         SET_IF(fShaderViewportIndexLayerEXT, shaderOutputLayer))

            SET_FEATURES(VULKAN_1_3_FEATURES,
                         Vulkan13Features,
                         SET_IF(fPipelineCreationCacheControlEXT, pipelineCreationCacheControl);
                         SET_IF(fSynchronization2KHR, synchronization2);
                         SET_IF(fDynamicRenderingKHR, dynamicRendering))

            SET_FEATURES(VULKAN_1_4_FEATURES,
                         Vulkan14Features,
                         SET_IF(fDynamicRenderingLocalReadKHR, dynamicRenderingLocalRead);
                         SET_IF(fHostImageCopyEXT, hostImageCopy))

            SET_FEATURES(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                         RasterizationOrderAttachmentAccessFeaturesEXT,
                         SET_IF(fRasterizationOrderAttachmentAccessARM,
                                rasterizationOrderColorAttachmentAccess);
                         SET_IF(fRasterizationOrderAttachmentAccessARM,
                                rasterizationOrderDepthAttachmentAccess);
                         SET_IF(fRasterizationOrderAttachmentAccessARM,
                                rasterizationOrderStencilAttachmentAccess);
                         SET_IF(fRasterizationOrderAttachmentAccessEXT,
                                rasterizationOrderColorAttachmentAccess);
                         SET_IF(fRasterizationOrderAttachmentAccessEXT,
                                rasterizationOrderDepthAttachmentAccess);
                         SET_IF(fRasterizationOrderAttachmentAccessEXT,
                                rasterizationOrderStencilAttachmentAccess))

            SET_FEATURES(BLEND_OPERATION_ADVANCED_FEATURES_EXT,
                         BlendOperationAdvancedFeaturesEXT,
                         SET_IF(fBlendOperationAdvancedEXT, advancedBlendCoherentOperations))

            SET_FEATURES(EXTENDED_DYNAMIC_STATE_FEATURES_EXT,
                         ExtendedDynamicStateFeaturesEXT,
                         SET_IF(fExtendedDynamicStateEXT, extendedDynamicState))

            SET_FEATURES(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
                         ExtendedDynamicState2FeaturesEXT,
                         SET_IF(fExtendedDynamicState2EXT, extendedDynamicState2);
                         SET_IF(fExtendedDynamicState2EXT, extendedDynamicState2LogicOp);
                         SET_IF(fExtendedDynamicState2EXT, extendedDynamicState2PatchControlPoints))

            SET_FEATURES(VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT,
                         VertexInputDynamicStateFeaturesEXT,
                         SET_IF(fVertexInputDynamicStateEXT, vertexInputDynamicState))

            SET_FEATURES(GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT,
                         GraphicsPipelineLibraryFeaturesEXT,
                         SET_IF(fGraphicsPipelineLibraryEXT, graphicsPipelineLibrary))

            SET_FEATURES(SAMPLER_YCBCR_CONVERSION_FEATURES,
                         SamplerYcbcrConversionFeatures,
                         SET_IF(fSamplerYcbcrConversionKHR, samplerYcbcrConversion))

            SET_FEATURES(RGBA10X6_FORMATS_FEATURES_EXT,
                         RGBA10X6FormatsFeaturesEXT,
                         SET_IF(fRGBA10x6FormatsEXT, formatRgba10x6WithoutYCbCrSampler))

            SET_FEATURES(SYNCHRONIZATION_2_FEATURES,
                         Synchronization2Features,
                         SET_IF(fSynchronization2KHR, synchronization2))

            SET_FEATURES(DYNAMIC_RENDERING_FEATURES,
                         DynamicRenderingFeatures,
                         SET_IF(fDynamicRenderingKHR, dynamicRendering))

            SET_FEATURES(DYNAMIC_RENDERING_LOCAL_READ_FEATURES,
                         DynamicRenderingLocalReadFeatures,
                         SET_IF(fDynamicRenderingLocalReadKHR, dynamicRenderingLocalRead))

            SET_FEATURES(MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT,
                         MultisampledRenderToSingleSampledFeaturesEXT,
                         SET_IF(fMultisampledRenderToSingleSampledEXT,
                                multisampledRenderToSingleSampled))

            SET_FEATURES(HOST_IMAGE_COPY_FEATURES,
                         HostImageCopyFeatures,
                         SET_IF(fHostImageCopyEXT, hostImageCopy))

            SET_FEATURES(PIPELINE_CREATION_CACHE_CONTROL_FEATURES,
                         PipelineCreationCacheControlFeatures,
                         SET_IF(fPipelineCreationCacheControlEXT, pipelineCreationCacheControl))

            default:
                break;
        }
        pNext = pNext->pNext;
    }
#undef SET_FEATURES
#undef SET_IF
}

static size_t count_ext(const std::vector<const char*> enabledExts, const char* to_find) {
    return std::count_if(enabledExts.begin(), enabledExts.end(), [to_find](const char* ext) {
        return strcmp(ext, to_find) == 0;
    });
}

static size_t count_struct(const void* basePNext, VkStructureType structureType) {
    size_t count = 0;

    const VkBaseInStructure* pNext = static_cast<const VkBaseInStructure*>(basePNext);
    while (pNext) {
        if (pNext->sType == structureType) {
            ++count;
        }

        pNext = pNext->pNext;
    }

    return count;
}

template <typename VulkanStruct, VkBool32 VulkanStruct::* Feature>
static bool get_feature(skiatest::Reporter* reporter,
                        const void* basePNext,
                        VkStructureType structureType) {
    bool foundBefore = false;
    bool enabled = false;

    const VkBaseInStructure* pNext = static_cast<const VkBaseInStructure*>(basePNext);
    while (pNext) {
        if (pNext->sType == structureType) {
            // Verify no duplicate instances of the struct.
            REPORTER_ASSERT(reporter, !foundBefore);
            foundBefore = true;

            const auto* feature = reinterpret_cast<const VulkanStruct*>(pNext);
            enabled = feature->*Feature;
        }

        pNext = pNext->pNext;
    }

    return enabled;
}

static bool check_exclusive(skiatest::Reporter* reporter,
                            const void* basePNext,
                            VkStructureType structureType1,
                            VkStructureType structureType2) {
    bool foundStructureType1 = false;
    bool foundStructureType2 = false;

    const VkBaseInStructure* pNext = static_cast<const VkBaseInStructure*>(basePNext);
    while (pNext) {
        if (pNext->sType == structureType1) {
            // Verify no duplicate instances of the struct.
            REPORTER_ASSERT(reporter, !foundStructureType1);
            foundStructureType1 = true;
        } else if (pNext->sType == structureType2) {
            // Verify no duplicate instances of the struct.
            REPORTER_ASSERT(reporter, !foundStructureType2);
            foundStructureType2 = true;
        }

        pNext = pNext->pNext;
    }

    return !foundStructureType1 || !foundStructureType2;
}

#define CHECK_EXT_ENABLED(EXTNAME) \
    REPORTER_ASSERT(reporter, count_ext(enabledExts, EXTNAME##_EXTENSION_NAME) == 1)
#define CHECK_EXT_DISABLED(EXTNAME) \
    REPORTER_ASSERT(reporter, count_ext(enabledExts, EXTNAME##_EXTENSION_NAME) == 0)

#define CHECK_CHAINED(STRUCT_NAME) \
    REPORTER_ASSERT(               \
            reporter,              \
            count_struct(features.pNext, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_##STRUCT_NAME) == 1)
#define CHECK_NOT_CHAINED(STRUCT_NAME) \
    REPORTER_ASSERT(                   \
            reporter,                  \
            count_struct(features.pNext, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_##STRUCT_NAME) == 0)

#define CHECK_EXCLUSIVE(STRUCT_NAME1, STRUCT_NAME2)                                   \
    REPORTER_ASSERT(reporter,                                                         \
                    check_exclusive(reporter,                                         \
                                    features.pNext,                                   \
                                    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_##STRUCT_NAME1, \
                                    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_##STRUCT_NAME2))

#define CHECK_FEATURE_ENABLED(STRUCT_NAME, StructName, member)                                    \
    do {                                                                                          \
        const bool member##Enabled =                                                              \
                get_feature<VkPhysicalDevice##StructName, &VkPhysicalDevice##StructName::member>( \
                        reporter,                                                                 \
                        features.pNext,                                                           \
                        VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_##STRUCT_NAME);                         \
        REPORTER_ASSERT(reporter, member##Enabled);                                               \
    } while (0)

#define CHECK_FEATURE_DISABLED(STRUCT_NAME, StructName, member)                                   \
    do {                                                                                          \
        const bool member##Enabled =                                                              \
                get_feature<VkPhysicalDevice##StructName, &VkPhysicalDevice##StructName::member>( \
                        reporter,                                                                 \
                        features.pNext,                                                           \
                        VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_##STRUCT_NAME);                         \
        REPORTER_ASSERT(reporter, !member##Enabled);                                              \
    } while (0)

// A test where the application adds no features and extensions and lets Skia choose them. Uses
// Vulkan 1.1 as the API version.
DEF_TEST(VkPreferredFeaturesTest_BasicVulkan11, reporter) {
    VulkanExts config;
    const std::vector<VkExtensionProperties> exts = get_device_exts(config);

    skgpu::VulkanPreferredFeatures preferred;
    preferred.init(VK_API_VERSION_1_1);

    {
        std::vector<const char*> instanceExts;
        preferred.addToInstanceExtensions(nullptr, 0, instanceExts);
    }

    VkPhysicalDeviceFeatures2 features = {};
    features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;

    // Ask Skia to add its features to query
    preferred.addFeaturesToQuery(exts.data(), exts.size(), features);
    // Populate the requested features
    enable_device_features(config, features.pNext);

    // Ask Skia to enable available features
    std::vector<const char*> enabledExts;
    preferred.addFeaturesToEnable(enabledExts, features);

    CHECK_NOT_CHAINED(VULKAN_1_1_FEATURES);
    CHECK_NOT_CHAINED(VULKAN_1_2_FEATURES);
    CHECK_NOT_CHAINED(VULKAN_1_3_FEATURES);
    CHECK_NOT_CHAINED(VULKAN_1_4_FEATURES);

    CHECK_EXT_DISABLED(VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
    CHECK_EXT_ENABLED(VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
    CHECK_EXT_ENABLED(VK_EXT_BLEND_OPERATION_ADVANCED);
    //CHECK_EXT_ENABLED(VK_EXT_EXTENDED_DYNAMIC_STATE);
    //CHECK_EXT_ENABLED(VK_EXT_EXTENDED_DYNAMIC_STATE_2);
    //CHECK_EXT_ENABLED(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE);
    //CHECK_EXT_ENABLED(VK_EXT_GRAPHICS_PIPELINE_LIBRARY);
    CHECK_EXT_ENABLED(VK_KHR_SAMPLER_YCBCR_CONVERSION);
    CHECK_EXT_ENABLED(VK_EXT_RGBA10X6_FORMATS);
    //CHECK_EXT_ENABLED(VK_KHR_SYNCHRONIZATION_2);
    //CHECK_EXT_ENABLED(VK_KHR_DYNAMIC_RENDERING);
    //CHECK_EXT_ENABLED(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ);
    //CHECK_EXT_ENABLED(VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED);
    //CHECK_EXT_ENABLED(VK_EXT_HOST_IMAGE_COPY);
    CHECK_EXT_ENABLED(VK_EXT_PIPELINE_CREATION_CACHE_CONTROL);
    CHECK_EXT_ENABLED(VK_KHR_DRIVER_PROPERTIES);
    CHECK_EXT_ENABLED(VK_KHR_CREATE_RENDERPASS_2);
    CHECK_EXT_DISABLED(VK_EXT_LOAD_STORE_OP_NONE);
    CHECK_EXT_ENABLED(VK_KHR_LOAD_STORE_OP_NONE);
    CHECK_EXT_ENABLED(VK_EXT_CONSERVATIVE_RASTERIZATION);
    //CHECK_EXT_ENABLED(VK_KHR_PIPELINE_LIBRARY);
    //CHECK_EXT_ENABLED(VK_KHR_COPY_COMMANDS_2);
    //CHECK_EXT_ENABLED(VK_KHR_FORMAT_FEATURE_FLAGS_2);
    //CHECK_EXT_ENABLED(VK_KHR_DEPTH_STENCIL_RESOLVE);
    CHECK_EXT_DISABLED(VK_KHR_SHADER_DRAW_PARAMETERS);
    CHECK_EXT_DISABLED(VK_KHR_DRAW_INDIRECT_COUNT);
    CHECK_EXT_DISABLED(VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE);
    CHECK_EXT_DISABLED(VK_EXT_DESCRIPTOR_INDEXING);
    CHECK_EXT_DISABLED(VK_EXT_SAMPLER_FILTER_MINMAX);
    CHECK_EXT_DISABLED(VK_EXT_SHADER_VIEWPORT_INDEX_LAYER);
    CHECK_EXT_DISABLED(VK_KHR_PUSH_DESCRIPTOR);

    CHECK_FEATURE_ENABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                          RasterizationOrderAttachmentAccessFeaturesEXT,
                          rasterizationOrderColorAttachmentAccess);
    CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                           RasterizationOrderAttachmentAccessFeaturesEXT,
                           rasterizationOrderDepthAttachmentAccess);
    CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                           RasterizationOrderAttachmentAccessFeaturesEXT,
                           rasterizationOrderStencilAttachmentAccess);

    CHECK_FEATURE_ENABLED(BLEND_OPERATION_ADVANCED_FEATURES_EXT,
                          BlendOperationAdvancedFeaturesEXT,
                          advancedBlendCoherentOperations);

    //CHECK_FEATURE_ENABLED(EXTENDED_DYNAMIC_STATE_FEATURES_EXT,
    //                      ExtendedDynamicStateFeaturesEXT,
    //                      extendedDynamicState);

    //CHECK_FEATURE_ENABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
    //                      ExtendedDynamicState2FeaturesEXT,
    //                      extendedDynamicState2);
    CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
                           ExtendedDynamicState2FeaturesEXT,
                           extendedDynamicState2LogicOp);
    CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
                           ExtendedDynamicState2FeaturesEXT,
                           extendedDynamicState2PatchControlPoints);

    //CHECK_FEATURE_ENABLED(VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT,
    //                      VertexInputDynamicStateFeaturesEXT,
    //                      vertexInputDynamicState);

    //CHECK_FEATURE_ENABLED(GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT,
    //                      GraphicsPipelineLibraryFeaturesEXT,
    //                      graphicsPipelineLibrary);

    CHECK_FEATURE_ENABLED(SAMPLER_YCBCR_CONVERSION_FEATURES,
                          SamplerYcbcrConversionFeatures,
                          samplerYcbcrConversion);

    CHECK_FEATURE_ENABLED(RGBA10X6_FORMATS_FEATURES_EXT,
                          RGBA10X6FormatsFeaturesEXT,
                          formatRgba10x6WithoutYCbCrSampler);

    //CHECK_FEATURE_ENABLED(SYNCHRONIZATION_2_FEATURES, Synchronization2Features, synchronization2);

    //CHECK_FEATURE_ENABLED(DYNAMIC_RENDERING_FEATURES, DynamicRenderingFeatures, dynamicRendering);

    //CHECK_FEATURE_ENABLED(DYNAMIC_RENDERING_LOCAL_READ_FEATURES,
    //                      DynamicRenderingLocalReadFeatures,
    //                      dynamicRenderingLocalRead);

    //CHECK_FEATURE_ENABLED(MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT,
    //                      MultisampledRenderToSingleSampledFeaturesEXT,
    //                      multisampledRenderToSingleSampled);

    //CHECK_FEATURE_ENABLED(HOST_IMAGE_COPY_FEATURES, HostImageCopyFeatures, hostImageCopy);

    CHECK_FEATURE_ENABLED(PIPELINE_CREATION_CACHE_CONTROL_FEATURES,
                          PipelineCreationCacheControlFeatures,
                          pipelineCreationCacheControl);
}

// A test where the application adds no features and extensions and lets Skia choose them. Uses
// Vulkan 1.2 as the API version.
DEF_TEST(VkPreferredFeaturesTest_BasicVulkan12, reporter) {
    VulkanExts config;
    const std::vector<VkExtensionProperties> exts = get_device_exts(config);

    skgpu::VulkanPreferredFeatures preferred;
    preferred.init(VK_API_VERSION_1_2);

    {
        std::vector<const char*> instanceExts;
        preferred.addToInstanceExtensions(nullptr, 0, instanceExts);
    }

    VkPhysicalDeviceFeatures2 features = {};
    features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;

    // Ask Skia to add its features to query
    preferred.addFeaturesToQuery(exts.data(), exts.size(), features);
    // Populate the requested features
    enable_device_features(config, features.pNext);

    // Ask Skia to enable available features
    std::vector<const char*> enabledExts;
    preferred.addFeaturesToEnable(enabledExts, features);

    CHECK_CHAINED(VULKAN_1_1_FEATURES);
    CHECK_CHAINED(VULKAN_1_2_FEATURES);
    CHECK_NOT_CHAINED(VULKAN_1_3_FEATURES);
    CHECK_NOT_CHAINED(VULKAN_1_4_FEATURES);

    CHECK_EXT_DISABLED(VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
    CHECK_EXT_ENABLED(VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
    CHECK_EXT_ENABLED(VK_EXT_BLEND_OPERATION_ADVANCED);
    //CHECK_EXT_ENABLED(VK_EXT_EXTENDED_DYNAMIC_STATE);
    //CHECK_EXT_ENABLED(VK_EXT_EXTENDED_DYNAMIC_STATE_2);
    //CHECK_EXT_ENABLED(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE);
    //CHECK_EXT_ENABLED(VK_EXT_GRAPHICS_PIPELINE_LIBRARY);
    CHECK_EXT_DISABLED(VK_KHR_SAMPLER_YCBCR_CONVERSION);
    CHECK_EXT_ENABLED(VK_EXT_RGBA10X6_FORMATS);
    //CHECK_EXT_ENABLED(VK_KHR_SYNCHRONIZATION_2);
    //CHECK_EXT_ENABLED(VK_KHR_DYNAMIC_RENDERING);
    //CHECK_EXT_ENABLED(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ);
    //CHECK_EXT_ENABLED(VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED);
    //CHECK_EXT_ENABLED(VK_EXT_HOST_IMAGE_COPY);
    CHECK_EXT_ENABLED(VK_EXT_PIPELINE_CREATION_CACHE_CONTROL);
    CHECK_EXT_DISABLED(VK_KHR_DRIVER_PROPERTIES);
    CHECK_EXT_DISABLED(VK_KHR_CREATE_RENDERPASS_2);
    CHECK_EXT_DISABLED(VK_EXT_LOAD_STORE_OP_NONE);
    CHECK_EXT_ENABLED(VK_KHR_LOAD_STORE_OP_NONE);
    CHECK_EXT_ENABLED(VK_EXT_CONSERVATIVE_RASTERIZATION);
    //CHECK_EXT_ENABLED(VK_KHR_PIPELINE_LIBRARY);
    //CHECK_EXT_ENABLED(VK_KHR_COPY_COMMANDS_2);
    //CHECK_EXT_ENABLED(VK_KHR_FORMAT_FEATURE_FLAGS_2);
    CHECK_EXT_DISABLED(VK_KHR_DEPTH_STENCIL_RESOLVE);
    CHECK_EXT_DISABLED(VK_KHR_SHADER_DRAW_PARAMETERS);
    CHECK_EXT_DISABLED(VK_KHR_DRAW_INDIRECT_COUNT);
    CHECK_EXT_DISABLED(VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE);
    CHECK_EXT_DISABLED(VK_EXT_DESCRIPTOR_INDEXING);
    CHECK_EXT_DISABLED(VK_EXT_SAMPLER_FILTER_MINMAX);
    CHECK_EXT_DISABLED(VK_EXT_SHADER_VIEWPORT_INDEX_LAYER);
    CHECK_EXT_DISABLED(VK_KHR_PUSH_DESCRIPTOR);

    CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, 16BIT_STORAGE_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, MULTIVIEW_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, VARIABLE_POINTERS_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, PROTECTED_MEMORY_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, SHADER_DRAW_PARAMETERS_FEATURES);

    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, 8BIT_STORAGE_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SHADER_ATOMIC_INT64_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SHADER_FLOAT16_INT8_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, DESCRIPTOR_INDEXING_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SCALAR_BLOCK_LAYOUT_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, IMAGELESS_FRAMEBUFFER_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, HOST_QUERY_RESET_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, TIMELINE_SEMAPHORE_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, BUFFER_DEVICE_ADDRESS_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, VULKAN_MEMORY_MODEL_FEATURES);

    CHECK_FEATURE_ENABLED(VULKAN_1_1_FEATURES, Vulkan11Features, samplerYcbcrConversion);
    CHECK_FEATURE_DISABLED(VULKAN_1_1_FEATURES, Vulkan11Features, shaderDrawParameters);

    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerMirrorClampToEdge);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, drawIndirectCount);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, descriptorIndexing);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerFilterMinmax);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputViewportIndex);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputLayer);

    CHECK_FEATURE_ENABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                          RasterizationOrderAttachmentAccessFeaturesEXT,
                          rasterizationOrderColorAttachmentAccess);
    CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                           RasterizationOrderAttachmentAccessFeaturesEXT,
                           rasterizationOrderDepthAttachmentAccess);
    CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                           RasterizationOrderAttachmentAccessFeaturesEXT,
                           rasterizationOrderStencilAttachmentAccess);

    CHECK_FEATURE_ENABLED(BLEND_OPERATION_ADVANCED_FEATURES_EXT,
                          BlendOperationAdvancedFeaturesEXT,
                          advancedBlendCoherentOperations);

    //CHECK_FEATURE_ENABLED(EXTENDED_DYNAMIC_STATE_FEATURES_EXT,
    //                      ExtendedDynamicStateFeaturesEXT,
    //                      extendedDynamicState);

    //CHECK_FEATURE_ENABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
    //                      ExtendedDynamicState2FeaturesEXT,
    //                      extendedDynamicState2);
    CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
                           ExtendedDynamicState2FeaturesEXT,
                           extendedDynamicState2LogicOp);
    CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
                           ExtendedDynamicState2FeaturesEXT,
                           extendedDynamicState2PatchControlPoints);

    //CHECK_FEATURE_ENABLED(VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT,
    //                      VertexInputDynamicStateFeaturesEXT,
    //                      vertexInputDynamicState);

    //CHECK_FEATURE_ENABLED(GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT,
    //                      GraphicsPipelineLibraryFeaturesEXT,
    //                      graphicsPipelineLibrary);

    CHECK_FEATURE_DISABLED(SAMPLER_YCBCR_CONVERSION_FEATURES,
                           SamplerYcbcrConversionFeatures,
                           samplerYcbcrConversion);

    CHECK_FEATURE_ENABLED(RGBA10X6_FORMATS_FEATURES_EXT,
                          RGBA10X6FormatsFeaturesEXT,
                          formatRgba10x6WithoutYCbCrSampler);

    //CHECK_FEATURE_ENABLED(SYNCHRONIZATION_2_FEATURES, Synchronization2Features, synchronization2);

    //CHECK_FEATURE_ENABLED(DYNAMIC_RENDERING_FEATURES, DynamicRenderingFeatures, dynamicRendering);

    //CHECK_FEATURE_ENABLED(DYNAMIC_RENDERING_LOCAL_READ_FEATURES,
    //                      DynamicRenderingLocalReadFeatures,
    //                      dynamicRenderingLocalRead);

    //CHECK_FEATURE_ENABLED(MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT,
    //                      MultisampledRenderToSingleSampledFeaturesEXT,
    //                      multisampledRenderToSingleSampled);

    //CHECK_FEATURE_ENABLED(HOST_IMAGE_COPY_FEATURES, HostImageCopyFeatures, hostImageCopy);

    CHECK_FEATURE_ENABLED(PIPELINE_CREATION_CACHE_CONTROL_FEATURES,
                          PipelineCreationCacheControlFeatures,
                          pipelineCreationCacheControl);
}

// A test where the application adds no features and extensions and lets Skia choose them. Uses
// Vulkan 1.3 as the API version.
DEF_TEST(VkPreferredFeaturesTest_BasicVulkan13, reporter) {
    VulkanExts config;
    const std::vector<VkExtensionProperties> exts = get_device_exts(config);

    skgpu::VulkanPreferredFeatures preferred;
    preferred.init(VK_API_VERSION_1_3);

    {
        std::vector<const char*> instanceExts;
        preferred.addToInstanceExtensions(nullptr, 0, instanceExts);
    }

    VkPhysicalDeviceFeatures2 features = {};
    features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;

    // Ask Skia to add its features to query
    preferred.addFeaturesToQuery(exts.data(), exts.size(), features);
    // Populate the requested features
    enable_device_features(config, features.pNext);

    // Ask Skia to enable available features
    std::vector<const char*> enabledExts;
    preferred.addFeaturesToEnable(enabledExts, features);

    CHECK_CHAINED(VULKAN_1_1_FEATURES);
    CHECK_CHAINED(VULKAN_1_2_FEATURES);
    CHECK_CHAINED(VULKAN_1_3_FEATURES);
    CHECK_NOT_CHAINED(VULKAN_1_4_FEATURES);

    CHECK_EXT_DISABLED(VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
    CHECK_EXT_ENABLED(VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
    CHECK_EXT_ENABLED(VK_EXT_BLEND_OPERATION_ADVANCED);
    CHECK_EXT_DISABLED(VK_EXT_EXTENDED_DYNAMIC_STATE);
    CHECK_EXT_DISABLED(VK_EXT_EXTENDED_DYNAMIC_STATE_2);
    //CHECK_EXT_ENABLED(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE);
    //CHECK_EXT_ENABLED(VK_EXT_GRAPHICS_PIPELINE_LIBRARY);
    CHECK_EXT_DISABLED(VK_KHR_SAMPLER_YCBCR_CONVERSION);
    CHECK_EXT_ENABLED(VK_EXT_RGBA10X6_FORMATS);
    CHECK_EXT_DISABLED(VK_KHR_SYNCHRONIZATION_2);
    CHECK_EXT_DISABLED(VK_KHR_DYNAMIC_RENDERING);
    //CHECK_EXT_ENABLED(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ);
    //CHECK_EXT_ENABLED(VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED);
    //CHECK_EXT_ENABLED(VK_EXT_HOST_IMAGE_COPY);
    CHECK_EXT_DISABLED(VK_EXT_PIPELINE_CREATION_CACHE_CONTROL);
    CHECK_EXT_DISABLED(VK_KHR_DRIVER_PROPERTIES);
    CHECK_EXT_DISABLED(VK_KHR_CREATE_RENDERPASS_2);
    CHECK_EXT_DISABLED(VK_EXT_LOAD_STORE_OP_NONE);
    CHECK_EXT_ENABLED(VK_KHR_LOAD_STORE_OP_NONE);
    CHECK_EXT_ENABLED(VK_EXT_CONSERVATIVE_RASTERIZATION);
    //CHECK_EXT_ENABLED(VK_KHR_PIPELINE_LIBRARY);
    CHECK_EXT_DISABLED(VK_KHR_COPY_COMMANDS_2);
    CHECK_EXT_DISABLED(VK_KHR_FORMAT_FEATURE_FLAGS_2);
    CHECK_EXT_DISABLED(VK_KHR_DEPTH_STENCIL_RESOLVE);
    CHECK_EXT_DISABLED(VK_KHR_SHADER_DRAW_PARAMETERS);
    CHECK_EXT_DISABLED(VK_KHR_DRAW_INDIRECT_COUNT);
    CHECK_EXT_DISABLED(VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE);
    CHECK_EXT_DISABLED(VK_EXT_DESCRIPTOR_INDEXING);
    CHECK_EXT_DISABLED(VK_EXT_SAMPLER_FILTER_MINMAX);
    CHECK_EXT_DISABLED(VK_EXT_SHADER_VIEWPORT_INDEX_LAYER);
    CHECK_EXT_DISABLED(VK_KHR_PUSH_DESCRIPTOR);

    CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, 16BIT_STORAGE_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, MULTIVIEW_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, VARIABLE_POINTERS_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, PROTECTED_MEMORY_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, SHADER_DRAW_PARAMETERS_FEATURES);

    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, 8BIT_STORAGE_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SHADER_ATOMIC_INT64_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SHADER_FLOAT16_INT8_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, DESCRIPTOR_INDEXING_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SCALAR_BLOCK_LAYOUT_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, IMAGELESS_FRAMEBUFFER_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, HOST_QUERY_RESET_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, TIMELINE_SEMAPHORE_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, BUFFER_DEVICE_ADDRESS_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, VULKAN_MEMORY_MODEL_FEATURES);

    CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, IMAGE_ROBUSTNESS_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, INLINE_UNIFORM_BLOCK_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, MAINTENANCE_4_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, PRIVATE_DATA_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, SHADER_INTEGER_DOT_PRODUCT_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, SHADER_TERMINATE_INVOCATION_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, SUBGROUP_SIZE_CONTROL_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, TEXTURE_COMPRESSION_ASTC_HDR_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES);

    CHECK_FEATURE_ENABLED(VULKAN_1_1_FEATURES, Vulkan11Features, samplerYcbcrConversion);
    CHECK_FEATURE_DISABLED(VULKAN_1_1_FEATURES, Vulkan11Features, shaderDrawParameters);

    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerMirrorClampToEdge);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, drawIndirectCount);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, descriptorIndexing);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerFilterMinmax);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputViewportIndex);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputLayer);

    CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, pipelineCreationCacheControl);
    CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, synchronization2);
    CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, dynamicRendering);

    CHECK_FEATURE_ENABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                          RasterizationOrderAttachmentAccessFeaturesEXT,
                          rasterizationOrderColorAttachmentAccess);
    CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                           RasterizationOrderAttachmentAccessFeaturesEXT,
                           rasterizationOrderDepthAttachmentAccess);
    CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                           RasterizationOrderAttachmentAccessFeaturesEXT,
                           rasterizationOrderStencilAttachmentAccess);

    CHECK_FEATURE_ENABLED(BLEND_OPERATION_ADVANCED_FEATURES_EXT,
                          BlendOperationAdvancedFeaturesEXT,
                          advancedBlendCoherentOperations);

    CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_FEATURES_EXT,
                           ExtendedDynamicStateFeaturesEXT,
                           extendedDynamicState);

    CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
                           ExtendedDynamicState2FeaturesEXT,
                           extendedDynamicState2);
    CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
                           ExtendedDynamicState2FeaturesEXT,
                           extendedDynamicState2LogicOp);
    CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
                           ExtendedDynamicState2FeaturesEXT,
                           extendedDynamicState2PatchControlPoints);

    //CHECK_FEATURE_ENABLED(VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT,
    //                      VertexInputDynamicStateFeaturesEXT,
    //                      vertexInputDynamicState);

    //CHECK_FEATURE_ENABLED(GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT,
    //                      GraphicsPipelineLibraryFeaturesEXT,
    //                      graphicsPipelineLibrary);

    CHECK_FEATURE_DISABLED(SAMPLER_YCBCR_CONVERSION_FEATURES,
                           SamplerYcbcrConversionFeatures,
                           samplerYcbcrConversion);

    CHECK_FEATURE_ENABLED(RGBA10X6_FORMATS_FEATURES_EXT,
                          RGBA10X6FormatsFeaturesEXT,
                          formatRgba10x6WithoutYCbCrSampler);

    CHECK_FEATURE_DISABLED(SYNCHRONIZATION_2_FEATURES, Synchronization2Features, synchronization2);

    CHECK_FEATURE_DISABLED(DYNAMIC_RENDERING_FEATURES, DynamicRenderingFeatures, dynamicRendering);

    //CHECK_FEATURE_ENABLED(DYNAMIC_RENDERING_LOCAL_READ_FEATURES,
    //                      DynamicRenderingLocalReadFeatures,
    //                      dynamicRenderingLocalRead);

    //CHECK_FEATURE_ENABLED(MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT,
    //                      MultisampledRenderToSingleSampledFeaturesEXT,
    //                      multisampledRenderToSingleSampled);

    //CHECK_FEATURE_ENABLED(HOST_IMAGE_COPY_FEATURES, HostImageCopyFeatures, hostImageCopy);

    CHECK_FEATURE_DISABLED(PIPELINE_CREATION_CACHE_CONTROL_FEATURES,
                           PipelineCreationCacheControlFeatures,
                           pipelineCreationCacheControl);
}

// A test where the application adds no features and extensions and lets Skia choose them. Uses
// Vulkan 1.4 as the API version.
DEF_TEST(VkPreferredFeaturesTest_BasicVulkan14, reporter) {
    VulkanExts config;
    const std::vector<VkExtensionProperties> exts = get_device_exts(config);

    skgpu::VulkanPreferredFeatures preferred;
    preferred.init(VK_API_VERSION_1_4);

    {
        std::vector<const char*> instanceExts;
        preferred.addToInstanceExtensions(nullptr, 0, instanceExts);
    }

    VkPhysicalDeviceFeatures2 features = {};
    features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;

    // Ask Skia to add its features to query
    preferred.addFeaturesToQuery(exts.data(), exts.size(), features);
    // Populate the requested features
    enable_device_features(config, features.pNext);

    // Ask Skia to enable available features
    std::vector<const char*> enabledExts;
    preferred.addFeaturesToEnable(enabledExts, features);

    CHECK_CHAINED(VULKAN_1_1_FEATURES);
    CHECK_CHAINED(VULKAN_1_2_FEATURES);
    CHECK_CHAINED(VULKAN_1_3_FEATURES);
    CHECK_CHAINED(VULKAN_1_4_FEATURES);

    CHECK_EXT_DISABLED(VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
    CHECK_EXT_ENABLED(VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
    CHECK_EXT_ENABLED(VK_EXT_BLEND_OPERATION_ADVANCED);
    CHECK_EXT_DISABLED(VK_EXT_EXTENDED_DYNAMIC_STATE);
    CHECK_EXT_DISABLED(VK_EXT_EXTENDED_DYNAMIC_STATE_2);
    //CHECK_EXT_ENABLED(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE);
    //CHECK_EXT_ENABLED(VK_EXT_GRAPHICS_PIPELINE_LIBRARY);
    CHECK_EXT_DISABLED(VK_KHR_SAMPLER_YCBCR_CONVERSION);
    CHECK_EXT_ENABLED(VK_EXT_RGBA10X6_FORMATS);
    CHECK_EXT_DISABLED(VK_KHR_SYNCHRONIZATION_2);
    CHECK_EXT_DISABLED(VK_KHR_DYNAMIC_RENDERING);
    CHECK_EXT_DISABLED(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ);
    //CHECK_EXT_ENABLED(VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED);
    CHECK_EXT_DISABLED(VK_EXT_HOST_IMAGE_COPY);
    CHECK_EXT_DISABLED(VK_EXT_PIPELINE_CREATION_CACHE_CONTROL);
    CHECK_EXT_DISABLED(VK_KHR_DRIVER_PROPERTIES);
    CHECK_EXT_DISABLED(VK_KHR_CREATE_RENDERPASS_2);
    CHECK_EXT_DISABLED(VK_EXT_LOAD_STORE_OP_NONE);
    CHECK_EXT_DISABLED(VK_KHR_LOAD_STORE_OP_NONE);
    CHECK_EXT_ENABLED(VK_EXT_CONSERVATIVE_RASTERIZATION);
    //CHECK_EXT_ENABLED(VK_KHR_PIPELINE_LIBRARY);
    CHECK_EXT_DISABLED(VK_KHR_COPY_COMMANDS_2);
    CHECK_EXT_DISABLED(VK_KHR_FORMAT_FEATURE_FLAGS_2);
    CHECK_EXT_DISABLED(VK_KHR_DEPTH_STENCIL_RESOLVE);
    CHECK_EXT_DISABLED(VK_KHR_SHADER_DRAW_PARAMETERS);
    CHECK_EXT_DISABLED(VK_KHR_DRAW_INDIRECT_COUNT);
    CHECK_EXT_DISABLED(VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE);
    CHECK_EXT_DISABLED(VK_EXT_DESCRIPTOR_INDEXING);
    CHECK_EXT_DISABLED(VK_EXT_SAMPLER_FILTER_MINMAX);
    CHECK_EXT_DISABLED(VK_EXT_SHADER_VIEWPORT_INDEX_LAYER);
    CHECK_EXT_DISABLED(VK_KHR_PUSH_DESCRIPTOR);

    CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, 16BIT_STORAGE_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, MULTIVIEW_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, VARIABLE_POINTERS_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, PROTECTED_MEMORY_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, SHADER_DRAW_PARAMETERS_FEATURES);

    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, 8BIT_STORAGE_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SHADER_ATOMIC_INT64_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SHADER_FLOAT16_INT8_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, DESCRIPTOR_INDEXING_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SCALAR_BLOCK_LAYOUT_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, IMAGELESS_FRAMEBUFFER_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, HOST_QUERY_RESET_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, TIMELINE_SEMAPHORE_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, BUFFER_DEVICE_ADDRESS_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, VULKAN_MEMORY_MODEL_FEATURES);

    CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, IMAGE_ROBUSTNESS_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, INLINE_UNIFORM_BLOCK_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, MAINTENANCE_4_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, PRIVATE_DATA_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, SHADER_INTEGER_DOT_PRODUCT_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, SHADER_TERMINATE_INVOCATION_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, SUBGROUP_SIZE_CONTROL_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, TEXTURE_COMPRESSION_ASTC_HDR_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES);

    CHECK_EXCLUSIVE(VULKAN_1_4_FEATURES, GLOBAL_PRIORITY_QUERY_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_4_FEATURES, SHADER_SUBGROUP_ROTATE_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_4_FEATURES, SHADER_FLOAT_CONTROLS_2_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_4_FEATURES, SHADER_EXPECT_ASSUME_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_4_FEATURES, LINE_RASTERIZATION_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_4_FEATURES, VERTEX_ATTRIBUTE_DIVISOR_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_4_FEATURES, INDEX_TYPE_UINT8_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_4_FEATURES, MAINTENANCE_5_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_4_FEATURES, MAINTENANCE_6_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_4_FEATURES, PIPELINE_PROTECTED_ACCESS_FEATURES);
    CHECK_EXCLUSIVE(VULKAN_1_4_FEATURES, PIPELINE_ROBUSTNESS_FEATURES);

    CHECK_FEATURE_ENABLED(VULKAN_1_1_FEATURES, Vulkan11Features, samplerYcbcrConversion);
    CHECK_FEATURE_DISABLED(VULKAN_1_1_FEATURES, Vulkan11Features, shaderDrawParameters);

    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerMirrorClampToEdge);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, drawIndirectCount);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, descriptorIndexing);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerFilterMinmax);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputViewportIndex);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputLayer);

    CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, pipelineCreationCacheControl);
    CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, synchronization2);
    CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, dynamicRendering);

    CHECK_FEATURE_ENABLED(VULKAN_1_4_FEATURES, Vulkan14Features, dynamicRenderingLocalRead);
    CHECK_FEATURE_ENABLED(VULKAN_1_4_FEATURES, Vulkan14Features, hostImageCopy);

    CHECK_FEATURE_ENABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                          RasterizationOrderAttachmentAccessFeaturesEXT,
                          rasterizationOrderColorAttachmentAccess);
    CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                           RasterizationOrderAttachmentAccessFeaturesEXT,
                           rasterizationOrderDepthAttachmentAccess);
    CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                           RasterizationOrderAttachmentAccessFeaturesEXT,
                           rasterizationOrderStencilAttachmentAccess);

    CHECK_FEATURE_ENABLED(BLEND_OPERATION_ADVANCED_FEATURES_EXT,
                          BlendOperationAdvancedFeaturesEXT,
                          advancedBlendCoherentOperations);

    CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_FEATURES_EXT,
                           ExtendedDynamicStateFeaturesEXT,
                           extendedDynamicState);

    CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
                           ExtendedDynamicState2FeaturesEXT,
                           extendedDynamicState2);
    CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
                           ExtendedDynamicState2FeaturesEXT,
                           extendedDynamicState2LogicOp);
    CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
                           ExtendedDynamicState2FeaturesEXT,
                           extendedDynamicState2PatchControlPoints);

    //CHECK_FEATURE_ENABLED(VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT,
    //                      VertexInputDynamicStateFeaturesEXT,
    //                      vertexInputDynamicState);

    //CHECK_FEATURE_ENABLED(GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT,
    //                      GraphicsPipelineLibraryFeaturesEXT,
    //                      graphicsPipelineLibrary);

    CHECK_FEATURE_DISABLED(SAMPLER_YCBCR_CONVERSION_FEATURES,
                           SamplerYcbcrConversionFeatures,
                           samplerYcbcrConversion);

    CHECK_FEATURE_ENABLED(RGBA10X6_FORMATS_FEATURES_EXT,
                          RGBA10X6FormatsFeaturesEXT,
                          formatRgba10x6WithoutYCbCrSampler);

    CHECK_FEATURE_DISABLED(SYNCHRONIZATION_2_FEATURES, Synchronization2Features, synchronization2);

    CHECK_FEATURE_DISABLED(DYNAMIC_RENDERING_FEATURES, DynamicRenderingFeatures, dynamicRendering);

    CHECK_FEATURE_DISABLED(DYNAMIC_RENDERING_LOCAL_READ_FEATURES,
                           DynamicRenderingLocalReadFeatures,
                           dynamicRenderingLocalRead);

    //CHECK_FEATURE_ENABLED(MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT,
    //                      MultisampledRenderToSingleSampledFeaturesEXT,
    //                      multisampledRenderToSingleSampled);

    CHECK_FEATURE_DISABLED(HOST_IMAGE_COPY_FEATURES, HostImageCopyFeatures, hostImageCopy);

    CHECK_FEATURE_DISABLED(PIPELINE_CREATION_CACHE_CONTROL_FEATURES,
                           PipelineCreationCacheControlFeatures,
                           pipelineCreationCacheControl);
}

#define CHAIN(STRUCT_NAME, StructName, Feature)                              \
    VkPhysicalDevice##StructName app##StructName = {};                       \
    app##StructName.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_##STRUCT_NAME; \
    app##StructName.pNext = features.pNext;                                  \
    app##StructName.Feature = VK_TRUE;                                       \
    features.pNext = &app##StructName

#define ADDEXT(EXTNAME) enabledExts.push_back(EXTNAME##_EXTENSION_NAME)

// A test where the application adds some features and extensions and lets Skia add to them. At the
// same time, support for some extensions is disabled. Uses Vulkan 1.1 as the API version.
DEF_TEST(VkPreferredFeaturesTest_CustomVulkan11, reporter) {
    VulkanExts config;
    config.fSamplerFilterMinmaxEXT = false;
    config.fDynamicRenderingKHR = false;
    config.fDynamicRenderingLocalReadKHR = false;
    config.fRasterizationOrderAttachmentAccessARM = false;
    config.fSamplerYcbcrConversionKHR = false;
    config.fLoadStoreOpNoneKHR = false;
    config.fPushDescriptorKHR = false;
    config.fDepthStencilResolveKHR = false;
    config.fMultisampledRenderToSingleSampledEXT = false;
    config.fGraphicsPipelineLibraryEXT = false;
    config.fExtendedDynamicState2EXT = false;
    config.fCreateRenderpass2KHR = false;

    const std::vector<VkExtensionProperties> exts = get_device_exts(config);

    skgpu::VulkanPreferredFeatures preferred;
    preferred.init(VK_API_VERSION_1_1);

    {
        std::vector<const char*> instanceExts;
        preferred.addToInstanceExtensions(nullptr, 0, instanceExts);
    }

    VkPhysicalDeviceFeatures2 features = {};
    features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;

    CHAIN(SUBGROUP_SIZE_CONTROL_FEATURES, SubgroupSizeControlFeatures, subgroupSizeControl);
    CHAIN(SHADER_OBJECT_FEATURES_EXT, ShaderObjectFeaturesEXT, shaderObject);
    CHAIN(MAINTENANCE_5_FEATURES, Maintenance5Features, maintenance5);
    CHAIN(HOST_IMAGE_COPY_FEATURES, HostImageCopyFeatures, hostImageCopy);

    // Ask Skia to add its features to query
    preferred.addFeaturesToQuery(exts.data(), exts.size(), features);
    // Populate the requested features
    enable_device_features(config, features.pNext);

    std::vector<const char*> enabledExts;
    ADDEXT(VK_EXT_SUBGROUP_SIZE_CONTROL);
    ADDEXT(VK_KHR_MAINTENANCE_4);
    ADDEXT(VK_KHR_PUSH_DESCRIPTOR);

    // Ask Skia to enable available features
    preferred.addFeaturesToEnable(enabledExts, features);

    CHECK_NOT_CHAINED(VULKAN_1_1_FEATURES);
    CHECK_NOT_CHAINED(VULKAN_1_2_FEATURES);
    CHECK_NOT_CHAINED(VULKAN_1_3_FEATURES);
    CHECK_NOT_CHAINED(VULKAN_1_4_FEATURES);

    CHECK_EXT_DISABLED(VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
    CHECK_EXT_ENABLED(VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
    CHECK_EXT_ENABLED(VK_EXT_BLEND_OPERATION_ADVANCED);
    //CHECK_EXT_ENABLED(VK_EXT_EXTENDED_DYNAMIC_STATE);
    CHECK_EXT_DISABLED(VK_EXT_EXTENDED_DYNAMIC_STATE_2);
    //CHECK_EXT_ENABLED(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE);
    CHECK_EXT_DISABLED(VK_EXT_GRAPHICS_PIPELINE_LIBRARY);
    CHECK_EXT_DISABLED(VK_KHR_SAMPLER_YCBCR_CONVERSION);
    CHECK_EXT_ENABLED(VK_EXT_RGBA10X6_FORMATS);
    //CHECK_EXT_ENABLED(VK_KHR_SYNCHRONIZATION_2);
    CHECK_EXT_DISABLED(VK_KHR_DYNAMIC_RENDERING);
    CHECK_EXT_DISABLED(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ);
    CHECK_EXT_DISABLED(VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED);
    //CHECK_EXT_ENABLED(VK_EXT_HOST_IMAGE_COPY);
    CHECK_EXT_ENABLED(VK_EXT_PIPELINE_CREATION_CACHE_CONTROL);
    CHECK_EXT_ENABLED(VK_KHR_DRIVER_PROPERTIES);
    CHECK_EXT_DISABLED(VK_KHR_CREATE_RENDERPASS_2);
    CHECK_EXT_ENABLED(VK_EXT_LOAD_STORE_OP_NONE);
    CHECK_EXT_DISABLED(VK_KHR_LOAD_STORE_OP_NONE);
    CHECK_EXT_ENABLED(VK_EXT_CONSERVATIVE_RASTERIZATION);
    CHECK_EXT_DISABLED(VK_KHR_PIPELINE_LIBRARY);
    //CHECK_EXT_ENABLED(VK_KHR_COPY_COMMANDS_2);
    //CHECK_EXT_ENABLED(VK_KHR_FORMAT_FEATURE_FLAGS_2);
    CHECK_EXT_DISABLED(VK_KHR_DEPTH_STENCIL_RESOLVE);
    CHECK_EXT_DISABLED(VK_KHR_SHADER_DRAW_PARAMETERS);
    CHECK_EXT_DISABLED(VK_KHR_DRAW_INDIRECT_COUNT);
    CHECK_EXT_DISABLED(VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE);
    CHECK_EXT_DISABLED(VK_EXT_DESCRIPTOR_INDEXING);
    CHECK_EXT_DISABLED(VK_EXT_SAMPLER_FILTER_MINMAX);
    CHECK_EXT_DISABLED(VK_EXT_SHADER_VIEWPORT_INDEX_LAYER);
    // Extensions enabled by the app must remain enabled
    CHECK_EXT_ENABLED(VK_EXT_SUBGROUP_SIZE_CONTROL);
    CHECK_EXT_ENABLED(VK_KHR_MAINTENANCE_4);
    CHECK_EXT_ENABLED(VK_KHR_PUSH_DESCRIPTOR);

    CHECK_FEATURE_ENABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                          RasterizationOrderAttachmentAccessFeaturesEXT,
                          rasterizationOrderColorAttachmentAccess);
    CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                           RasterizationOrderAttachmentAccessFeaturesEXT,
                           rasterizationOrderDepthAttachmentAccess);
    CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                           RasterizationOrderAttachmentAccessFeaturesEXT,
                           rasterizationOrderStencilAttachmentAccess);

    CHECK_FEATURE_ENABLED(BLEND_OPERATION_ADVANCED_FEATURES_EXT,
                          BlendOperationAdvancedFeaturesEXT,
                          advancedBlendCoherentOperations);

    //CHECK_FEATURE_ENABLED(EXTENDED_DYNAMIC_STATE_FEATURES_EXT,
    //                      ExtendedDynamicStateFeaturesEXT,
    //                      extendedDynamicState);

    CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
                           ExtendedDynamicState2FeaturesEXT,
                           extendedDynamicState2);
    CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
                           ExtendedDynamicState2FeaturesEXT,
                           extendedDynamicState2LogicOp);
    CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
                           ExtendedDynamicState2FeaturesEXT,
                           extendedDynamicState2PatchControlPoints);

    //CHECK_FEATURE_ENABLED(VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT,
    //                      VertexInputDynamicStateFeaturesEXT,
    //                      vertexInputDynamicState);

    CHECK_FEATURE_DISABLED(GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT,
                           GraphicsPipelineLibraryFeaturesEXT,
                           graphicsPipelineLibrary);

    CHECK_FEATURE_DISABLED(SAMPLER_YCBCR_CONVERSION_FEATURES,
                           SamplerYcbcrConversionFeatures,
                           samplerYcbcrConversion);

    CHECK_FEATURE_ENABLED(RGBA10X6_FORMATS_FEATURES_EXT,
                          RGBA10X6FormatsFeaturesEXT,
                          formatRgba10x6WithoutYCbCrSampler);

    //CHECK_FEATURE_ENABLED(SYNCHRONIZATION_2_FEATURES, Synchronization2Features, synchronization2);

    CHECK_FEATURE_DISABLED(DYNAMIC_RENDERING_FEATURES, DynamicRenderingFeatures, dynamicRendering);

    CHECK_FEATURE_DISABLED(DYNAMIC_RENDERING_LOCAL_READ_FEATURES,
                           DynamicRenderingLocalReadFeatures,
                           dynamicRenderingLocalRead);

    CHECK_FEATURE_DISABLED(MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT,
                           MultisampledRenderToSingleSampledFeaturesEXT,
                           multisampledRenderToSingleSampled);

    CHECK_FEATURE_ENABLED(PIPELINE_CREATION_CACHE_CONTROL_FEATURES,
                          PipelineCreationCacheControlFeatures,
                          pipelineCreationCacheControl);

    // Features enabled by the app must remain enabled
    CHECK_FEATURE_ENABLED(
            SUBGROUP_SIZE_CONTROL_FEATURES, SubgroupSizeControlFeatures, subgroupSizeControl);
    CHECK_FEATURE_ENABLED(SHADER_OBJECT_FEATURES_EXT, ShaderObjectFeaturesEXT, shaderObject);
    CHECK_FEATURE_ENABLED(MAINTENANCE_5_FEATURES, Maintenance5Features, maintenance5);
    CHECK_FEATURE_ENABLED(HOST_IMAGE_COPY_FEATURES, HostImageCopyFeatures, hostImageCopy);
}

// A test where the application adds some features and extensions and lets Skia add to them. At the
// same time, support for some extensions is disabled. Uses Vulkan 1.2 as the API version.
DEF_TEST(VkPreferredFeaturesTest_CustomVulkan12, reporter) {
    VulkanExts config;
    config.fSamplerFilterMinmaxEXT = false;
    config.fShaderViewportIndexLayerEXT = false;
    config.fRGBA10x6FormatsEXT = false;
    config.fHostImageCopyEXT = false;
    config.fVertexInputDynamicStateEXT = false;
    config.fExtendedDynamicStateEXT = false;
    config.fExtendedDynamicState2EXT = false;

    const std::vector<VkExtensionProperties> exts = get_device_exts(config);

    skgpu::VulkanPreferredFeatures preferred;
    preferred.init(VK_API_VERSION_1_2);

    {
        std::vector<const char*> instanceExts;
        preferred.addToInstanceExtensions(nullptr, 0, instanceExts);
    }

    VkPhysicalDeviceFeatures2 features = {};
    features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;

    CHAIN(SUBGROUP_SIZE_CONTROL_FEATURES, SubgroupSizeControlFeatures, subgroupSizeControl);
    CHAIN(DESCRIPTOR_INDEXING_FEATURES,
          DescriptorIndexingFeatures,
          shaderUniformTexelBufferArrayNonUniformIndexing);
    appDescriptorIndexingFeatures.runtimeDescriptorArray = VK_TRUE;
    CHAIN(SHADER_OBJECT_FEATURES_EXT, ShaderObjectFeaturesEXT, shaderObject);
    CHAIN(PIPELINE_CREATION_CACHE_CONTROL_FEATURES,
          PipelineCreationCacheControlFeatures,
          pipelineCreationCacheControl);
    CHAIN(SHADER_ATOMIC_INT64_FEATURES, ShaderAtomicInt64Features, shaderSharedInt64Atomics);

    // Ask Skia to add its features to query
    preferred.addFeaturesToQuery(exts.data(), exts.size(), features);
    // Populate the requested features
    enable_device_features(config, features.pNext);

    std::vector<const char*> enabledExts;
    ADDEXT(VK_EXT_SHADER_OBJECT);
    ADDEXT(VK_EXT_RGBA10X6_FORMATS);
    ADDEXT(VK_KHR_PUSH_DESCRIPTOR);
    ADDEXT(VK_KHR_SHADER_DRAW_PARAMETERS);
    ADDEXT(VK_EXT_DESCRIPTOR_INDEXING);
    ADDEXT(VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE);

    // Ask Skia to enable available features
    preferred.addFeaturesToEnable(enabledExts, features);

    CHECK_CHAINED(VULKAN_1_1_FEATURES);
    CHECK_CHAINED(VULKAN_1_2_FEATURES);
    CHECK_NOT_CHAINED(VULKAN_1_3_FEATURES);
    CHECK_NOT_CHAINED(VULKAN_1_4_FEATURES);

    CHECK_NOT_CHAINED(SAMPLER_YCBCR_CONVERSION_FEATURES);
    CHECK_NOT_CHAINED(DESCRIPTOR_INDEXING_FEATURES);
    CHECK_NOT_CHAINED(SHADER_ATOMIC_INT64_FEATURES);

    CHECK_EXT_DISABLED(VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
    CHECK_EXT_ENABLED(VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
    CHECK_EXT_ENABLED(VK_EXT_BLEND_OPERATION_ADVANCED);
    CHECK_EXT_DISABLED(VK_EXT_EXTENDED_DYNAMIC_STATE);
    CHECK_EXT_DISABLED(VK_EXT_EXTENDED_DYNAMIC_STATE_2);
    CHECK_EXT_DISABLED(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE);
    //CHECK_EXT_ENABLED(VK_EXT_GRAPHICS_PIPELINE_LIBRARY);
    CHECK_EXT_DISABLED(VK_KHR_SAMPLER_YCBCR_CONVERSION);
    //CHECK_EXT_ENABLED(VK_KHR_SYNCHRONIZATION_2);
    //CHECK_EXT_ENABLED(VK_KHR_DYNAMIC_RENDERING);
    //CHECK_EXT_ENABLED(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ);
    //CHECK_EXT_ENABLED(VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED);
    CHECK_EXT_DISABLED(VK_EXT_HOST_IMAGE_COPY);
    CHECK_EXT_ENABLED(VK_EXT_PIPELINE_CREATION_CACHE_CONTROL);
    CHECK_EXT_DISABLED(VK_KHR_DRIVER_PROPERTIES);
    CHECK_EXT_DISABLED(VK_KHR_CREATE_RENDERPASS_2);
    CHECK_EXT_DISABLED(VK_EXT_LOAD_STORE_OP_NONE);
    CHECK_EXT_ENABLED(VK_KHR_LOAD_STORE_OP_NONE);
    CHECK_EXT_ENABLED(VK_EXT_CONSERVATIVE_RASTERIZATION);
    //CHECK_EXT_ENABLED(VK_KHR_PIPELINE_LIBRARY);
    //CHECK_EXT_ENABLED(VK_KHR_COPY_COMMANDS_2);
    //CHECK_EXT_ENABLED(VK_KHR_FORMAT_FEATURE_FLAGS_2);
    CHECK_EXT_DISABLED(VK_KHR_DEPTH_STENCIL_RESOLVE);
    CHECK_EXT_DISABLED(VK_KHR_DRAW_INDIRECT_COUNT);
    CHECK_EXT_DISABLED(VK_EXT_SAMPLER_FILTER_MINMAX);
    CHECK_EXT_DISABLED(VK_EXT_SHADER_VIEWPORT_INDEX_LAYER);
    // Extensions enabled by the app must remain enabled
    CHECK_EXT_ENABLED(VK_EXT_SHADER_OBJECT);
    CHECK_EXT_ENABLED(VK_EXT_RGBA10X6_FORMATS);
    CHECK_EXT_ENABLED(VK_KHR_PUSH_DESCRIPTOR);
    CHECK_EXT_ENABLED(VK_KHR_SHADER_DRAW_PARAMETERS);
    CHECK_EXT_ENABLED(VK_EXT_DESCRIPTOR_INDEXING);
    CHECK_EXT_ENABLED(VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE);

    CHECK_FEATURE_ENABLED(VULKAN_1_1_FEATURES, Vulkan11Features, samplerYcbcrConversion);
    CHECK_FEATURE_ENABLED(VULKAN_1_1_FEATURES, Vulkan11Features, shaderDrawParameters);

    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerMirrorClampToEdge);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, drawIndirectCount);
    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, descriptorIndexing);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, shaderInputAttachmentArrayDynamicIndexing);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, shaderUniformTexelBufferArrayDynamicIndexing);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, shaderStorageTexelBufferArrayDynamicIndexing);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, shaderUniformBufferArrayNonUniformIndexing);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, shaderSampledImageArrayNonUniformIndexing);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, shaderStorageBufferArrayNonUniformIndexing);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, shaderStorageImageArrayNonUniformIndexing);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, shaderInputAttachmentArrayNonUniformIndexing);
    CHECK_FEATURE_ENABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, shaderUniformTexelBufferArrayNonUniformIndexing);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, shaderStorageTexelBufferArrayNonUniformIndexing);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingUniformBufferUpdateAfterBind);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingSampledImageUpdateAfterBind);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingStorageImageUpdateAfterBind);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingStorageBufferUpdateAfterBind);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES,
                           Vulkan12Features,
                           descriptorBindingUniformTexelBufferUpdateAfterBind);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES,
                           Vulkan12Features,
                           descriptorBindingStorageTexelBufferUpdateAfterBind);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingUpdateUnusedWhilePending);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingPartiallyBound);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingVariableDescriptorCount);
    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, runtimeDescriptorArray);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderBufferInt64Atomics);
    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderSharedInt64Atomics);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerFilterMinmax);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputViewportIndex);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputLayer);

    CHECK_FEATURE_ENABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                          RasterizationOrderAttachmentAccessFeaturesEXT,
                          rasterizationOrderColorAttachmentAccess);
    CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                           RasterizationOrderAttachmentAccessFeaturesEXT,
                           rasterizationOrderDepthAttachmentAccess);
    CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                           RasterizationOrderAttachmentAccessFeaturesEXT,
                           rasterizationOrderStencilAttachmentAccess);

    CHECK_FEATURE_ENABLED(BLEND_OPERATION_ADVANCED_FEATURES_EXT,
                          BlendOperationAdvancedFeaturesEXT,
                          advancedBlendCoherentOperations);

    CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_FEATURES_EXT,
                           ExtendedDynamicStateFeaturesEXT,
                           extendedDynamicState);

    CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
                           ExtendedDynamicState2FeaturesEXT,
                           extendedDynamicState2);
    CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
                           ExtendedDynamicState2FeaturesEXT,
                           extendedDynamicState2LogicOp);
    CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
                           ExtendedDynamicState2FeaturesEXT,
                           extendedDynamicState2PatchControlPoints);

    CHECK_FEATURE_DISABLED(VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT,
                           VertexInputDynamicStateFeaturesEXT,
                           vertexInputDynamicState);

    //CHECK_FEATURE_ENABLED(GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT,
    //                      GraphicsPipelineLibraryFeaturesEXT,
    //                      graphicsPipelineLibrary);

    CHECK_FEATURE_DISABLED(RGBA10X6_FORMATS_FEATURES_EXT,
                           RGBA10X6FormatsFeaturesEXT,
                           formatRgba10x6WithoutYCbCrSampler);

    //CHECK_FEATURE_ENABLED(SYNCHRONIZATION_2_FEATURES, Synchronization2Features, synchronization2);

    //CHECK_FEATURE_ENABLED(DYNAMIC_RENDERING_FEATURES, DynamicRenderingFeatures, dynamicRendering);

    //CHECK_FEATURE_ENABLED(DYNAMIC_RENDERING_LOCAL_READ_FEATURES,
    //                      DynamicRenderingLocalReadFeatures,
    //                      dynamicRenderingLocalRead);

    //CHECK_FEATURE_ENABLED(MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT,
    //                      MultisampledRenderToSingleSampledFeaturesEXT,
    //                      multisampledRenderToSingleSampled);

    CHECK_FEATURE_DISABLED(HOST_IMAGE_COPY_FEATURES, HostImageCopyFeatures, hostImageCopy);

    // Features enabled by the app must remain enabled
    CHECK_FEATURE_ENABLED(
            SUBGROUP_SIZE_CONTROL_FEATURES, SubgroupSizeControlFeatures, subgroupSizeControl);
    CHECK_FEATURE_ENABLED(SHADER_OBJECT_FEATURES_EXT, ShaderObjectFeaturesEXT, shaderObject);
    CHECK_FEATURE_ENABLED(PIPELINE_CREATION_CACHE_CONTROL_FEATURES,
                          PipelineCreationCacheControlFeatures,
                          pipelineCreationCacheControl);
}

// A test where the application adds some features and extensions and lets Skia add to them. At the
// same time, support for some extensions is disabled. Uses Vulkan 1.3 as the API version.
DEF_TEST(VkPreferredFeaturesTest_CustomVulkan13, reporter) {
    VulkanExts config;
    config.fDrawIndirectCountKHR = false;
    config.fSamplerYcbcrConversionKHR = false;
    config.fGraphicsPipelineLibraryEXT = false;
    config.fRGBA10x6FormatsEXT = false;
    config.fHostImageCopyEXT = false;
    config.fVertexInputDynamicStateEXT = false;

    const std::vector<VkExtensionProperties> exts = get_device_exts(config);

    skgpu::VulkanPreferredFeatures preferred;
    preferred.init(VK_API_VERSION_1_3);

    {
        std::vector<const char*> instanceExts;
        preferred.addToInstanceExtensions(nullptr, 0, instanceExts);
    }

    VkPhysicalDeviceFeatures2 features = {};
    features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;

    CHAIN(VULKAN_1_1_FEATURES, Vulkan11Features, multiview);
    CHAIN(VULKAN_1_2_FEATURES, Vulkan12Features, vulkanMemoryModel);
    appVulkan12Features.bufferDeviceAddress = VK_TRUE;
    appVulkan12Features.shaderFloat16 = VK_TRUE;
    appVulkan12Features.scalarBlockLayout = VK_TRUE;
    CHAIN(VULKAN_1_3_FEATURES, Vulkan13Features, shaderZeroInitializeWorkgroupMemory);
    CHAIN(DYNAMIC_RENDERING_FEATURES, DynamicRenderingFeatures, dynamicRendering);
    CHAIN(DYNAMIC_RENDERING_LOCAL_READ_FEATURES,
          DynamicRenderingLocalReadFeatures,
          dynamicRenderingLocalRead);
    CHAIN(SYNCHRONIZATION_2_FEATURES, Synchronization2Features, synchronization2);
    CHAIN(SHADER_INTEGER_DOT_PRODUCT_FEATURES,
          ShaderIntegerDotProductFeatures,
          shaderIntegerDotProduct);
    CHAIN(SHADER_OBJECT_FEATURES_EXT, ShaderObjectFeaturesEXT, shaderObject);
    CHAIN(PIPELINE_CREATION_CACHE_CONTROL_FEATURES,
          PipelineCreationCacheControlFeatures,
          pipelineCreationCacheControl);

    // Ask Skia to add its features to query
    preferred.addFeaturesToQuery(exts.data(), exts.size(), features);
    // Populate the requested features
    enable_device_features(config, features.pNext);

    std::vector<const char*> enabledExts;
    ADDEXT(VK_EXT_SHADER_OBJECT);
    ADDEXT(VK_KHR_PIPELINE_LIBRARY);
    ADDEXT(VK_KHR_PUSH_DESCRIPTOR);
    ADDEXT(VK_KHR_DRIVER_PROPERTIES);
    ADDEXT(VK_KHR_SHADER_DRAW_PARAMETERS);
    ADDEXT(VK_EXT_DESCRIPTOR_INDEXING);
    ADDEXT(VK_KHR_DYNAMIC_RENDERING);

    // Ask Skia to enable available features
    preferred.addFeaturesToEnable(enabledExts, features);

    CHECK_CHAINED(VULKAN_1_1_FEATURES);
    CHECK_CHAINED(VULKAN_1_2_FEATURES);
    CHECK_CHAINED(VULKAN_1_3_FEATURES);
    CHECK_NOT_CHAINED(VULKAN_1_4_FEATURES);

    CHECK_NOT_CHAINED(SAMPLER_YCBCR_CONVERSION_FEATURES);
    CHECK_NOT_CHAINED(EXTENDED_DYNAMIC_STATE_FEATURES_EXT);
    CHECK_NOT_CHAINED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT);
    CHECK_NOT_CHAINED(DYNAMIC_RENDERING_FEATURES);
    CHECK_NOT_CHAINED(SYNCHRONIZATION_2_FEATURES);
    CHECK_NOT_CHAINED(SHADER_INTEGER_DOT_PRODUCT_FEATURES);
    CHECK_NOT_CHAINED(PIPELINE_CREATION_CACHE_CONTROL_FEATURES);

    CHECK_EXT_DISABLED(VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
    CHECK_EXT_ENABLED(VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
    CHECK_EXT_ENABLED(VK_EXT_BLEND_OPERATION_ADVANCED);
    CHECK_EXT_DISABLED(VK_EXT_EXTENDED_DYNAMIC_STATE);
    CHECK_EXT_DISABLED(VK_EXT_EXTENDED_DYNAMIC_STATE_2);
    CHECK_EXT_DISABLED(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE);
    CHECK_EXT_DISABLED(VK_EXT_GRAPHICS_PIPELINE_LIBRARY);
    CHECK_EXT_DISABLED(VK_KHR_SAMPLER_YCBCR_CONVERSION);
    CHECK_EXT_DISABLED(VK_EXT_RGBA10X6_FORMATS);
    CHECK_EXT_DISABLED(VK_KHR_SYNCHRONIZATION_2);
    //CHECK_EXT_ENABLED(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ);
    //CHECK_EXT_ENABLED(VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED);
    CHECK_EXT_DISABLED(VK_EXT_HOST_IMAGE_COPY);
    CHECK_EXT_DISABLED(VK_EXT_PIPELINE_CREATION_CACHE_CONTROL);
    CHECK_EXT_DISABLED(VK_KHR_CREATE_RENDERPASS_2);
    CHECK_EXT_DISABLED(VK_EXT_LOAD_STORE_OP_NONE);
    CHECK_EXT_ENABLED(VK_KHR_LOAD_STORE_OP_NONE);
    CHECK_EXT_ENABLED(VK_EXT_CONSERVATIVE_RASTERIZATION);
    //CHECK_EXT_ENABLED(VK_KHR_PIPELINE_LIBRARY);
    CHECK_EXT_DISABLED(VK_KHR_COPY_COMMANDS_2);
    CHECK_EXT_DISABLED(VK_KHR_FORMAT_FEATURE_FLAGS_2);
    CHECK_EXT_DISABLED(VK_KHR_DEPTH_STENCIL_RESOLVE);
    CHECK_EXT_DISABLED(VK_KHR_DRAW_INDIRECT_COUNT);
    CHECK_EXT_DISABLED(VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE);
    CHECK_EXT_DISABLED(VK_EXT_SAMPLER_FILTER_MINMAX);
    CHECK_EXT_DISABLED(VK_EXT_SHADER_VIEWPORT_INDEX_LAYER);
    // Extensions enabled by the app must remain enabled
    CHECK_EXT_ENABLED(VK_EXT_SHADER_OBJECT);
    CHECK_EXT_ENABLED(VK_KHR_PUSH_DESCRIPTOR);
    CHECK_EXT_ENABLED(VK_KHR_DRIVER_PROPERTIES);
    CHECK_EXT_ENABLED(VK_KHR_SHADER_DRAW_PARAMETERS);
    CHECK_EXT_ENABLED(VK_EXT_DESCRIPTOR_INDEXING);
    CHECK_EXT_ENABLED(VK_KHR_DYNAMIC_RENDERING);

    CHECK_FEATURE_ENABLED(VULKAN_1_1_FEATURES, Vulkan11Features, multiview);
    CHECK_FEATURE_DISABLED(VULKAN_1_1_FEATURES, Vulkan11Features, samplerYcbcrConversion);
    CHECK_FEATURE_ENABLED(VULKAN_1_1_FEATURES, Vulkan11Features, shaderDrawParameters);

    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerMirrorClampToEdge);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, drawIndirectCount);
    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, descriptorIndexing);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, shaderInputAttachmentArrayDynamicIndexing);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, shaderUniformTexelBufferArrayDynamicIndexing);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, shaderStorageTexelBufferArrayDynamicIndexing);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, shaderUniformBufferArrayNonUniformIndexing);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, shaderSampledImageArrayNonUniformIndexing);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, shaderStorageBufferArrayNonUniformIndexing);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, shaderStorageImageArrayNonUniformIndexing);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, shaderInputAttachmentArrayNonUniformIndexing);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, shaderUniformTexelBufferArrayNonUniformIndexing);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, shaderStorageTexelBufferArrayNonUniformIndexing);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingUniformBufferUpdateAfterBind);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingSampledImageUpdateAfterBind);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingStorageImageUpdateAfterBind);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingStorageBufferUpdateAfterBind);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES,
                           Vulkan12Features,
                           descriptorBindingUniformTexelBufferUpdateAfterBind);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES,
                           Vulkan12Features,
                           descriptorBindingStorageTexelBufferUpdateAfterBind);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingUpdateUnusedWhilePending);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingPartiallyBound);
    CHECK_FEATURE_DISABLED(
            VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingVariableDescriptorCount);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, runtimeDescriptorArray);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderBufferInt64Atomics);
    CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderSharedInt64Atomics);
    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerFilterMinmax);
    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputViewportIndex);
    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputLayer);
    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, vulkanMemoryModel);
    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, bufferDeviceAddress);
    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderFloat16);
    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, scalarBlockLayout);

    CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, dynamicRendering);
    CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, synchronization2);
    CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, pipelineCreationCacheControl);
    CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, shaderIntegerDotProduct);
    CHECK_FEATURE_ENABLED(
            VULKAN_1_3_FEATURES, Vulkan13Features, shaderZeroInitializeWorkgroupMemory);

    CHECK_FEATURE_ENABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                          RasterizationOrderAttachmentAccessFeaturesEXT,
                          rasterizationOrderColorAttachmentAccess);
    CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                           RasterizationOrderAttachmentAccessFeaturesEXT,
                           rasterizationOrderDepthAttachmentAccess);
    CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                           RasterizationOrderAttachmentAccessFeaturesEXT,
                           rasterizationOrderStencilAttachmentAccess);

    CHECK_FEATURE_ENABLED(BLEND_OPERATION_ADVANCED_FEATURES_EXT,
                          BlendOperationAdvancedFeaturesEXT,
                          advancedBlendCoherentOperations);

    CHECK_FEATURE_DISABLED(VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT,
                           VertexInputDynamicStateFeaturesEXT,
                           vertexInputDynamicState);

    CHECK_FEATURE_DISABLED(GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT,
                           GraphicsPipelineLibraryFeaturesEXT,
                           graphicsPipelineLibrary);

    CHECK_FEATURE_DISABLED(RGBA10X6_FORMATS_FEATURES_EXT,
                           RGBA10X6FormatsFeaturesEXT,
                           formatRgba10x6WithoutYCbCrSampler);

    //CHECK_FEATURE_ENABLED(DYNAMIC_RENDERING_LOCAL_READ_FEATURES,
    //                      DynamicRenderingLocalReadFeatures,
    //                      dynamicRenderingLocalRead);

    //CHECK_FEATURE_ENABLED(MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT,
    //                      MultisampledRenderToSingleSampledFeaturesEXT,
    //                      multisampledRenderToSingleSampled);

    CHECK_FEATURE_DISABLED(HOST_IMAGE_COPY_FEATURES, HostImageCopyFeatures, hostImageCopy);

    // Features enabled by the app must remain enabled
    CHECK_FEATURE_ENABLED(SHADER_OBJECT_FEATURES_EXT, ShaderObjectFeaturesEXT, shaderObject);
}

// A test where the application adds some features and extensions and lets Skia add to them. At the
// same time, support for some extensions is disabled. Uses Vulkan 1.4 as the API version.
DEF_TEST(VkPreferredFeaturesTest_CustomVulkan14, reporter) {
    VulkanExts config;
    config.fConservativeRasterizationEXT = false;
    config.fRasterizationOrderAttachmentAccessEXT = false;
    config.fGraphicsPipelineLibraryEXT = false;
    config.fPipelineLibraryKHR = false;
    config.fBlendOperationAdvancedEXT = false;

    const std::vector<VkExtensionProperties> exts = get_device_exts(config);

    skgpu::VulkanPreferredFeatures preferred;
    preferred.init(VK_API_VERSION_1_4);

    {
        std::vector<const char*> instanceExts;
        preferred.addToInstanceExtensions(nullptr, 0, instanceExts);
    }

    VkPhysicalDeviceFeatures2 features = {};
    features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;

    CHAIN(VULKAN_1_2_FEATURES, Vulkan12Features, subgroupBroadcastDynamicId);
    appVulkan12Features.uniformAndStorageBuffer8BitAccess = VK_TRUE;
    CHAIN(VULKAN_1_4_FEATURES, Vulkan14Features, stippledRectangularLines);
    CHAIN(DYNAMIC_RENDERING_LOCAL_READ_FEATURES,
          DynamicRenderingLocalReadFeatures,
          dynamicRenderingLocalRead);
    CHAIN(SHADER_OBJECT_FEATURES_EXT, ShaderObjectFeaturesEXT, shaderObject);
    CHAIN(MAINTENANCE_5_FEATURES, Maintenance5Features, maintenance5);
    CHAIN(MAINTENANCE_6_FEATURES, Maintenance6Features, maintenance6);

    // Ask Skia to add its features to query
    preferred.addFeaturesToQuery(exts.data(), exts.size(), features);
    // Populate the requested features
    enable_device_features(config, features.pNext);

    std::vector<const char*> enabledExts;
    ADDEXT(VK_KHR_MAINTENANCE_5);
    ADDEXT(VK_KHR_PUSH_DESCRIPTOR);
    ADDEXT(VK_EXT_SHADER_OBJECT);
    ADDEXT(VK_EXT_DESCRIPTOR_INDEXING);
    ADDEXT(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ);

    // Ask Skia to enable available features
    preferred.addFeaturesToEnable(enabledExts, features);

    CHECK_CHAINED(VULKAN_1_1_FEATURES);
    CHECK_CHAINED(VULKAN_1_2_FEATURES);
    CHECK_CHAINED(VULKAN_1_3_FEATURES);
    CHECK_CHAINED(VULKAN_1_4_FEATURES);

    CHECK_NOT_CHAINED(SAMPLER_YCBCR_CONVERSION_FEATURES);
    CHECK_NOT_CHAINED(EXTENDED_DYNAMIC_STATE_FEATURES_EXT);
    CHECK_NOT_CHAINED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT);
    CHECK_NOT_CHAINED(DYNAMIC_RENDERING_FEATURES);
    CHECK_NOT_CHAINED(DYNAMIC_RENDERING_LOCAL_READ_FEATURES);
    CHECK_NOT_CHAINED(SYNCHRONIZATION_2_FEATURES);
    CHECK_NOT_CHAINED(PIPELINE_CREATION_CACHE_CONTROL_FEATURES);
    CHECK_NOT_CHAINED(HOST_IMAGE_COPY_FEATURES);

    CHECK_EXT_ENABLED(VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
    CHECK_EXT_DISABLED(VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
    CHECK_EXT_DISABLED(VK_EXT_BLEND_OPERATION_ADVANCED);
    CHECK_EXT_DISABLED(VK_EXT_EXTENDED_DYNAMIC_STATE);
    CHECK_EXT_DISABLED(VK_EXT_EXTENDED_DYNAMIC_STATE_2);
    //CHECK_EXT_ENABLED(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE);
    CHECK_EXT_DISABLED(VK_EXT_GRAPHICS_PIPELINE_LIBRARY);
    CHECK_EXT_DISABLED(VK_KHR_SAMPLER_YCBCR_CONVERSION);
    CHECK_EXT_ENABLED(VK_EXT_RGBA10X6_FORMATS);
    CHECK_EXT_DISABLED(VK_KHR_SYNCHRONIZATION_2);
    CHECK_EXT_DISABLED(VK_KHR_DYNAMIC_RENDERING);
    //CHECK_EXT_ENABLED(VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED);
    CHECK_EXT_DISABLED(VK_EXT_HOST_IMAGE_COPY);
    CHECK_EXT_DISABLED(VK_EXT_PIPELINE_CREATION_CACHE_CONTROL);
    CHECK_EXT_DISABLED(VK_KHR_DRIVER_PROPERTIES);
    CHECK_EXT_DISABLED(VK_KHR_CREATE_RENDERPASS_2);
    CHECK_EXT_DISABLED(VK_EXT_LOAD_STORE_OP_NONE);
    CHECK_EXT_DISABLED(VK_KHR_LOAD_STORE_OP_NONE);
    CHECK_EXT_DISABLED(VK_EXT_CONSERVATIVE_RASTERIZATION);
    CHECK_EXT_DISABLED(VK_KHR_PIPELINE_LIBRARY);
    CHECK_EXT_DISABLED(VK_KHR_COPY_COMMANDS_2);
    CHECK_EXT_DISABLED(VK_KHR_FORMAT_FEATURE_FLAGS_2);
    CHECK_EXT_DISABLED(VK_KHR_DEPTH_STENCIL_RESOLVE);
    CHECK_EXT_DISABLED(VK_KHR_SHADER_DRAW_PARAMETERS);
    CHECK_EXT_DISABLED(VK_KHR_DRAW_INDIRECT_COUNT);
    CHECK_EXT_DISABLED(VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE);
    CHECK_EXT_DISABLED(VK_EXT_SAMPLER_FILTER_MINMAX);
    CHECK_EXT_DISABLED(VK_EXT_SHADER_VIEWPORT_INDEX_LAYER);
    // Extensions enabled by the app must remain enabled
    CHECK_EXT_ENABLED(VK_KHR_MAINTENANCE_5);
    CHECK_EXT_ENABLED(VK_KHR_PUSH_DESCRIPTOR);
    CHECK_EXT_ENABLED(VK_EXT_SHADER_OBJECT);
    CHECK_EXT_ENABLED(VK_EXT_DESCRIPTOR_INDEXING);
    CHECK_EXT_ENABLED(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ);

    CHECK_FEATURE_ENABLED(VULKAN_1_1_FEATURES, Vulkan11Features, samplerYcbcrConversion);
    CHECK_FEATURE_DISABLED(VULKAN_1_1_FEATURES, Vulkan11Features, shaderDrawParameters);

    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerMirrorClampToEdge);
    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, drawIndirectCount);
    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, descriptorIndexing);
    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerFilterMinmax);
    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputViewportIndex);
    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputLayer);
    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, subgroupBroadcastDynamicId);
    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, uniformAndStorageBuffer8BitAccess);

    CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, dynamicRendering);
    CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, synchronization2);
    CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, pipelineCreationCacheControl);

    CHECK_FEATURE_ENABLED(VULKAN_1_4_FEATURES, Vulkan14Features, maintenance5);
    CHECK_FEATURE_ENABLED(VULKAN_1_4_FEATURES, Vulkan14Features, maintenance6);
    CHECK_FEATURE_ENABLED(VULKAN_1_4_FEATURES, Vulkan14Features, dynamicRenderingLocalRead);
    CHECK_FEATURE_ENABLED(VULKAN_1_4_FEATURES, Vulkan14Features, hostImageCopy);
    CHECK_FEATURE_ENABLED(VULKAN_1_4_FEATURES, Vulkan14Features, pushDescriptor);

    CHECK_FEATURE_ENABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                          RasterizationOrderAttachmentAccessFeaturesEXT,
                          rasterizationOrderColorAttachmentAccess);
    CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                           RasterizationOrderAttachmentAccessFeaturesEXT,
                           rasterizationOrderDepthAttachmentAccess);
    CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                           RasterizationOrderAttachmentAccessFeaturesEXT,
                           rasterizationOrderStencilAttachmentAccess);

    CHECK_FEATURE_DISABLED(BLEND_OPERATION_ADVANCED_FEATURES_EXT,
                           BlendOperationAdvancedFeaturesEXT,
                           advancedBlendCoherentOperations);

    //CHECK_FEATURE_ENABLED(VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT,
    //                      VertexInputDynamicStateFeaturesEXT,
    //                      vertexInputDynamicState);

    CHECK_FEATURE_DISABLED(GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT,
                           GraphicsPipelineLibraryFeaturesEXT,
                           graphicsPipelineLibrary);

    CHECK_FEATURE_ENABLED(RGBA10X6_FORMATS_FEATURES_EXT,
                          RGBA10X6FormatsFeaturesEXT,
                          formatRgba10x6WithoutYCbCrSampler);

    //CHECK_FEATURE_ENABLED(MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT,
    //                      MultisampledRenderToSingleSampledFeaturesEXT,
    //                      multisampledRenderToSingleSampled);

    // Features enabled by the app must remain enabled
    CHECK_FEATURE_ENABLED(SHADER_OBJECT_FEATURES_EXT, ShaderObjectFeaturesEXT, shaderObject);
}

// A similar test to VkPreferredFeaturesTest_CustomVulkan*, except the chain passed to
// addFeaturesToEnable does not include all the structs passed to addFeaturesToQuery.
// addFeaturesToEnable should automatically add back the structs that addFeaturesToQuery had decided
// to chain.
DEF_TEST(VkPreferredFeaturesTest_EmptyEnableChain, reporter) {
    VulkanExts config;
    config.fGraphicsPipelineLibraryEXT = false;
    config.fPipelineLibraryKHR = false;
    config.fBlendOperationAdvancedEXT = false;

    const std::vector<VkExtensionProperties> exts = get_device_exts(config);

    skgpu::VulkanPreferredFeatures preferred;
    preferred.init(VK_API_VERSION_1_3);

    {
        std::vector<const char*> instanceExts;
        preferred.addToInstanceExtensions(nullptr, 0, instanceExts);
    }

    VkPhysicalDeviceFeatures2 features = {};
    features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;

    CHAIN(VULKAN_1_2_FEATURES, Vulkan12Features, subgroupBroadcastDynamicId);
    CHAIN(DYNAMIC_RENDERING_FEATURES, DynamicRenderingFeatures, dynamicRendering);
    CHAIN(SHADER_OBJECT_FEATURES_EXT, ShaderObjectFeaturesEXT, shaderObject);
    CHAIN(MAINTENANCE_5_FEATURES, Maintenance5Features, maintenance5);

    // Ask Skia to add its features to query
    preferred.addFeaturesToQuery(exts.data(), exts.size(), features);
    // Populate the requested features
    enable_device_features(config, features.pNext);

    std::vector<const char*> enabledExts;
    ADDEXT(VK_KHR_MAINTENANCE_5);
    ADDEXT(VK_KHR_PUSH_DESCRIPTOR);
    ADDEXT(VK_EXT_SHADER_OBJECT);

    // Start a new chain of features, only the ones the app has enabled.
    features.pNext = &appVulkan12Features;
    appVulkan12Features.pNext = &appDynamicRenderingFeatures;
    appDynamicRenderingFeatures.pNext = &appShaderObjectFeaturesEXT;
    appShaderObjectFeaturesEXT.pNext = &appMaintenance5Features;
    appMaintenance5Features.pNext = nullptr;

    // Ask Skia to enable available features
    preferred.addFeaturesToEnable(enabledExts, features);

    CHECK_CHAINED(VULKAN_1_1_FEATURES);
    CHECK_CHAINED(VULKAN_1_2_FEATURES);
    CHECK_CHAINED(VULKAN_1_3_FEATURES);
    CHECK_NOT_CHAINED(VULKAN_1_4_FEATURES);

    CHECK_NOT_CHAINED(SAMPLER_YCBCR_CONVERSION_FEATURES);
    CHECK_NOT_CHAINED(EXTENDED_DYNAMIC_STATE_FEATURES_EXT);
    CHECK_NOT_CHAINED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT);
    CHECK_NOT_CHAINED(DYNAMIC_RENDERING_FEATURES);
    CHECK_NOT_CHAINED(SYNCHRONIZATION_2_FEATURES);
    CHECK_NOT_CHAINED(PIPELINE_CREATION_CACHE_CONTROL_FEATURES);

    CHECK_EXT_DISABLED(VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
    CHECK_EXT_ENABLED(VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
    CHECK_EXT_DISABLED(VK_EXT_BLEND_OPERATION_ADVANCED);
    CHECK_EXT_DISABLED(VK_EXT_EXTENDED_DYNAMIC_STATE);
    CHECK_EXT_DISABLED(VK_EXT_EXTENDED_DYNAMIC_STATE_2);
    //CHECK_EXT_ENABLED(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE);
    CHECK_EXT_DISABLED(VK_EXT_GRAPHICS_PIPELINE_LIBRARY);
    CHECK_EXT_DISABLED(VK_KHR_SAMPLER_YCBCR_CONVERSION);
    CHECK_EXT_ENABLED(VK_EXT_RGBA10X6_FORMATS);
    CHECK_EXT_DISABLED(VK_KHR_SYNCHRONIZATION_2);
    CHECK_EXT_DISABLED(VK_KHR_DYNAMIC_RENDERING);
    //CHECK_EXT_ENABLED(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ);
    //CHECK_EXT_ENABLED(VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED);
    //CHECK_EXT_ENABLED(VK_EXT_HOST_IMAGE_COPY);
    CHECK_EXT_DISABLED(VK_EXT_PIPELINE_CREATION_CACHE_CONTROL);
    CHECK_EXT_DISABLED(VK_KHR_DRIVER_PROPERTIES);
    CHECK_EXT_DISABLED(VK_KHR_CREATE_RENDERPASS_2);
    CHECK_EXT_DISABLED(VK_EXT_LOAD_STORE_OP_NONE);
    CHECK_EXT_ENABLED(VK_KHR_LOAD_STORE_OP_NONE);
    CHECK_EXT_ENABLED(VK_EXT_CONSERVATIVE_RASTERIZATION);
    CHECK_EXT_DISABLED(VK_KHR_PIPELINE_LIBRARY);
    CHECK_EXT_DISABLED(VK_KHR_COPY_COMMANDS_2);
    CHECK_EXT_DISABLED(VK_KHR_FORMAT_FEATURE_FLAGS_2);
    CHECK_EXT_DISABLED(VK_KHR_DEPTH_STENCIL_RESOLVE);
    CHECK_EXT_DISABLED(VK_KHR_SHADER_DRAW_PARAMETERS);
    CHECK_EXT_DISABLED(VK_KHR_DRAW_INDIRECT_COUNT);
    CHECK_EXT_DISABLED(VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE);
    CHECK_EXT_DISABLED(VK_EXT_DESCRIPTOR_INDEXING);
    CHECK_EXT_DISABLED(VK_EXT_SAMPLER_FILTER_MINMAX);
    CHECK_EXT_DISABLED(VK_EXT_SHADER_VIEWPORT_INDEX_LAYER);
    // Extensions enabled by the app must remain enabled
    CHECK_EXT_ENABLED(VK_KHR_MAINTENANCE_5);
    CHECK_EXT_ENABLED(VK_KHR_PUSH_DESCRIPTOR);
    CHECK_EXT_ENABLED(VK_EXT_SHADER_OBJECT);

    CHECK_FEATURE_ENABLED(VULKAN_1_1_FEATURES, Vulkan11Features, samplerYcbcrConversion);
    CHECK_FEATURE_DISABLED(VULKAN_1_1_FEATURES, Vulkan11Features, shaderDrawParameters);

    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerMirrorClampToEdge);
    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, drawIndirectCount);
    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, descriptorIndexing);
    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerFilterMinmax);
    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputViewportIndex);
    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputLayer);
    CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, subgroupBroadcastDynamicId);

    CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, dynamicRendering);
    CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, synchronization2);
    CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, pipelineCreationCacheControl);

    CHECK_FEATURE_ENABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                          RasterizationOrderAttachmentAccessFeaturesEXT,
                          rasterizationOrderColorAttachmentAccess);
    CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                           RasterizationOrderAttachmentAccessFeaturesEXT,
                           rasterizationOrderDepthAttachmentAccess);
    CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
                           RasterizationOrderAttachmentAccessFeaturesEXT,
                           rasterizationOrderStencilAttachmentAccess);

    CHECK_FEATURE_DISABLED(BLEND_OPERATION_ADVANCED_FEATURES_EXT,
                           BlendOperationAdvancedFeaturesEXT,
                           advancedBlendCoherentOperations);

    //CHECK_FEATURE_ENABLED(VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT,
    //                      VertexInputDynamicStateFeaturesEXT,
    //                      vertexInputDynamicState);

    CHECK_FEATURE_DISABLED(GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT,
                           GraphicsPipelineLibraryFeaturesEXT,
                           graphicsPipelineLibrary);

    CHECK_FEATURE_ENABLED(RGBA10X6_FORMATS_FEATURES_EXT,
                          RGBA10X6FormatsFeaturesEXT,
                          formatRgba10x6WithoutYCbCrSampler);

    //CHECK_FEATURE_ENABLED(DYNAMIC_RENDERING_LOCAL_READ_FEATURES,
    //                      DynamicRenderingLocalReadFeatures,
    //                      dynamicRenderingLocalRead);

    //CHECK_FEATURE_ENABLED(MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT,
    //                      MultisampledRenderToSingleSampledFeaturesEXT,
    //                      multisampledRenderToSingleSampled);

    // Features enabled by the app must remain enabled
    CHECK_FEATURE_ENABLED(SHADER_OBJECT_FEATURES_EXT, ShaderObjectFeaturesEXT, shaderObject);
    CHECK_FEATURE_ENABLED(MAINTENANCE_5_FEATURES, Maintenance5Features, maintenance5);
}

#endif
