/*
 * Copyright 2025 Google LLC
 *
 * 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;
#if defined(SK_BUILD_FOR_ANDROID)
    bool fExternalMemoryAHardwareBufferEXT = true;
#endif
    bool fPipelineLibraryKHR = true;
    bool fCopyCommands2KHR = true;
    bool fFormatFeatureFlags2KHR = true;
    bool fDepthStencilResolveKHR = true;
#if defined(SK_BUILD_FOR_ANDROID)
    bool fQueueFamilyForeignEXT = true;
#endif
    bool fShaderDrawParametersKHR = true;
    bool fDrawIndirectCountKHR = true;
    bool fSamplerMirrorClampToEdgeKHR = true;
    bool fDescriptorIndexingEXT = true;
    bool fSamplerFilterMinmaxEXT = true;
    bool fShaderViewportIndexLayerEXT = true;
    bool fPushDescriptorKHR = true;
    bool fFrameBoundaryEXT = 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(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);
#if defined(SK_BUILD_FOR_ANDROID)
    ADD_EXT(fExternalMemoryAHardwareBufferEXT, VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER);
#endif
    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);
#if defined(SK_BUILD_FOR_ANDROID)
    ADD_EXT(fQueueFamilyForeignEXT, VK_EXT_QUEUE_FAMILY_FOREIGN);
#endif
    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);
    ADD_EXT(fFrameBoundaryEXT, VK_EXT_FRAME_BOUNDARY);
#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))

            SET_FEATURES(FRAME_BOUNDARY_FEATURES_EXT,
                         FrameBoundaryFeaturesEXT,
                         SET_IF(fFrameBoundaryEXT, frameBoundary))

            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_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);
#if defined(SK_BUILD_FOR_ANDROID)
    CHECK_EXT_ENABLED(VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER);
#endif
    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);
#if defined(SK_BUILD_FOR_ANDROID)
    CHECK_EXT_ENABLED(VK_EXT_QUEUE_FAMILY_FOREIGN);
#endif
    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_EXT_ENABLED(VK_EXT_FRAME_BOUNDARY);

    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);

    CHECK_FEATURE_ENABLED(FRAME_BOUNDARY_FEATURES_EXT,
                          FrameBoundaryFeaturesEXT,
                          frameBoundary);
}

// 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_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_EXT_ENABLED(VK_EXT_FRAME_BOUNDARY);

    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);

    CHECK_FEATURE_ENABLED(FRAME_BOUNDARY_FEATURES_EXT,
                          FrameBoundaryFeaturesEXT,
                          frameBoundary);
}

// 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_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_EXT_ENABLED(VK_EXT_FRAME_BOUNDARY);

    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);

    CHECK_FEATURE_ENABLED(FRAME_BOUNDARY_FEATURES_EXT,
                          FrameBoundaryFeaturesEXT,
                          frameBoundary);
}

// 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_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_EXT_ENABLED(VK_EXT_FRAME_BOUNDARY);

    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);

    CHECK_FEATURE_ENABLED(FRAME_BOUNDARY_FEATURES_EXT,
                          FrameBoundaryFeaturesEXT,
                          frameBoundary);
}

#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;
    config.fFrameBoundaryEXT = 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_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_EXT_DISABLED(VK_EXT_FRAME_BOUNDARY);

    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);

    CHECK_FEATURE_DISABLED(FRAME_BOUNDARY_FEATURES_EXT,
                          FrameBoundaryFeaturesEXT,
                          frameBoundary);
}

// 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;
    config.fFrameBoundaryEXT = 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_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_EXT_DISABLED(VK_EXT_FRAME_BOUNDARY);

    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);

    CHECK_FEATURE_DISABLED(FRAME_BOUNDARY_FEATURES_EXT,
                          FrameBoundaryFeaturesEXT,
                          frameBoundary);
}

// 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_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_EXT_ENABLED(VK_EXT_FRAME_BOUNDARY);

    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);

    CHECK_FEATURE_ENABLED(FRAME_BOUNDARY_FEATURES_EXT,
                          FrameBoundaryFeaturesEXT,
                          frameBoundary);
}

// 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_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_EXT_ENABLED(VK_EXT_FRAME_BOUNDARY);

    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);


    CHECK_FEATURE_ENABLED(FRAME_BOUNDARY_FEATURES_EXT,
                          FrameBoundaryFeaturesEXT,
                          frameBoundary);
}

// 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;
    config.fFrameBoundaryEXT = 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_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_EXT_DISABLED(VK_EXT_FRAME_BOUNDARY);

    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);

    CHECK_FEATURE_DISABLED(FRAME_BOUNDARY_FEATURES_EXT,
                           FrameBoundaryFeaturesEXT,
                           frameBoundary);
}

#endif
