Source code
Revision control
Copy as Markdown
Other Tools
// GENERATED FILE - DO NOT EDIT.
// Generated by gen_features.py using data from vk_features.json.
//
// Copyright 2022 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// FeaturesVk_autogen.h: Optional features for the Vulkan renderer.
#ifndef ANGLE_PLATFORM_FEATURESVK_H_
#define ANGLE_PLATFORM_FEATURESVK_H_
#include "platform/Feature.h"
namespace angle
{
struct FeaturesVk : FeatureSetBase
{
    FeaturesVk();
    ~FeaturesVk();
    FeatureInfo bresenhamLineRasterization = {
        "bresenhamLineRasterization",
        FeatureCategory::VulkanFeatures,
        "Enable Bresenham line rasterization via VK_EXT_line_rasterization extension",
        &members,
    };
    FeatureInfo provokingVertex = {
        "provokingVertex",
        FeatureCategory::VulkanFeatures,
        "Enable provoking vertex mode via VK_EXT_provoking_vertex extension",
        &members,
    };
    FeatureInfo forceFallbackFormat = {
        "forceFallbackFormat",
        FeatureCategory::VulkanWorkarounds,
        "Force a fallback format for angle_end2end_tests",
        &members,
    };
    FeatureInfo clampPointSize = {
        "clampPointSize", FeatureCategory::VulkanWorkarounds,
        "The point size range reported from the API is inconsistent with the actual behavior",
    FeatureInfo depthClamping = {
        "depthClamping", FeatureCategory::VulkanWorkarounds,
        "The depth value is not clamped to [0,1] for floating point depth buffers.", &members,
    FeatureInfo mutableMipmapTextureUpload = {
        "mutableMipmapTextureUpload", FeatureCategory::VulkanFeatures,
        "Enable uploading the previously defined mutable mipmap texture.", &members,
    FeatureInfo supportsRenderpass2 = {
        "supportsRenderpass2",
        FeatureCategory::VulkanFeatures,
        "VkDevice supports the VK_KHR_create_renderpass2 extension",
        &members,
    };
    FeatureInfo supportsIncrementalPresent = {
        "supportsIncrementalPresent",
        FeatureCategory::VulkanFeatures,
        "VkDevice supports the VK_KHR_incremental_present extension",
        &members,
    };
    FeatureInfo supportsAndroidHardwareBuffer = {
        "supportsAndroidHardwareBuffer",
        FeatureCategory::VulkanFeatures,
        "VkDevice supports the VK_ANDROID_external_memory_android_hardware_buffer extension",
        &members,
    };
    FeatureInfo supportsGGPFrameToken = {
        "supportsGGPFrameToken",
        FeatureCategory::VulkanFeatures,
        "VkDevice supports the VK_GGP_frame_token extension",
        &members,
    };
    FeatureInfo supportsExternalMemoryFd = {
        "supportsExternalMemoryFd",
        FeatureCategory::VulkanFeatures,
        "VkDevice supports the VK_KHR_external_memory_fd extension",
        &members,
    };
    FeatureInfo supportsExternalMemoryFuchsia = {
        "supportsExternalMemoryFuchsia",
        FeatureCategory::VulkanFeatures,
        "VkDevice supports the VK_FUCHSIA_external_memory extension",
        &members,
    };
    FeatureInfo supportsFilteringPrecision = {
        "supportsFilteringPrecision",
        FeatureCategory::VulkanFeatures,
        "VkDevice supports the VK_GOOGLE_sampler_filtering_precision extension",
        &members,
    };
    FeatureInfo supportsExternalFenceCapabilities = {
        "supportsExternalFenceCapabilities",
        FeatureCategory::VulkanFeatures,
        "VkInstance supports the VK_KHR_external_fence_capabilities extension",
        &members,
    };
    FeatureInfo supportsExternalSemaphoreCapabilities = {
        "supportsExternalSemaphoreCapabilities",
        FeatureCategory::VulkanFeatures,
        "VkInstance supports the VK_KHR_external_semaphore_capabilities extension",
        &members,
    };
    FeatureInfo supportsExternalSemaphoreFd = {
        "supportsExternalSemaphoreFd",
        FeatureCategory::VulkanFeatures,
        "VkDevice supports the VK_KHR_external_semaphore_fd extension",
        &members,
    };
    FeatureInfo supportsExternalSemaphoreFuchsia = {
        "supportsExternalSemaphoreFuchsia",
        FeatureCategory::VulkanFeatures,
        "VkDevice supports the VK_FUCHSIA_external_semaphore extension",
        &members,
    };
    FeatureInfo supportsExternalFenceFd = {
        "supportsExternalFenceFd", FeatureCategory::VulkanFeatures,
        "VkDevice supports the VK_KHR_external_fence_fd extension", &members,
    FeatureInfo supportsAndroidNativeFenceSync = {
        "supportsAndroidNativeFenceSync", FeatureCategory::VulkanFeatures,
        "VkDevice supports the EGL_ANDROID_native_fence_sync extension", &members,
    FeatureInfo supportsImageCubeArray = {"supportsImageCubeArray", FeatureCategory::VulkanFeatures,
                                          "VkDevice supports the imageCubeArray feature properly",
    FeatureInfo supportsPipelineStatisticsQuery = {
        "supportsPipelineStatisticsQuery", FeatureCategory::VulkanFeatures,
        "VkDevice supports the pipelineStatisticsQuery feature", &members,
    FeatureInfo supportsShaderStencilExport = {
        "supportsShaderStencilExport",
        FeatureCategory::VulkanFeatures,
        "VkDevice supports the VK_EXT_shader_stencil_export extension",
        &members,
    };
    FeatureInfo supportsYUVSamplerConversion = {
        "supportsYUVSamplerConversion",
        FeatureCategory::VulkanFeatures,
        "VkDevice supports the VK_KHR_sampler_ycbcr_conversion extension",
        &members,
    };
    FeatureInfo emulateTransformFeedback = {
        "emulateTransformFeedback", FeatureCategory::VulkanFeatures,
        "Emulate transform feedback as the VK_EXT_transform_feedback is not present.", &members,
    FeatureInfo supportsTransformFeedbackExtension = {
        "supportsTransformFeedbackExtension", FeatureCategory::VulkanFeatures,
        "Transform feedback uses the VK_EXT_transform_feedback extension.", &members,
    FeatureInfo supportsGeometryStreamsCapability = {
        "supportsGeometryStreamsCapability", FeatureCategory::VulkanFeatures,
        "Implementation supports the GeometryStreams SPIR-V capability.", &members,
    FeatureInfo supportsIndexTypeUint8 = {"supportsIndexTypeUint8", FeatureCategory::VulkanFeatures,
                                          "VkDevice supports the VK_EXT_index_type_uint8 extension",
    FeatureInfo supportsCustomBorderColor = {
        "supportsCustomBorderColor", FeatureCategory::VulkanFeatures,
        "VkDevice supports the VK_EXT_custom_border_color extension", &members,
    FeatureInfo supportsMultiDrawIndirect = {
        "supportsMultiDrawIndirect", FeatureCategory::VulkanFeatures,
    FeatureInfo supportsDepthStencilResolve = {"supportsDepthStencilResolve",
                                               FeatureCategory::VulkanFeatures,
                                               "VkDevice supports the VK_KHR_depth_stencil_resolve "
                                               "extension with the independentResolveNone feature",
    FeatureInfo supportsMultisampledRenderToSingleSampledGOOGLEX = {
        "supportsMultisampledRenderToSingleSampledGOOGLEX", FeatureCategory::VulkanFeatures,
        "VkDevice supports the VK_GOOGLEX_multisampled_render_to_single_sampled extension",
    FeatureInfo supportsMultisampledRenderToSingleSampled = {
        "supportsMultisampledRenderToSingleSampled", FeatureCategory::VulkanFeatures,
        "VkDevice supports the VK_EXT_multisampled_render_to_single_sampled extension", &members,
    FeatureInfo supportsMultiview = {"supportsMultiview", FeatureCategory::VulkanFeatures,
                                     "VkDevice supports the VK_KHR_multiview extension", &members,
    FeatureInfo disableFifoPresentMode = {
        "disableFifoPresentMode", FeatureCategory::VulkanWorkarounds,
    FeatureInfo forceD16TexFilter = {
        "forceD16TexFilter", FeatureCategory::VulkanWorkarounds,
        "VK_FORMAT_D16_UNORM does not support VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT, "
        "which prevents OES_depth_texture from being supported.",
    FeatureInfo disableFlippingBlitWithCommand = {
        "disableFlippingBlitWithCommand", FeatureCategory::VulkanWorkarounds,
        "vkCmdBlitImage with flipped coordinates blits incorrectly.", &members,
    FeatureInfo perFrameWindowSizeQuery = {
        "perFrameWindowSizeQuery", FeatureCategory::VulkanWorkarounds,
        "Vulkan swapchain is not returning VK_ERROR_OUT_OF_DATE when window resizing", &members,
    FeatureInfo padBuffersToMaxVertexAttribStride = {
        "padBuffersToMaxVertexAttribStride", FeatureCategory::VulkanWorkarounds,
        "Vulkan considers vertex attribute accesses to count up to the last multiple of the "
        "stride. This additional access supports AMD's robust buffer access implementation. "
        "AMDVLK in particular will return incorrect values when the vertex access extends into "
        "the range that would be the stride padding and the buffer is too small. "
        "This workaround limits GL_MAX_VERTEX_ATTRIB_STRIDE to a maximum value and "
        "pads up every buffer allocation size to be a multiple of the maximum stride.",
    FeatureInfo supportsExternalMemoryDmaBufAndModifiers = {
        "supportsExternalMemoryDmaBufAndModifiers", FeatureCategory::VulkanFeatures,
        "VkDevice supports the VK_EXT_external_memory_dma_buf and VK_EXT_image_drm_format_modifier "
        "extensions",
    FeatureInfo supportsExternalMemoryHost = {
        "supportsExternalMemoryHost",
        FeatureCategory::VulkanFeatures,
        "VkDevice supports the VK_EXT_external_memory_host extension",
        &members,
    };
    FeatureInfo allocateNonZeroMemory = {
        "allocateNonZeroMemory", FeatureCategory::VulkanFeatures,
        "Fill new allocations with non-zero values to flush out errors.", &members,
    FeatureInfo logMemoryReportCallbacks = {
        "logMemoryReportCallbacks",
        FeatureCategory::VulkanFeatures,
        "Log each callback from VK_EXT_device_memory_report",
        &members,
    };
    FeatureInfo logMemoryReportStats = {
        "logMemoryReportStats",
        FeatureCategory::VulkanFeatures,
        "Log stats from VK_EXT_device_memory_report each swap",
        &members,
    };
    FeatureInfo shadowBuffers = {
        "shadowBuffers", FeatureCategory::VulkanFeatures,
        "Allocate a shadow buffer for GL buffer objects to reduce glMap* latency.", &members,
    FeatureInfo preferCPUForBufferSubData = {
        "preferCPUForBufferSubData", FeatureCategory::VulkanFeatures,
        "Prefer use CPU to do bufferSubData instead of staged update.", &members,
    FeatureInfo persistentlyMappedBuffers = {
        "persistentlyMappedBuffers", FeatureCategory::VulkanFeatures,
        "Persistently map buffer memory to reduce map/unmap IOCTL overhead.", &members,
    FeatureInfo enablePreRotateSurfaces = {"enablePreRotateSurfaces",
                                           FeatureCategory::VulkanFeatures,
                                           "Enable Android pre-rotation for landscape applications",
    FeatureInfo enablePrecisionQualifiers = {
        "enablePrecisionQualifiers", FeatureCategory::VulkanFeatures,
    FeatureInfo preferAggregateBarrierCalls = {
        "preferAggregateBarrierCalls", FeatureCategory::VulkanWorkarounds,
        "Single barrier call is preferred over multiple calls with "
        "fine grained pipeline stage dependency information",
    FeatureInfo preferSkippingInvalidateForEmulatedFormats = {
        "preferSkippingInvalidateForEmulatedFormats", FeatureCategory::VulkanWorkarounds,
        "Skipping invalidate is preferred for emulated formats that have extra channels over "
        "re-clearing the image",
    FeatureInfo asyncCommandQueue = {"asyncCommandQueue", FeatureCategory::VulkanFeatures,
                                     "Use CommandQueue worker thread to dispatch work to GPU.",
    FeatureInfo supportsShaderFloat16 = {
        "supportsShaderFloat16", FeatureCategory::VulkanFeatures,
        "VkDevice supports the VK_KHR_shader_float16_int8 extension "
        "and has the shaderFloat16 feature",
    FeatureInfo allowGenerateMipmapWithCompute = {
        "allowGenerateMipmapWithCompute", FeatureCategory::VulkanFeatures,
        "Use the compute path to generate mipmaps on devices that meet the minimum requirements, "
        "and the performance is better.",
    FeatureInfo supportsRenderPassStoreOpNone = {
        "supportsRenderPassStoreOpNone", FeatureCategory::VulkanFeatures,
        "VkDevice supports VK_QCOM_render_pass_store_ops extension.", &members,
    FeatureInfo supportsRenderPassLoadStoreOpNone = {
        "supportsRenderPassLoadStoreOpNone", FeatureCategory::VulkanFeatures,
        "VkDevice supports VK_EXT_load_store_op_none extension.", &members,
    FeatureInfo disallowMixedDepthStencilLoadOpNoneAndLoad = {
        "disallowMixedDepthStencilLoadOpNoneAndLoad", FeatureCategory::VulkanWorkarounds,
        "Disallow use of LOAD_OP_NONE for only one of the depth or stencil aspects of a "
        "depth/stencil attachment",
    FeatureInfo supportsDepthClipControl = {
        "supportsDepthClipControl", FeatureCategory::VulkanFeatures,
        "VkDevice supports VK_EXT_depth_clip_control extension.", &members,
    FeatureInfo supportsPrimitiveTopologyListRestart = {
        "supportsPrimitiveTopologyListRestart", FeatureCategory::VulkanFeatures,
        "VkDevice supports VK_EXT_primitive_topology_list_restart extension.", &members,
    FeatureInfo supportsBlendOperationAdvanced = {
        "supportsBlendOperationAdvanced", FeatureCategory::VulkanFeatures,
        "VkDevice supports VK_EXT_blend_operation_advanced extension.", &members,
    FeatureInfo forceMaxUniformBufferSize16KB = {
        "forceMaxUniformBufferSize16KB", FeatureCategory::VulkanWorkarounds,
        "Force max uniform buffer size to 16K on some device due to bug", &members,
    FeatureInfo supportsImageFormatList = {
        "supportsImageFormatList", FeatureCategory::VulkanFeatures,
        "Enable VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT by default for ICDs "
        "that support VK_KHR_image_format_list",
    FeatureInfo enableMultisampledRenderToTexture = {
        "enableMultisampledRenderToTexture", FeatureCategory::VulkanWorkarounds,
    FeatureInfo deferFlushUntilEndRenderPass = {
        "deferFlushUntilEndRenderPass", FeatureCategory::VulkanWorkarounds,
        "Allow glFlush to be deferred until renderpass ends", &members,
    FeatureInfo waitIdleBeforeSwapchainRecreation = {
        "waitIdleBeforeSwapchainRecreation", FeatureCategory::VulkanWorkarounds,
        "Before passing an oldSwapchain to VkSwapchainCreateInfoKHR, wait for queue to be idle. "
        "Works around a bug on platforms which destroy oldSwapchain in vkCreateSwapchainKHR.",
    FeatureInfo forceTextureLodOffset1 = {
        "forceTextureLodOffset1",
        FeatureCategory::VulkanWorkarounds,
        "Increase the minimum texture level-of-detail by 1 when sampling.",
        &members,
    };
    FeatureInfo forceTextureLodOffset2 = {
        "forceTextureLodOffset2",
        FeatureCategory::VulkanWorkarounds,
        "Increase the minimum texture level-of-detail by 2 when sampling.",
        &members,
    };
    FeatureInfo forceTextureLodOffset3 = {
        "forceTextureLodOffset3",
        FeatureCategory::VulkanWorkarounds,
        "Increase the minimum texture level-of-detail by 3 when sampling.",
        &members,
    };
    FeatureInfo forceTextureLodOffset4 = {
        "forceTextureLodOffset4",
        FeatureCategory::VulkanWorkarounds,
        "Increase the minimum texture level-of-detail by 4 when sampling.",
        &members,
    };
    FeatureInfo forceNearestFiltering = {
        "forceNearestFiltering",
        FeatureCategory::VulkanWorkarounds,
        "Force nearest filtering when sampling.",
        &members,
    };
    FeatureInfo forceNearestMipFiltering = {
        "forceNearestMipFiltering",
        FeatureCategory::VulkanWorkarounds,
        "Force nearest mip filtering when sampling.",
        &members,
    };
    FeatureInfo compressVertexData = {
        "compressVertexData",
        FeatureCategory::VulkanWorkarounds,
        "Compress vertex data to smaller data types when "
        "possible. Using this feature makes ANGLE non-conformant.",
        &members,
    };
    FeatureInfo preferDrawClearOverVkCmdClearAttachments = {
        "preferDrawClearOverVkCmdClearAttachments", FeatureCategory::VulkanWorkarounds,
        "On some hardware, clear using a draw call instead of vkCmdClearAttachments in the middle "
        "of render pass due to bugs",
    FeatureInfo emulatedPrerotation90 = {"emulatedPrerotation90", FeatureCategory::VulkanFeatures,
                                         "Emulate 90-degree prerotation.", &members,
    FeatureInfo emulatedPrerotation180 = {"emulatedPrerotation180", FeatureCategory::VulkanFeatures,
                                          "Emulate 180-degree prerotation.", &members,
    FeatureInfo emulatedPrerotation270 = {"emulatedPrerotation270", FeatureCategory::VulkanFeatures,
                                          "Emulate 270-degree prerotation.", &members,
    FeatureInfo generateSPIRVThroughGlslang = {
        "generateSPIRVThroughGlslang", FeatureCategory::VulkanFeatures,
    FeatureInfo preferDriverUniformOverSpecConst = {
        "preferDriverUniformOverSpecConst", FeatureCategory::VulkanFeatures,
        "Prefer using driver uniforms instead of specialization constants.", &members,
    FeatureInfo exposeNonConformantExtensionsAndVersions = {
        "exposeNonConformantExtensionsAndVersions", FeatureCategory::VulkanWorkarounds,
        "Expose GLES versions and extensions that are not conformant.", &members,
    FeatureInfo emulateR32fImageAtomicExchange = {
        "emulateR32fImageAtomicExchange", FeatureCategory::VulkanWorkarounds,
        "Emulate r32f images with r32ui to support imageAtomicExchange.", &members,
    FeatureInfo supportsNegativeViewport = {
        "supportsNegativeViewport",
        FeatureCategory::VulkanFeatures,
        "The driver supports inverting the viewport with a negative height.",
        &members,
    };
    FeatureInfo forceFragmentShaderPrecisionHighpToMediump = {
        "forceFragmentShaderPrecisionHighpToMediump", FeatureCategory::VulkanWorkarounds,
        "Forces highp precision in fragment shader to mediump.", &members,
    FeatureInfo preferSubmitAtFBOBoundary = {
        "preferSubmitAtFBOBoundary", FeatureCategory::VulkanWorkarounds,
        "Submit commands to driver at each FBO boundary for performance improvements.", &members,
    FeatureInfo useMultipleDescriptorsForExternalFormats = {
        "useMultipleDescriptorsForExternalFormats", FeatureCategory::VulkanWorkarounds,
        "Return a default descriptor count for external formats.", &members,
    FeatureInfo supportsProtectedMemory = {
        "supportsProtectedMemory", FeatureCategory::VulkanFeatures,
    FeatureInfo supportsHostQueryReset = {"supportsHostQueryReset", FeatureCategory::VulkanFeatures,
                                          "VkDevice supports VK_EXT_host_query_reset extension",
    FeatureInfo supportsPipelineCreationCacheControl = {
        "supportsPipelineCreationCacheControl", FeatureCategory::VulkanFeatures,
        "VkDevice supports VK_EXT_pipeline_creation_cache_control extension", &members,
    FeatureInfo supportsPipelineCreationFeedback = {
        "supportsPipelineCreationFeedback", FeatureCategory::VulkanFeatures,
        "VkDevice supports VK_EXT_pipeline_creation_feedback extension", &members,
    FeatureInfo supportsPrimitivesGeneratedQuery = {
        "supportsPrimitivesGeneratedQuery", FeatureCategory::VulkanFeatures,
        "VkDevice supports VK_EXT_primitives_generated_query extension", &members,
    FeatureInfo supportsSurfaceCapabilities2Extension = {
        "supportsSurfaceCapabilities2Extension",
        FeatureCategory::VulkanFeatures,
        "VkInstance supports the VK_KHR_get_surface_capabilities2 extension",
        &members,
    };
    FeatureInfo supportsSurfaceProtectedCapabilitiesExtension = {
        "supportsSurfaceProtectedCapabilitiesExtension",
        FeatureCategory::VulkanFeatures,
        "VkInstance supports the VK_KHR_surface_protected_capabilities extension",
        &members,
    };
    FeatureInfo supportsSurfacelessQueryExtension = {
        "supportsSurfacelessQueryExtension",
        FeatureCategory::VulkanFeatures,
        "VkInstance supports the VK_GOOGLE_surfaceless_query extension",
        &members,
    };
    FeatureInfo supportsSurfaceProtectedSwapchains = {
        "supportsSurfaceProtectedSwapchains",
        FeatureCategory::VulkanFeatures,
        "VkSurface supportsProtected for protected swapchains",
        &members,
    };
    FeatureInfo overrideSurfaceFormatRGB8ToRGBA8 = {
        "overrideSurfaceFormatRGB8ToRGBA8", FeatureCategory::VulkanWorkarounds,
    FeatureInfo supportsSharedPresentableImageExtension = {
        "supportsSharedPresentableImageExtension",
        FeatureCategory::VulkanFeatures,
        "VkSurface supports the VK_KHR_shared_presentable_images extension",
        &members,
    };
    FeatureInfo supportsShaderFramebufferFetch = {
        "supportsShaderFramebufferFetch",
        FeatureCategory::VulkanFeatures,
        "Whether the Vulkan backend supports coherent framebuffer fetch",
        &members,
    };
    FeatureInfo supportsShaderFramebufferFetchNonCoherent = {
        "supportsShaderFramebufferFetchNonCoherent",
        FeatureCategory::VulkanFeatures,
        "Whether the Vulkan backend supports non-coherent framebuffer fetch",
        &members,
    };
    FeatureInfo permanentlySwitchToFramebufferFetchMode = {
        "permanentlySwitchToFramebufferFetchMode",
        FeatureCategory::VulkanFeatures,
        "Whether the context should permanently switch to framebuffer fetch mode on first"
        "encounter",
        &members,
    };
    FeatureInfo supportsLockSurfaceExtension = {
        "supportsLockSurfaceExtension",
        FeatureCategory::VulkanFeatures,
        "Surface supports the EGL_KHR_lock_surface3 extension",
        &members,
    };
    FeatureInfo swapbuffersOnFlushOrFinishWithSingleBuffer = {
        "swapbuffersOnFlushOrFinishWithSingleBuffer", FeatureCategory::VulkanFeatures,
        "Bypass deferredFlush with calling swapbuffers on flush or finish when in Shared "
        "Present mode",
    FeatureInfo emulateDithering = {"emulateDithering", FeatureCategory::VulkanFeatures,
                                    "Emulate OpenGL dithering", &members,
    FeatureInfo roundOutputAfterDithering = {
        "roundOutputAfterDithering", FeatureCategory::VulkanWorkarounds,
        "Round output after dithering to workaround a driver bug that rounds the output up",
    FeatureInfo emulateAdvancedBlendEquations = {
        "emulateAdvancedBlendEquations", FeatureCategory::VulkanFeatures,
    FeatureInfo precisionSafeDivision = {
        "precisionSafeDivision",
        FeatureCategory::VulkanWorkarounds,
        "Special case handling for platforms that do not generate 1.0f even when the dividend and"
        "divisor have the same value",
        &members,
    };
    FeatureInfo bottomLeftOriginPresentRegionRectangles = {
        "bottomLeftOriginPresentRegionRectangles",
        FeatureCategory::VulkanWorkarounds,
        "On some platforms present region rectangles are expected to have a bottom-left origin, "
        "instead of top-left origin as from spec",
        &members,
    };
    FeatureInfo forceSubmitImmutableTextureUpdates = {
        "forceSubmitImmutableTextureUpdates", FeatureCategory::VulkanAppWorkarounds,
    FeatureInfo retainSPIRVDebugInfo = {"retainSPIRVDebugInfo", FeatureCategory::VulkanFeatures,
                                        "Retain debug info in SPIR-V blob.", &members,
    FeatureInfo warmUpPipelineCacheAtLink = {
        "warmUpPipelineCacheAtLink", FeatureCategory::VulkanFeatures,
    FeatureInfo preferDeviceLocalMemoryHostVisible = {
        "preferDeviceLocalMemoryHostVisible", FeatureCategory::VulkanFeatures,
        "Prefer adding HOST_VISIBLE flag for DEVICE_LOCAL memory when picking memory types",
    FeatureInfo forceStaticVertexStrideState = {
        "forceStaticVertexStrideState", FeatureCategory::VulkanWorkarounds,
        "Force static state for VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT due to"
        "driver bugs",
    FeatureInfo supportsExtendedDynamicState = {
        "supportsExtendedDynamicState", FeatureCategory::VulkanFeatures,
        "VkDevice supports VK_EXT_extended_dynamic_state extension", &members,
    FeatureInfo supportsExtendedDynamicState2 = {
        "supportsExtendedDynamicState2", FeatureCategory::VulkanFeatures,
        "VkDevice supports VK_EXT_extended_dynamic_state2 extension", &members,
    FeatureInfo supportsLogicOpDynamicState = {
        "supportsLogicOpDynamicState", FeatureCategory::VulkanFeatures,
        "VkDevice supports the logicOp feature of VK_EXT_extended_dynamic_state2 extension",
    FeatureInfo supportsFragmentShadingRate = {
        "supportsFragmentShadingRate", FeatureCategory::VulkanFeatures,
        "VkDevice supports VK_KHR_fragment_shading_rate extension", &members,
    FeatureInfo supportsFragmentShaderPixelInterlock = {
        "supportsFragmentShaderPixelInterlock",
        FeatureCategory::VulkanFeatures,
        "VkDevice supports the VK_EXT_fragment_shader_interlock extension "
        "and has the fragmentShaderPixelInterlock feature",
        &members,
    };
    FeatureInfo explicitlyEnablePerSampleShading = {
        "explicitlyEnablePerSampleShading", FeatureCategory::VulkanWorkarounds,
        "Explicitly enable per-sample shading if the fragment shader contains the "
        "sample qualifier",
    FeatureInfo forceContinuousRefreshOnSharedPresent = {
        "forceContinuousRefreshOnSharedPresent", FeatureCategory::VulkanFeatures,
        "Force to create vulkan swapchain with continuous refresh on shared present", &members,
    FeatureInfo supportsImage2dViewOf3d = {
        "supportsImage2dViewOf3d", FeatureCategory::VulkanFeatures,
    FeatureInfo supportsImagelessFramebuffer = {
        "supportsImagelessFramebuffer", FeatureCategory::VulkanFeatures,
        "VkDevice supports VK_KHR_imageless_framebuffer extension", &members,
    FeatureInfo preferLinearFilterForYUV = {
        "preferLinearFilterForYUV", FeatureCategory::VulkanFeatures,
        "Prefer to use VK_FILTER_LINEAR for VkSamplerYcbcrConversion", &members,
    FeatureInfo supportsYuvTarget = {
        "supportsYuvTarget",
        FeatureCategory::VulkanFeatures,
        "VkDevice supports VK_ANDROID_render_to_external_format and VK_EXT_ycbcr_attachment",
        &members,
    };
    FeatureInfo useNonZeroStencilWriteMaskStaticState = {
        "useNonZeroStencilWriteMaskStaticState", FeatureCategory::VulkanWorkarounds,
        "Work around a driver bug where 0 in stencil write mask static state would make the"
        "corresponding dynamic state malfunction in the presence of discard or alpha to coverage",
    FeatureInfo mapUnspecifiedColorSpaceToPassThrough = {
        "mapUnspecifiedColorSpaceToPassThrough",
        FeatureCategory::VulkanFeatures,
        "Use VK_COLOR_SPACE_PASS_THROUGH_EXT for EGL_NONE or unspecifed color "
        "spaces",
        &members,
    };
    FeatureInfo supportsTimestampSurfaceAttribute = {
        "supportsTimestampSurfaceAttribute", FeatureCategory::VulkanFeatures,
        "Platform supports setting frame timestamp surface attribute", &members,
    FeatureInfo supportsRasterizationOrderAttachmentAccess = {
        "supportsRasterizationOrderAttachmentAccess", FeatureCategory::VulkanFeatures,
        "VkDevice supports VK_EXT_rasterization_order_attachment_access extension", &members,
    FeatureInfo eglColorspaceAttributePassthrough = {
        "eglColorspaceAttributePassthrough", FeatureCategory::VulkanFeatures,
        "Support passthrough of EGL colorspace attribute values", &members,
    FeatureInfo supportsPipelineRobustness = {
        "supportsPipelineRobustness", FeatureCategory::VulkanFeatures,
        "VkDevice supports VK_EXT_pipeline_robustness extension", &members,
    FeatureInfo supportsVertexInputDynamicState = {
        "supportsVertexInputDynamicState", FeatureCategory::VulkanFeatures,
        "VkDevice supports VK_EXT_vertex_input_dynamic_state extension", &members,
    FeatureInfo supportsColorWriteEnable = {"supportsColorWriteEnable",
                                            FeatureCategory::VulkanFeatures,
                                            "VkDevice supports VK_EXT_color_write_enable extension",
    FeatureInfo supportsPresentation = {
        "supportsPresentation",
        FeatureCategory::VulkanFeatures,
        "VkDisplay supports presentation through a present family queue",
        &members,
    };
    FeatureInfo supportsComputeTranscodeEtcToBc = {
        "supportsComputeTranscodeEtcToBc",
        FeatureCategory::VulkanFeatures,
        "supports compute shader transcode etc format to bc format",
        &members,
    };
    FeatureInfo supportsGraphicsPipelineLibrary = {
        "supportsGraphicsPipelineLibrary", FeatureCategory::VulkanFeatures,
        "VkDevice supports the VK_EXT_graphics_pipeline_library extension", &members,
    FeatureInfo supportsPipelineProtectedAccess = {
        "supportsPipelineProtectedAccess", FeatureCategory::VulkanFeatures,
        "VkDevice supports the VK_EXT_pipeline_protected_access extension", &members,
    FeatureInfo preferSubmitOnAnySamplesPassedQueryEnd = {
        "preferSubmitOnAnySamplesPassedQueryEnd", FeatureCategory::VulkanWorkarounds,
        "Submit commands to driver when last GL_ANY_SAMPLES_PASSED query is made for performance "
        "improvements.",
};
inline FeaturesVk::FeaturesVk()  = default;
inline FeaturesVk::~FeaturesVk() = default;
}  // namespace angle
#endif  // ANGLE_PLATFORM_FEATURESVK_H_