• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // GENERATED FILE - DO NOT EDIT.
2 // Generated by gen_features.py using data from vk_features.json.
3 //
4 // Copyright 2022 The ANGLE Project Authors. All rights reserved.
5 // Use of this source code is governed by a BSD-style license that can be
6 // found in the LICENSE file.
7 //
8 // FeaturesVk_autogen.h: Optional features for the Vulkan renderer.
9 
10 #ifndef ANGLE_PLATFORM_AUTOGEN_FEATURESVK_H_
11 #define ANGLE_PLATFORM_AUTOGEN_FEATURESVK_H_
12 
13 #include "platform/Feature.h"
14 
15 namespace angle
16 {
17 
18 struct FeaturesVk : FeatureSetBase
19 {
20     FeaturesVk();
21     ~FeaturesVk();
22 
23     FeatureInfo appendAliasedMemoryDecorations = {
24         "appendAliasedMemoryDecorations",
25         FeatureCategory::VulkanWorkarounds,
26         "Append aliased memory decoration to ssbo and image in SPIR-V if they are not declared with restrict memory qualifier in GLSL",
27         &members, "b/266235549"
28     };
29 
30     FeatureInfo bresenhamLineRasterization = {
31         "bresenhamLineRasterization",
32         FeatureCategory::VulkanFeatures,
33         "Enable Bresenham line rasterization via VK_EXT_line_rasterization extension",
34         &members,
35     };
36 
37     FeatureInfo provokingVertex = {
38         "provokingVertex",
39         FeatureCategory::VulkanFeatures,
40         "Enable provoking vertex mode via VK_EXT_provoking_vertex extension",
41         &members,
42     };
43 
44     FeatureInfo forceFallbackFormat = {
45         "forceFallbackFormat",
46         FeatureCategory::VulkanWorkarounds,
47         "Force a fallback format for angle_end2end_tests",
48         &members,
49     };
50 
51     FeatureInfo clampPointSize = {
52         "clampPointSize",
53         FeatureCategory::VulkanWorkarounds,
54         "The point size range reported from the API is inconsistent with the actual behavior",
55         &members, "http://anglebug.com/2970"
56     };
57 
58     FeatureInfo supportsDepthClampZeroOne = {
59         "supportsDepthClampZeroOne",
60         FeatureCategory::VulkanFeatures,
61         "VkDevice supports the VK_EXT_depth_clamp_zero_one extension",
62         &members, "http://anglebug.com/3970"
63     };
64 
65     FeatureInfo clampFragDepth = {
66         "clampFragDepth",
67         FeatureCategory::VulkanWorkarounds,
68         "gl_FragDepth is not clamped when rendering to a floating point depth buffer without VK_EXT_depth_clamp_zero_one",
69         &members, "http://anglebug.com/3970"
70     };
71 
72     FeatureInfo mutableMipmapTextureUpload = {
73         "mutableMipmapTextureUpload",
74         FeatureCategory::VulkanFeatures,
75         "Enable uploading the previously defined mutable mipmap texture.",
76         &members, "https://anglebug.com/7308"
77     };
78 
79     FeatureInfo useVmaForImageSuballocation = {
80         "useVmaForImageSuballocation",
81         FeatureCategory::VulkanFeatures,
82         "Utilize VMA for image memory suballocation.",
83         &members,
84     };
85 
86     FeatureInfo supportsMemoryBudget = {
87         "supportsMemoryBudget",
88         FeatureCategory::VulkanFeatures,
89         "VkDevice supports the VK_EXT_memory_budget extension.",
90         &members,
91     };
92 
93     FeatureInfo supportsRenderpass2 = {
94         "supportsRenderpass2",
95         FeatureCategory::VulkanFeatures,
96         "VkDevice supports the VK_KHR_create_renderpass2 extension",
97         &members,
98     };
99 
100     FeatureInfo supportsIncrementalPresent = {
101         "supportsIncrementalPresent",
102         FeatureCategory::VulkanFeatures,
103         "VkDevice supports the VK_KHR_incremental_present extension",
104         &members,
105     };
106 
107     FeatureInfo supportsAndroidHardwareBuffer = {
108         "supportsAndroidHardwareBuffer",
109         FeatureCategory::VulkanFeatures,
110         "VkDevice supports the VK_ANDROID_external_memory_android_hardware_buffer extension",
111         &members,
112     };
113 
114     FeatureInfo supportsGGPFrameToken = {
115         "supportsGGPFrameToken",
116         FeatureCategory::VulkanFeatures,
117         "VkDevice supports the VK_GGP_frame_token extension",
118         &members,
119     };
120 
121     FeatureInfo supportsExternalMemoryFd = {
122         "supportsExternalMemoryFd",
123         FeatureCategory::VulkanFeatures,
124         "VkDevice supports the VK_KHR_external_memory_fd extension",
125         &members,
126     };
127 
128     FeatureInfo supportsExternalMemoryFuchsia = {
129         "supportsExternalMemoryFuchsia",
130         FeatureCategory::VulkanFeatures,
131         "VkDevice supports the VK_FUCHSIA_external_memory extension",
132         &members,
133     };
134 
135     FeatureInfo supportsExternalFenceCapabilities = {
136         "supportsExternalFenceCapabilities",
137         FeatureCategory::VulkanFeatures,
138         "VkInstance supports the VK_KHR_external_fence_capabilities extension",
139         &members,
140     };
141 
142     FeatureInfo supportsExternalSemaphoreCapabilities = {
143         "supportsExternalSemaphoreCapabilities",
144         FeatureCategory::VulkanFeatures,
145         "VkInstance supports the VK_KHR_external_semaphore_capabilities extension",
146         &members,
147     };
148 
149     FeatureInfo supportsExternalSemaphoreFd = {
150         "supportsExternalSemaphoreFd",
151         FeatureCategory::VulkanFeatures,
152         "VkDevice supports the VK_KHR_external_semaphore_fd extension",
153         &members,
154     };
155 
156     FeatureInfo supportsExternalSemaphoreFuchsia = {
157         "supportsExternalSemaphoreFuchsia",
158         FeatureCategory::VulkanFeatures,
159         "VkDevice supports the VK_FUCHSIA_external_semaphore extension",
160         &members,
161     };
162 
163     FeatureInfo supportsExternalFenceFd = {
164         "supportsExternalFenceFd",
165         FeatureCategory::VulkanFeatures,
166         "VkDevice supports the VK_KHR_external_fence_fd extension",
167         &members, "http://anglebug.com/2517"
168     };
169 
170     FeatureInfo supportsAndroidNativeFenceSync = {
171         "supportsAndroidNativeFenceSync",
172         FeatureCategory::VulkanFeatures,
173         "VkDevice supports the EGL_ANDROID_native_fence_sync extension",
174         &members, "http://anglebug.com/2517"
175     };
176 
177     FeatureInfo supportsImageCubeArray = {
178         "supportsImageCubeArray",
179         FeatureCategory::VulkanFeatures,
180         "VkDevice supports the imageCubeArray feature properly",
181         &members, "http://anglebug.com/3584"
182     };
183 
184     FeatureInfo supportsPipelineStatisticsQuery = {
185         "supportsPipelineStatisticsQuery",
186         FeatureCategory::VulkanFeatures,
187         "VkDevice supports the pipelineStatisticsQuery feature",
188         &members, "http://anglebug.com/5430"
189     };
190 
191     FeatureInfo supportsShaderStencilExport = {
192         "supportsShaderStencilExport",
193         FeatureCategory::VulkanFeatures,
194         "VkDevice supports the VK_EXT_shader_stencil_export extension",
195         &members,
196     };
197 
198     FeatureInfo supportsYUVSamplerConversion = {
199         "supportsYUVSamplerConversion",
200         FeatureCategory::VulkanFeatures,
201         "VkDevice supports the VK_KHR_sampler_ycbcr_conversion extension",
202         &members,
203     };
204 
205     FeatureInfo emulateTransformFeedback = {
206         "emulateTransformFeedback",
207         FeatureCategory::VulkanFeatures,
208         "Emulate transform feedback as the VK_EXT_transform_feedback is not present.",
209         &members, "http://anglebug.com/3205"
210     };
211 
212     FeatureInfo supportsTransformFeedbackExtension = {
213         "supportsTransformFeedbackExtension",
214         FeatureCategory::VulkanFeatures,
215         "Transform feedback uses the VK_EXT_transform_feedback extension.",
216         &members, "http://anglebug.com/3206"
217     };
218 
219     FeatureInfo supportsGeometryStreamsCapability = {
220         "supportsGeometryStreamsCapability",
221         FeatureCategory::VulkanFeatures,
222         "Implementation supports the GeometryStreams SPIR-V capability.",
223         &members, "http://anglebug.com/3206"
224     };
225 
226     FeatureInfo supportsIndexTypeUint8 = {
227         "supportsIndexTypeUint8",
228         FeatureCategory::VulkanFeatures,
229         "VkDevice supports the VK_EXT_index_type_uint8 extension",
230         &members, "http://anglebug.com/4405"
231     };
232 
233     FeatureInfo supportsCustomBorderColor = {
234         "supportsCustomBorderColor",
235         FeatureCategory::VulkanFeatures,
236         "VkDevice supports the VK_EXT_custom_border_color extension",
237         &members, "http://anglebug.com/3577"
238     };
239 
240     FeatureInfo supportsMultiDrawIndirect = {
241         "supportsMultiDrawIndirect",
242         FeatureCategory::VulkanFeatures,
243         "VkDevice supports the multiDrawIndirect extension",
244         &members, "http://anglebug.com/6439"
245     };
246 
247     FeatureInfo supportsDepthStencilResolve = {
248         "supportsDepthStencilResolve",
249         FeatureCategory::VulkanFeatures,
250         "VkDevice supports the VK_KHR_depth_stencil_resolve extension",
251         &members, "http://anglebug.com/4836"
252     };
253 
254     FeatureInfo supportsDepthStencilIndependentResolveNone = {
255         "supportsDepthStencilIndependentResolveNone",
256         FeatureCategory::VulkanFeatures,
257         "VkDevice supports the VK_KHR_depth_stencil_resolve "
258         "extension with the independentResolveNone feature",
259         &members, "http://anglebug.com/7551"
260     };
261 
262     FeatureInfo supportsMultisampledRenderToSingleSampled = {
263         "supportsMultisampledRenderToSingleSampled",
264         FeatureCategory::VulkanFeatures,
265         "VkDevice supports the VK_EXT_multisampled_render_to_single_sampled extension",
266         &members, "http://anglebug.com/4836"
267     };
268 
269     FeatureInfo preferMSRTSSFlagByDefault = {
270         "preferMSRTSSFlagByDefault",
271         FeatureCategory::VulkanFeatures,
272         "Enable MSRTSS for each image initialization if available",
273         &members, "http://anglebug.com/8622"
274     };
275 
276     FeatureInfo supportsMultiview = {
277         "supportsMultiview",
278         FeatureCategory::VulkanFeatures,
279         "VkDevice supports the VK_KHR_multiview extension",
280         &members, "http://anglebug.com/6048"
281     };
282 
283     FeatureInfo forceD16TexFilter = {
284         "forceD16TexFilter",
285         FeatureCategory::VulkanWorkarounds,
286         "VK_FORMAT_D16_UNORM does not support VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT, "
287         "which prevents OES_depth_texture from being supported.",
288         &members, "http://anglebug.com/3452"
289     };
290 
291     FeatureInfo disableFlippingBlitWithCommand = {
292         "disableFlippingBlitWithCommand",
293         FeatureCategory::VulkanWorkarounds,
294         "vkCmdBlitImage with flipped coordinates blits incorrectly.",
295         &members, "http://anglebug.com/3498"
296     };
297 
298     FeatureInfo perFrameWindowSizeQuery = {
299         "perFrameWindowSizeQuery",
300         FeatureCategory::VulkanWorkarounds,
301         "Vulkan swapchain is not returning VK_ERROR_OUT_OF_DATE when window resizing",
302         &members, "http://anglebug.com/3623, http://anglebug.com/3624, http://anglebug.com/3625"
303     };
304 
305     FeatureInfo padBuffersToMaxVertexAttribStride = {
306         "padBuffersToMaxVertexAttribStride",
307         FeatureCategory::VulkanWorkarounds,
308         "Vulkan considers vertex attribute accesses to count up to the last multiple of the "
309         "stride. This additional access supports AMD's robust buffer access implementation. "
310         "AMDVLK in particular will return incorrect values when the vertex access extends into "
311         "the range that would be the stride padding and the buffer is too small. "
312         "This workaround limits GL_MAX_VERTEX_ATTRIB_STRIDE to a maximum value and "
313         "pads up every buffer allocation size to be a multiple of the maximum stride.",
314         &members, "http://anglebug.com/4428"
315     };
316 
317     FeatureInfo supportsExternalMemoryDmaBufAndModifiers = {
318         "supportsExternalMemoryDmaBufAndModifiers",
319         FeatureCategory::VulkanFeatures,
320         "VkDevice supports the VK_EXT_external_memory_dma_buf and VK_EXT_image_drm_format_modifier "
321         "extensions",
322         &members, "http://anglebug.com/6248"
323     };
324 
325     FeatureInfo supportsExternalMemoryHost = {
326         "supportsExternalMemoryHost",
327         FeatureCategory::VulkanFeatures,
328         "VkDevice supports the VK_EXT_external_memory_host extension",
329         &members,
330     };
331 
332     FeatureInfo allocateNonZeroMemory = {
333         "allocateNonZeroMemory",
334         FeatureCategory::VulkanFeatures,
335         "Fill new allocations with non-zero values to flush out errors.",
336         &members, "http://anglebug.com/4384"
337     };
338 
339     FeatureInfo logMemoryReportCallbacks = {
340         "logMemoryReportCallbacks",
341         FeatureCategory::VulkanFeatures,
342         "Log each callback from VK_EXT_device_memory_report",
343         &members,
344     };
345 
346     FeatureInfo logMemoryReportStats = {
347         "logMemoryReportStats",
348         FeatureCategory::VulkanFeatures,
349         "Log stats from VK_EXT_device_memory_report each swap",
350         &members,
351     };
352 
353     FeatureInfo preferCPUForBufferSubData = {
354         "preferCPUForBufferSubData",
355         FeatureCategory::VulkanFeatures,
356         "Prefer use CPU to do bufferSubData instead of staged update.",
357         &members, "http://issuetracker.google.com/200067929"
358     };
359 
360     FeatureInfo persistentlyMappedBuffers = {
361         "persistentlyMappedBuffers",
362         FeatureCategory::VulkanFeatures,
363         "Persistently map buffer memory to reduce map/unmap IOCTL overhead.",
364         &members, "http://anglebug.com/2162"
365     };
366 
367     FeatureInfo enablePreRotateSurfaces = {
368         "enablePreRotateSurfaces",
369         FeatureCategory::VulkanFeatures,
370         "Enable Android pre-rotation for landscape applications",
371         &members, "http://anglebug.com/3502"
372     };
373 
374     FeatureInfo enablePrecisionQualifiers = {
375         "enablePrecisionQualifiers",
376         FeatureCategory::VulkanFeatures,
377         "Enable precision qualifiers in shaders",
378         &members, "http://anglebug.com/3078"
379     };
380 
381     FeatureInfo varyingsRequireMatchingPrecisionInSpirv = {
382         "varyingsRequireMatchingPrecisionInSpirv",
383         FeatureCategory::VulkanWorkarounds,
384         "Add additional SPIR-V instructions to make sure precision "
385         "between shader stages match with each other",
386         &members, "http://anglebug.com/7488"
387     };
388 
389     FeatureInfo preferAggregateBarrierCalls = {
390         "preferAggregateBarrierCalls",
391         FeatureCategory::VulkanWorkarounds,
392         "Single barrier call is preferred over multiple calls with "
393         "fine grained pipeline stage dependency information",
394         &members, "http://anglebug.com/4633"
395     };
396 
397     FeatureInfo preferSkippingInvalidateForEmulatedFormats = {
398         "preferSkippingInvalidateForEmulatedFormats",
399         FeatureCategory::VulkanWorkarounds,
400         "Skipping invalidate is preferred for emulated formats that have extra channels over "
401         "re-clearing the image",
402         &members, "http://anglebug.com/6860"
403     };
404 
405     FeatureInfo asyncCommandQueue = {
406         "asyncCommandQueue",
407         FeatureCategory::VulkanFeatures,
408         "Use CommandQueue worker thread to dispatch work to GPU.",
409         &members, "http://anglebug.com/4324"
410     };
411 
412     FeatureInfo slowAsyncCommandQueueForTesting = {
413         "slowAsyncCommandQueueForTesting",
414         FeatureCategory::VulkanWorkarounds,
415         "Artificially slow down async command queue for threading testing",
416         &members, "https://anglebug.com/6574"
417     };
418 
419     FeatureInfo supportsShaderFloat16 = {
420         "supportsShaderFloat16",
421         FeatureCategory::VulkanFeatures,
422         "VkDevice supports the VK_KHR_shader_float16_int8 extension "
423         "and has the shaderFloat16 feature",
424         &members, "http://anglebug.com/4551"
425     };
426 
427     FeatureInfo allowGenerateMipmapWithCompute = {
428         "allowGenerateMipmapWithCompute",
429         FeatureCategory::VulkanFeatures,
430         "Use the compute path to generate mipmaps on devices that meet the minimum requirements, "
431         "and the performance is better.",
432         &members, "http://anglebug.com/4551"
433     };
434 
435     FeatureInfo supportsRenderPassStoreOpNone = {
436         "supportsRenderPassStoreOpNone",
437         FeatureCategory::VulkanFeatures,
438         "VkDevice supports VK_QCOM_render_pass_store_ops extension.",
439         &members, "http://anglebug.com/5055"
440     };
441 
442     FeatureInfo supportsRenderPassLoadStoreOpNone = {
443         "supportsRenderPassLoadStoreOpNone",
444         FeatureCategory::VulkanFeatures,
445         "VkDevice supports VK_EXT_load_store_op_none extension.",
446         &members, "http://anglebug.com/5371"
447     };
448 
449     FeatureInfo disallowMixedDepthStencilLoadOpNoneAndLoad = {
450         "disallowMixedDepthStencilLoadOpNoneAndLoad",
451         FeatureCategory::VulkanWorkarounds,
452         "Disallow use of LOAD_OP_NONE for only one of the depth or stencil aspects of a "
453         "depth/stencil attachment",
454         &members, "http://anglebug.com/7370"
455     };
456 
457     FeatureInfo supportsDepthClipControl = {
458         "supportsDepthClipControl",
459         FeatureCategory::VulkanFeatures,
460         "VkDevice supports VK_EXT_depth_clip_control extension.",
461         &members, "http://anglebug.com/5421"
462     };
463 
464     FeatureInfo supportsPrimitiveTopologyListRestart = {
465         "supportsPrimitiveTopologyListRestart",
466         FeatureCategory::VulkanFeatures,
467         "VkDevice supports VK_EXT_primitive_topology_list_restart extension.",
468         &members, "http://anglebug.com/3832"
469     };
470 
471     FeatureInfo supportsBlendOperationAdvanced = {
472         "supportsBlendOperationAdvanced",
473         FeatureCategory::VulkanFeatures,
474         "VkDevice supports VK_EXT_blend_operation_advanced extension.",
475         &members, "http://anglebug.com/3586"
476     };
477 
478     FeatureInfo forceMaxUniformBufferSize16KB = {
479         "forceMaxUniformBufferSize16KB",
480         FeatureCategory::VulkanWorkarounds,
481         "Force max uniform buffer size to 16K on some device due to bug",
482         &members, "https://issuetracker.google.com/161903006"
483     };
484 
485     FeatureInfo supportsImageFormatList = {
486         "supportsImageFormatList",
487         FeatureCategory::VulkanFeatures,
488         "Enable VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT by default for ICDs "
489         "that support VK_KHR_image_format_list",
490         &members, "http://anglebug.com/5281"
491     };
492 
493     FeatureInfo allowMultisampledRenderToTextureEmulation = {
494         "allowMultisampledRenderToTextureEmulation",
495         FeatureCategory::VulkanWorkarounds,
496         "Allow emulation of EXT_multisampled_render_to_texture",
497         &members, "http://anglebug.com/8291"
498     };
499 
500     FeatureInfo enableMultisampledRenderToTexture = {
501         "enableMultisampledRenderToTexture",
502         FeatureCategory::VulkanWorkarounds,
503         "Expose EXT_multisampled_render_to_texture",
504         &members, "http://anglebug.com/4937"
505     };
506 
507     FeatureInfo waitIdleBeforeSwapchainRecreation = {
508         "waitIdleBeforeSwapchainRecreation",
509         FeatureCategory::VulkanWorkarounds,
510         "Before passing an oldSwapchain to VkSwapchainCreateInfoKHR, wait for queue to be idle. "
511         "Works around a bug on platforms which destroy oldSwapchain in vkCreateSwapchainKHR.",
512         &members, "http://anglebug.com/5061"
513     };
514 
515     FeatureInfo forceTextureLodOffset1 = {
516         "forceTextureLodOffset1",
517         FeatureCategory::VulkanWorkarounds,
518         "Increase the minimum texture level-of-detail by 1 when sampling.",
519         &members,
520     };
521 
522     FeatureInfo forceTextureLodOffset2 = {
523         "forceTextureLodOffset2",
524         FeatureCategory::VulkanWorkarounds,
525         "Increase the minimum texture level-of-detail by 2 when sampling.",
526         &members,
527     };
528 
529     FeatureInfo forceTextureLodOffset3 = {
530         "forceTextureLodOffset3",
531         FeatureCategory::VulkanWorkarounds,
532         "Increase the minimum texture level-of-detail by 3 when sampling.",
533         &members,
534     };
535 
536     FeatureInfo forceTextureLodOffset4 = {
537         "forceTextureLodOffset4",
538         FeatureCategory::VulkanWorkarounds,
539         "Increase the minimum texture level-of-detail by 4 when sampling.",
540         &members,
541     };
542 
543     FeatureInfo forceNearestFiltering = {
544         "forceNearestFiltering",
545         FeatureCategory::VulkanWorkarounds,
546         "Force nearest filtering when sampling.",
547         &members,
548     };
549 
550     FeatureInfo forceNearestMipFiltering = {
551         "forceNearestMipFiltering",
552         FeatureCategory::VulkanWorkarounds,
553         "Force nearest mip filtering when sampling.",
554         &members,
555     };
556 
557     FeatureInfo compressVertexData = {
558         "compressVertexData",
559         FeatureCategory::VulkanWorkarounds,
560         "Compress vertex data to smaller data types when "
561         "possible. Using this feature makes ANGLE non-conformant.",
562         &members,
563     };
564 
565     FeatureInfo preferDrawClearOverVkCmdClearAttachments = {
566         "preferDrawClearOverVkCmdClearAttachments",
567         FeatureCategory::VulkanWorkarounds,
568         "On some hardware, clear using a draw call instead of vkCmdClearAttachments in the middle "
569         "of render pass due to bugs",
570         &members, "https://issuetracker.google.com/166809097"
571     };
572 
573     FeatureInfo emulatedPrerotation90 = {
574         "emulatedPrerotation90",
575         FeatureCategory::VulkanFeatures,
576         "Emulate 90-degree prerotation.",
577         &members, "http://anglebug.com/4901"
578     };
579 
580     FeatureInfo emulatedPrerotation180 = {
581         "emulatedPrerotation180",
582         FeatureCategory::VulkanFeatures,
583         "Emulate 180-degree prerotation.",
584         &members, "http://anglebug.com/4901"
585     };
586 
587     FeatureInfo emulatedPrerotation270 = {
588         "emulatedPrerotation270",
589         FeatureCategory::VulkanFeatures,
590         "Emulate 270-degree prerotation.",
591         &members, "http://anglebug.com/4901"
592     };
593 
594     FeatureInfo preferDriverUniformOverSpecConst = {
595         "preferDriverUniformOverSpecConst",
596         FeatureCategory::VulkanFeatures,
597         "Prefer using driver uniforms instead of specialization constants.",
598         &members, "http://anglebug.com/7406"
599     };
600 
601     FeatureInfo exposeNonConformantExtensionsAndVersions = {
602         "exposeNonConformantExtensionsAndVersions",
603         FeatureCategory::VulkanWorkarounds,
604         "Expose GLES versions and extensions that are not conformant.",
605         &members, "http://anglebug.com/5375"
606     };
607 
608     FeatureInfo emulateR32fImageAtomicExchange = {
609         "emulateR32fImageAtomicExchange",
610         FeatureCategory::VulkanWorkarounds,
611         "Emulate r32f images with r32ui to support imageAtomicExchange.",
612         &members, "http://anglebug.com/5535"
613     };
614 
615     FeatureInfo forceFragmentShaderPrecisionHighpToMediump = {
616         "forceFragmentShaderPrecisionHighpToMediump",
617         FeatureCategory::VulkanWorkarounds,
618         "Forces highp precision in fragment shader to mediump.",
619         &members, "https://issuetracker.google.com/184850002"
620     };
621 
622     FeatureInfo preferSubmitAtFBOBoundary = {
623         "preferSubmitAtFBOBoundary",
624         FeatureCategory::VulkanWorkarounds,
625         "Submit commands to driver at each FBO boundary for performance improvements.",
626         &members, "https://issuetracker.google.com/187425444"
627     };
628 
629     FeatureInfo useMultipleDescriptorsForExternalFormats = {
630         "useMultipleDescriptorsForExternalFormats",
631         FeatureCategory::VulkanWorkarounds,
632         "Return a default descriptor count for external formats.",
633         &members, "http://anglebug.com/6141"
634     };
635 
636     FeatureInfo supportsProtectedMemory = {
637         "supportsProtectedMemory",
638         FeatureCategory::VulkanFeatures,
639         "VkDevice supports protected memory",
640         &members, "http://anglebug.com/3965"
641     };
642 
643     FeatureInfo supportsHostQueryReset = {
644         "supportsHostQueryReset",
645         FeatureCategory::VulkanFeatures,
646         "VkDevice supports VK_EXT_host_query_reset extension",
647         &members, "http://anglebug.com/6692"
648     };
649 
650     FeatureInfo supportsPipelineCreationFeedback = {
651         "supportsPipelineCreationFeedback",
652         FeatureCategory::VulkanFeatures,
653         "VkDevice supports VK_EXT_pipeline_creation_feedback extension",
654         &members, "http://anglebug.com/5881"
655     };
656 
657     FeatureInfo supportsPrimitivesGeneratedQuery = {
658         "supportsPrimitivesGeneratedQuery",
659         FeatureCategory::VulkanFeatures,
660         "VkDevice supports VK_EXT_primitives_generated_query extension",
661         &members, "http://anglebug.com/5430"
662     };
663 
664     FeatureInfo supportsSurfaceCapabilities2Extension = {
665         "supportsSurfaceCapabilities2Extension",
666         FeatureCategory::VulkanFeatures,
667         "VkInstance supports the VK_KHR_get_surface_capabilities2 extension",
668         &members,
669     };
670 
671     FeatureInfo supportsSurfaceProtectedCapabilitiesExtension = {
672         "supportsSurfaceProtectedCapabilitiesExtension",
673         FeatureCategory::VulkanFeatures,
674         "VkInstance supports the VK_KHR_surface_protected_capabilities extension",
675         &members,
676     };
677 
678     FeatureInfo supportsSurfacelessQueryExtension = {
679         "supportsSurfacelessQueryExtension",
680         FeatureCategory::VulkanFeatures,
681         "VkInstance supports the VK_GOOGLE_surfaceless_query extension",
682         &members,
683     };
684 
685     FeatureInfo supportsSurfaceProtectedSwapchains = {
686         "supportsSurfaceProtectedSwapchains",
687         FeatureCategory::VulkanFeatures,
688         "VkSurface supportsProtected for protected swapchains",
689         &members,
690     };
691 
692     FeatureInfo overrideSurfaceFormatRGB8ToRGBA8 = {
693         "overrideSurfaceFormatRGB8ToRGBA8",
694         FeatureCategory::VulkanWorkarounds,
695         "Override surface format GL_RGB8 to GL_RGBA8",
696         &members, "http://anglebug.com/6651"
697     };
698 
699     FeatureInfo supportsSharedPresentableImageExtension = {
700         "supportsSharedPresentableImageExtension",
701         FeatureCategory::VulkanFeatures,
702         "VkSurface supports the VK_KHR_shared_presentable_images extension",
703         &members,
704     };
705 
706     FeatureInfo supportsShaderFramebufferFetch = {
707         "supportsShaderFramebufferFetch",
708         FeatureCategory::VulkanFeatures,
709         "Whether the Vulkan backend supports coherent framebuffer fetch",
710         &members,
711     };
712 
713     FeatureInfo supportsShaderFramebufferFetchNonCoherent = {
714         "supportsShaderFramebufferFetchNonCoherent",
715         FeatureCategory::VulkanFeatures,
716         "Whether the Vulkan backend supports non-coherent framebuffer fetch",
717         &members,
718     };
719 
720     FeatureInfo permanentlySwitchToFramebufferFetchMode = {
721         "permanentlySwitchToFramebufferFetchMode",
722         FeatureCategory::VulkanFeatures,
723         "Whether the context should permanently switch to framebuffer fetch mode on first "
724         "encounter",
725         &members,
726     };
727 
728     FeatureInfo supportsLockSurfaceExtension = {
729         "supportsLockSurfaceExtension",
730         FeatureCategory::VulkanFeatures,
731         "Surface supports the EGL_KHR_lock_surface3 extension",
732         &members,
733     };
734 
735     FeatureInfo swapbuffersOnFlushOrFinishWithSingleBuffer = {
736         "swapbuffersOnFlushOrFinishWithSingleBuffer",
737         FeatureCategory::VulkanFeatures,
738         "Bypass deferredFlush with calling swapbuffers on flush or finish when in Shared "
739         "Present mode",
740         &members, "http://anglebug.com/6878"
741     };
742 
743     FeatureInfo emulateDithering = {
744         "emulateDithering",
745         FeatureCategory::VulkanFeatures,
746         "Emulate OpenGL dithering",
747         &members, "http://anglebug.com/6755"
748     };
749 
750     FeatureInfo roundOutputAfterDithering = {
751         "roundOutputAfterDithering",
752         FeatureCategory::VulkanWorkarounds,
753         "Round output after dithering to workaround a driver bug that rounds the output up",
754         &members, "http://anglebug.com/6953"
755     };
756 
757     FeatureInfo adjustClearColorPrecision = {
758         "adjustClearColorPrecision",
759         FeatureCategory::VulkanWorkarounds,
760         "Adjust normalized clear color precision based on framebuffer color channel bits count",
761         &members, "https://issuetracker.google.com/292282210"
762     };
763 
764     FeatureInfo emulateAdvancedBlendEquations = {
765         "emulateAdvancedBlendEquations",
766         FeatureCategory::VulkanFeatures,
767         "Emulate GL_KHR_blend_equation_advanced",
768         &members, "http://anglebug.com/3586"
769     };
770 
771     FeatureInfo doubleDepthBiasConstantFactor = {
772         "doubleDepthBiasConstantFactor",
773         FeatureCategory::VulkanWorkarounds,
774         "Due to a Vulkan spec ambiguity, some drivers interpret depthBiasConstantFactor as half "
775         "the expected value",
776         &members,
777     };
778 
779     FeatureInfo bottomLeftOriginPresentRegionRectangles = {
780         "bottomLeftOriginPresentRegionRectangles",
781         FeatureCategory::VulkanWorkarounds,
782         "On some platforms present region rectangles are expected to have a bottom-left origin, "
783         "instead of top-left origin as from spec",
784         &members,
785     };
786 
787     FeatureInfo forceSubmitImmutableTextureUpdates = {
788         "forceSubmitImmutableTextureUpdates",
789         FeatureCategory::VulkanAppWorkarounds,
790         "Force submit updates to immutable textures",
791         &members, "http://anglebug.com/6929"
792     };
793 
794     FeatureInfo supportsSPIRV14 = {
795         "supportsSPIRV14",
796         FeatureCategory::VulkanFeatures,
797         "VkDevice supports VK_KHR_spirv_1_4 extension",
798         &members, "http://anglebug.com/342316794"
799     };
800 
801     FeatureInfo retainSPIRVDebugInfo = {
802         "retainSPIRVDebugInfo",
803         FeatureCategory::VulkanFeatures,
804         "Retain debug info in SPIR-V blob.",
805         &members, "http://anglebug.com/5901"
806     };
807 
808     FeatureInfo warmUpPipelineCacheAtLink = {
809         "warmUpPipelineCacheAtLink",
810         FeatureCategory::VulkanFeatures,
811         "Warm up the Vulkan pipeline cache at link time",
812         &members, "http://anglebug.com/5881"
813     };
814 
815     FeatureInfo preferDeviceLocalMemoryHostVisible = {
816         "preferDeviceLocalMemoryHostVisible",
817         FeatureCategory::VulkanFeatures,
818         "Prefer adding HOST_VISIBLE flag for DEVICE_LOCAL memory when picking memory types",
819         &members, "http://anglebug.com/7047"
820     };
821 
822     FeatureInfo supportsExtendedDynamicState = {
823         "supportsExtendedDynamicState",
824         FeatureCategory::VulkanFeatures,
825         "VkDevice supports VK_EXT_extended_dynamic_state extension",
826         &members, "http://anglebug.com/5906"
827     };
828 
829     FeatureInfo useVertexInputBindingStrideDynamicState = {
830         "useVertexInputBindingStrideDynamicState",
831         FeatureCategory::VulkanWorkarounds,
832         "Use the Vertex Input Bininding Stride dynamic state from VK_EXT_extended_dynamic_state",
833         &members, "http://anglebug.com/5906"
834     };
835 
836     FeatureInfo useCullModeDynamicState = {
837         "useCullModeDynamicState",
838         FeatureCategory::VulkanWorkarounds,
839         "Use the Cull Mode dynamic state from VK_EXT_extended_dynamic_state",
840         &members, "http://anglebug.com/5906"
841     };
842 
843     FeatureInfo useFrontFaceDynamicState = {
844         "useFrontFaceDynamicState",
845         FeatureCategory::VulkanWorkarounds,
846         "Use the Front Face dynamic state from VK_EXT_extended_dynamic_state",
847         &members, "http://anglebug.com/5906"
848     };
849 
850     FeatureInfo useDepthTestEnableDynamicState = {
851         "useDepthTestEnableDynamicState",
852         FeatureCategory::VulkanWorkarounds,
853         "Use the Depth Test Enable dynamic state from VK_EXT_extended_dynamic_state",
854         &members, "http://anglebug.com/5906"
855     };
856 
857     FeatureInfo useDepthWriteEnableDynamicState = {
858         "useDepthWriteEnableDynamicState",
859         FeatureCategory::VulkanWorkarounds,
860         "Use the Depth Write Enable dynamic state from VK_EXT_extended_dynamic_state",
861         &members, "http://anglebug.com/5906"
862     };
863 
864     FeatureInfo useDepthCompareOpDynamicState = {
865         "useDepthCompareOpDynamicState",
866         FeatureCategory::VulkanWorkarounds,
867         "Use the Depth Compare Op dynamic state from VK_EXT_extended_dynamic_state",
868         &members, "http://anglebug.com/5906"
869     };
870 
871     FeatureInfo useStencilTestEnableDynamicState = {
872         "useStencilTestEnableDynamicState",
873         FeatureCategory::VulkanWorkarounds,
874         "Use the Stencil Test Enable dynamic state from VK_EXT_extended_dynamic_state",
875         &members, "http://anglebug.com/5906"
876     };
877 
878     FeatureInfo useStencilOpDynamicState = {
879         "useStencilOpDynamicState",
880         FeatureCategory::VulkanWorkarounds,
881         "Use the Stencil Op dynamic state from VK_EXT_extended_dynamic_state",
882         &members, "http://anglebug.com/5906"
883     };
884 
885     FeatureInfo supportsExtendedDynamicState2 = {
886         "supportsExtendedDynamicState2",
887         FeatureCategory::VulkanFeatures,
888         "VkDevice supports VK_EXT_extended_dynamic_state2 extension",
889         &members, "http://anglebug.com/5906"
890     };
891 
892     FeatureInfo usePrimitiveRestartEnableDynamicState = {
893         "usePrimitiveRestartEnableDynamicState",
894         FeatureCategory::VulkanWorkarounds,
895         "Use the Primitive Restart Enable dynamic state from VK_EXT_extended_dynamic_state2",
896         &members, "http://anglebug.com/5906"
897     };
898 
899     FeatureInfo useRasterizerDiscardEnableDynamicState = {
900         "useRasterizerDiscardEnableDynamicState",
901         FeatureCategory::VulkanWorkarounds,
902         "Use the Rasterizer Discard Enable dynamic state from VK_EXT_extended_dynamic_state2",
903         &members, "http://anglebug.com/5906"
904     };
905 
906     FeatureInfo useDepthBiasEnableDynamicState = {
907         "useDepthBiasEnableDynamicState",
908         FeatureCategory::VulkanWorkarounds,
909         "Use the Depth Bias Enable dynamic state from VK_EXT_extended_dynamic_state2",
910         &members, "http://anglebug.com/5906"
911     };
912 
913     FeatureInfo supportsLogicOpDynamicState = {
914         "supportsLogicOpDynamicState",
915         FeatureCategory::VulkanFeatures,
916         "VkDevice supports the logicOp feature of VK_EXT_extended_dynamic_state2 extension",
917         &members, "http://anglebug.com/3862"
918     };
919 
920     FeatureInfo supportsFragmentShadingRate = {
921         "supportsFragmentShadingRate",
922         FeatureCategory::VulkanFeatures,
923         "VkDevice supports VK_KHR_fragment_shading_rate extension",
924         &members, "http://anglebug.com/7172"
925     };
926 
927     FeatureInfo supportsFoveatedRendering = {
928         "supportsFoveatedRendering",
929         FeatureCategory::VulkanFeatures,
930         "Use VK_KHR_fragment_shading_rate extension to implement QCOM foveated rendering extensions",
931         &members, "http://anglebug.com/8484"
932     };
933 
934     FeatureInfo supportsFragmentShaderPixelInterlock = {
935         "supportsFragmentShaderPixelInterlock",
936         FeatureCategory::VulkanFeatures,
937         "VkDevice supports the VK_EXT_fragment_shader_interlock extension "
938         "and has the fragmentShaderPixelInterlock feature",
939         &members,
940     };
941 
942     FeatureInfo explicitlyEnablePerSampleShading = {
943         "explicitlyEnablePerSampleShading",
944         FeatureCategory::VulkanWorkarounds,
945         "Explicitly enable per-sample shading if the fragment shader contains the "
946         "sample qualifier",
947         &members, "http://anglebug.com/6876"
948     };
949 
950     FeatureInfo explicitlyCastMediumpFloatTo16Bit = {
951         "explicitlyCastMediumpFloatTo16Bit",
952         FeatureCategory::VulkanWorkarounds,
953         "Explicitly cast mediump floating point values to 16 bit",
954         &members, "https://issuetracker.google.com/274859104"
955     };
956 
957     FeatureInfo forceContinuousRefreshOnSharedPresent = {
958         "forceContinuousRefreshOnSharedPresent",
959         FeatureCategory::VulkanFeatures,
960         "Force to create vulkan swapchain with continuous refresh on shared present",
961         &members, "https://issuetracker.google.com/229267970"
962     };
963 
964     FeatureInfo supportsImage2dViewOf3d = {
965         "supportsImage2dViewOf3d",
966         FeatureCategory::VulkanFeatures,
967         "VkDevice supports VK_EXT_image_2d_view_of_3d",
968         &members, "https://anglebug.com/7320"
969     };
970 
971     FeatureInfo supportsSampler2dViewOf3d = {
972         "supportsSampler2dViewOf3d",
973         FeatureCategory::VulkanFeatures,
974         "VkDevice supports the sampler2DViewOf3D feature of VK_EXT_image_2d_view_of_3d",
975         &members, "https://anglebug.com/7320"
976     };
977 
978     FeatureInfo supportsImagelessFramebuffer = {
979         "supportsImagelessFramebuffer",
980         FeatureCategory::VulkanFeatures,
981         "VkDevice supports VK_KHR_imageless_framebuffer extension",
982         &members, "http://anglebug.com/7553"
983     };
984 
985     FeatureInfo preferLinearFilterForYUV = {
986         "preferLinearFilterForYUV",
987         FeatureCategory::VulkanFeatures,
988         "Prefer to use VK_FILTER_LINEAR for VkSamplerYcbcrConversion",
989         &members, "https://anglebug.com/7382"
990     };
991 
992     FeatureInfo supportsYuvTarget = {
993         "supportsYuvTarget",
994         FeatureCategory::VulkanFeatures,
995         "VkDevice supports VK_ANDROID_render_to_external_format and VK_EXT_ycbcr_attachment",
996         &members,
997     };
998 
999     FeatureInfo useNonZeroStencilWriteMaskStaticState = {
1000         "useNonZeroStencilWriteMaskStaticState",
1001         FeatureCategory::VulkanWorkarounds,
1002         "Work around a driver bug where 0 in stencil write mask static state would make the "
1003         "corresponding dynamic state malfunction in the presence of discard or alpha to coverage",
1004         &members, "http://anglebug.com/7556"
1005     };
1006 
1007     FeatureInfo mapUnspecifiedColorSpaceToPassThrough = {
1008         "mapUnspecifiedColorSpaceToPassThrough",
1009         FeatureCategory::VulkanFeatures,
1010         "Use VK_COLOR_SPACE_PASS_THROUGH_EXT for EGL_NONE or unspecifed color "
1011         "spaces",
1012         &members,
1013     };
1014 
1015     FeatureInfo supportsTimestampSurfaceAttribute = {
1016         "supportsTimestampSurfaceAttribute",
1017         FeatureCategory::VulkanFeatures,
1018         "Platform supports setting frame timestamp surface attribute",
1019         &members, "https://anglebug.com/7489"
1020     };
1021 
1022     FeatureInfo supportsRasterizationOrderAttachmentAccess = {
1023         "supportsRasterizationOrderAttachmentAccess",
1024         FeatureCategory::VulkanFeatures,
1025         "VkDevice supports VK_EXT_rasterization_order_attachment_access extension",
1026         &members, "https://anglebug.com/7604"
1027     };
1028 
1029     FeatureInfo eglColorspaceAttributePassthrough = {
1030         "eglColorspaceAttributePassthrough",
1031         FeatureCategory::VulkanFeatures,
1032         "Support passthrough of EGL colorspace attribute values",
1033         &members, "https://anglebug.com/7319"
1034     };
1035 
1036     FeatureInfo supportsPipelineRobustness = {
1037         "supportsPipelineRobustness",
1038         FeatureCategory::VulkanFeatures,
1039         "VkDevice supports VK_EXT_pipeline_robustness extension",
1040         &members, "https://anglebug.com/5845"
1041     };
1042 
1043     FeatureInfo supportsVertexInputDynamicState = {
1044         "supportsVertexInputDynamicState",
1045         FeatureCategory::VulkanFeatures,
1046         "VkDevice supports VK_EXT_vertex_input_dynamic_state extension",
1047         &members, "https://anglebug.com/7162"
1048     };
1049 
1050     FeatureInfo supportsColorWriteEnable = {
1051         "supportsColorWriteEnable",
1052         FeatureCategory::VulkanFeatures,
1053         "VkDevice supports VK_EXT_color_write_enable extension",
1054         &members, "https://anglebug.com/7161"
1055     };
1056 
1057     FeatureInfo supportsPresentation = {
1058         "supportsPresentation",
1059         FeatureCategory::VulkanFeatures,
1060         "VkDisplay supports presentation through a present family queue",
1061         &members,
1062     };
1063 
1064     FeatureInfo supportsComputeTranscodeEtcToBc = {
1065         "supportsComputeTranscodeEtcToBc",
1066         FeatureCategory::VulkanFeatures,
1067         "supports compute shader transcode etc format to bc format",
1068         &members,
1069     };
1070 
1071     FeatureInfo supportsGraphicsPipelineLibrary = {
1072         "supportsGraphicsPipelineLibrary",
1073         FeatureCategory::VulkanFeatures,
1074         "VkDevice supports the VK_EXT_graphics_pipeline_library extension",
1075         &members, "https://anglebug.com/7369"
1076     };
1077 
1078     FeatureInfo preferMonolithicPipelinesOverLibraries = {
1079         "preferMonolithicPipelinesOverLibraries",
1080         FeatureCategory::VulkanWorkarounds,
1081         "Whether monolithic pipelines perform significantly better than libraries",
1082         &members, "https://anglebug.com/7369"
1083     };
1084 
1085     FeatureInfo slowDownMonolithicPipelineCreationForTesting = {
1086         "slowDownMonolithicPipelineCreationForTesting",
1087         FeatureCategory::VulkanWorkarounds,
1088         "Artificially slow down async monolithic pipeline creation for threading testing",
1089         &members, "https://anglebug.com/7369"
1090     };
1091 
1092     FeatureInfo disablePipelineCacheLoadForTesting = {
1093         "disablePipelineCacheLoadForTesting",
1094         FeatureCategory::VulkanWorkarounds,
1095         "Disable loading the pipeline cache from the blob cache for testing",
1096         &members, "https://anglebug.com/8417"
1097     };
1098 
1099     FeatureInfo syncMonolithicPipelinesToBlobCache = {
1100         "syncMonolithicPipelinesToBlobCache",
1101         FeatureCategory::VulkanWorkarounds,
1102         "Whether it's beneficial to store monolithic pipelines in the blob cache when "
1103         "VK_EXT_graphics_pipeline_library is in use.  Otherwise the libraries are stored "
1104         "only, and monolithic pipelines are recreated on every run",
1105         &members, "https://anglebug.com/7369"
1106     };
1107 
1108     FeatureInfo mergeProgramPipelineCachesToGlobalCache = {
1109         "mergeProgramPipelineCachesToGlobalCache",
1110         FeatureCategory::VulkanWorkarounds,
1111         "Whether it's beneficial to merge the pipeline cache for the shaders subset of the "
1112         "pipeline into the monolithic pipeline cache.  Only useful on platforms where "
1113         "monolithic pipelines can reuse blobs from partial pipelines",
1114         &members, "https://anglebug.com/7369"
1115     };
1116 
1117     FeatureInfo hasEffectivePipelineCacheSerialization = {
1118         "hasEffectivePipelineCacheSerialization",
1119         FeatureCategory::VulkanFeatures,
1120         "Whether the implementation serializes the Vulkan pipeline cache effectively. "
1121         "On some implementations, pipeline cache serialization returns no data, so there "
1122         "is no benefit to serializing it",
1123         &members, "https://anglebug.com/7369"
1124     };
1125 
1126     FeatureInfo enableAsyncPipelineCacheCompression = {
1127         "enableAsyncPipelineCacheCompression",
1128         FeatureCategory::VulkanWorkarounds,
1129         "Enable compressing pipeline cache in a thread.",
1130         &members, "http://anglebug.com/4722"
1131     };
1132 
1133     FeatureInfo supportsPipelineProtectedAccess = {
1134         "supportsPipelineProtectedAccess",
1135         FeatureCategory::VulkanFeatures,
1136         "VkDevice supports the VK_EXT_pipeline_protected_access extension",
1137         &members, "https://anglebug.com/7714"
1138     };
1139 
1140     FeatureInfo supportsMixedReadWriteDepthStencilLayouts = {
1141         "supportsMixedReadWriteDepthStencilLayouts",
1142         FeatureCategory::VulkanFeatures,
1143         "VkDevice supports the mixed read and write depth/stencil layouts introduced by VK_KHR_maintenance2",
1144         &members, "https://anglebug.com/7899"
1145     };
1146 
1147     FeatureInfo supportsSurfaceMaintenance1 = {
1148         "supportsSurfaceMaintenance1",
1149         FeatureCategory::VulkanFeatures,
1150         "VkDevice supports the VK_EXT_surface_maintenance1 extension",
1151         &members, "https://anglebug.com/7847"
1152     };
1153 
1154     FeatureInfo supportsSwapchainMaintenance1 = {
1155         "supportsSwapchainMaintenance1",
1156         FeatureCategory::VulkanFeatures,
1157         "VkDevice supports the VK_EXT_surface_maintenance1 and VK_EXT_swapchain_maintenance1 extensions",
1158         &members, "https://anglebug.com/7847"
1159     };
1160 
1161     FeatureInfo supportsGetMemoryRequirements2 = {
1162         "supportsGetMemoryRequirements2",
1163         FeatureCategory::VulkanFeatures,
1164         "VkDevice supports the VK_KHR_get_memory_requirements2 extension",
1165         &members, "https://anglebug.com/4830"
1166     };
1167 
1168     FeatureInfo supportsBindMemory2 = {
1169         "supportsBindMemory2",
1170         FeatureCategory::VulkanFeatures,
1171         "VkDevice supports the VK_KHR_bind_memory2 extension",
1172         &members, "https://anglebug.com/4966"
1173     };
1174 
1175     FeatureInfo supportsSamplerMirrorClampToEdge = {
1176         "supportsSamplerMirrorClampToEdge",
1177         FeatureCategory::VulkanFeatures,
1178         "VkDevice supports the VK_KHR_sampler_mirror_clamp_to_edge extension",
1179         &members,
1180     };
1181 
1182     FeatureInfo preferSubmitOnAnySamplesPassedQueryEnd = {
1183         "preferSubmitOnAnySamplesPassedQueryEnd",
1184         FeatureCategory::VulkanWorkarounds,
1185         "Submit commands to driver when last GL_ANY_SAMPLES_PASSED query is made for performance improvements.",
1186         &members, "https://issuetracker.google.com/250706693"
1187     };
1188 
1189     FeatureInfo forceWaitForSubmissionToCompleteForQueryResult = {
1190         "forceWaitForSubmissionToCompleteForQueryResult",
1191         FeatureCategory::VulkanWorkarounds,
1192         "Force wait for submission to complete before calling getQueryResult(wait).",
1193         &members, "https://issuetracker.google.com/253522366"
1194     };
1195 
1196     FeatureInfo asyncCommandBufferReset = {
1197         "asyncCommandBufferReset",
1198         FeatureCategory::VulkanFeatures,
1199         "Reset command buffer in async thread.",
1200         &members, "https://issuetracker.google.com/255411748"
1201     };
1202 
1203     FeatureInfo useResetCommandBufferBitForSecondaryPools = {
1204         "useResetCommandBufferBitForSecondaryPools",
1205         FeatureCategory::VulkanWorkarounds,
1206         "Use VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT for initializing "
1207         "SecondaryCommandPools when using VulkanSecondaryCommandBuffer. ",
1208         &members,
1209     };
1210 
1211     FeatureInfo enablePipelineCacheDataCompression = {
1212         "enablePipelineCacheDataCompression",
1213         FeatureCategory::VulkanFeatures,
1214         "enable pipeline cache data compression.",
1215         &members, "https://issuetracker.google.com/258207403"
1216     };
1217 
1218     FeatureInfo supportsLegacyDithering = {
1219         "supportsLegacyDithering",
1220         FeatureCategory::VulkanFeatures,
1221         "VkDevice supports the VK_EXT_legacy_dithering extension",
1222         &members, "https://issuetracker.google.com/284462263"
1223     };
1224 
1225     FeatureInfo limitSampleCountTo2 = {
1226         "limitSampleCountTo2",
1227         FeatureCategory::VulkanWorkarounds,
1228         "Limit sample count to 2 to save memory on low end devices.",
1229         &members, "http://anglebug.com/8162"
1230     };
1231 
1232     FeatureInfo supportsFullScreenExclusive = {
1233         "supportsFullScreenExclusive",
1234         FeatureCategory::VulkanFeatures,
1235         "VkDevice supports the VK_EXT_full_screen_exclusive extension",
1236         &members, "http://anglebug.com/8215"
1237     };
1238 
1239     FeatureInfo forceDisableFullScreenExclusive = {
1240         "forceDisableFullScreenExclusive",
1241         FeatureCategory::VulkanWorkarounds,
1242         "Device needs VK_EXT_full_screen_exclusive explicitly disabled",
1243         &members, "http://anglebug.com/8215"
1244     };
1245 
1246     FeatureInfo supportsPortabilityEnumeration = {
1247         "supportsPortabilityEnumeration",
1248         FeatureCategory::VulkanFeatures,
1249         "Vulkan supports VK_KHR_portability_enumeration extension",
1250         &members, "http://anglebug.com/8229"
1251     };
1252 
1253     FeatureInfo enablePortabilityEnumeration = {
1254         "enablePortabilityEnumeration",
1255         FeatureCategory::VulkanWorkarounds,
1256         "Enable use of VK_KHR_portability_enumeration extension",
1257         &members, "http://anglebug.com/8229"
1258     };
1259 
1260     FeatureInfo supportsTimelineSemaphore = {
1261         "supportsTimelineSemaphore",
1262         FeatureCategory::VulkanFeatures,
1263         "VkDevice supports the VK_KHR_timeline_semaphore extension",
1264         &members,
1265     };
1266 
1267     FeatureInfo supportsFormatFeatureFlags2 = {
1268         "supportsFormatFeatureFlags2",
1269         FeatureCategory::VulkanFeatures,
1270         "VkDevice supports the VK_KHR_format_feature_flags2 extension",
1271         &members,
1272     };
1273 
1274     FeatureInfo supportsHostImageCopy = {
1275         "supportsHostImageCopy",
1276         FeatureCategory::VulkanFeatures,
1277         "VkDevice supports the VK_EXT_host_image_copy extension",
1278         &members,
1279     };
1280 
1281     FeatureInfo allowHostImageCopyDespiteNonIdenticalLayout = {
1282         "allowHostImageCopyDespiteNonIdenticalLayout",
1283         FeatureCategory::VulkanFeatures,
1284         "When using VK_EXT_host_image_copy, allow VK_IMAGE_USAGE_HOST_TRANSFER_BIT_EXT even if"
1285         "perf query indicates only optimalDeviceAccess, but not identicalMemoryLayout",
1286         &members,
1287     };
1288 
1289     FeatureInfo enableParallelCompileAndLink = {
1290         "enableParallelCompileAndLink",
1291         FeatureCategory::VulkanFeatures,
1292         "Expose the GL_KHR_parallel_shader_compile extension",
1293         &members, "http://anglebug.com/8297"
1294     };
1295 
1296     FeatureInfo preferHostCachedForNonStaticBufferUsage = {
1297         "preferHostCachedForNonStaticBufferUsage",
1298         FeatureCategory::VulkanFeatures,
1299         "prefer host cached memory for non static buffer usage",
1300         &members, "https://issuetracker.google.com/288119108"
1301     };
1302 
1303     FeatureInfo supportsExternalFormatResolve = {
1304         "supportsExternalFormatResolve",
1305         FeatureCategory::VulkanFeatures,
1306         "VkDevice supports the VK_ANDROID_external_format_resolve extension",
1307         &members,
1308     };
1309 
1310     FeatureInfo disableSeparateShaderObjects = {
1311         "disableSeparateShaderObjects",
1312         FeatureCategory::VulkanAppWorkarounds,
1313         "Disable GL_EXT_separate_shader_objects and cap core ES version to 3.0",
1314         &members, "https://issuetracker.google.com/309028728"
1315     };
1316 
1317     FeatureInfo forceSampleUsageForAhbBackedImages = {
1318         "forceSampleUsageForAhbBackedImages",
1319         FeatureCategory::VulkanAppWorkarounds,
1320         "Force enable VK_IMAGE_USAGE_SAMPLED_BIT usage for all AHB images",
1321         &members, "https://issuetracker.google.com/155487768"
1322     };
1323 
1324     FeatureInfo avoidOpSelectWithMismatchingRelaxedPrecision = {
1325         "avoidOpSelectWithMismatchingRelaxedPrecision",
1326         FeatureCategory::VulkanWorkarounds,
1327         "On some drivers, the OpSelect SPIR-V instruction with arguments with mismatching "
1328         "RelaxedPrecision decoration causes a crash",
1329         &members, "http://anglebug.com/8503"
1330     };
1331 
1332     FeatureInfo disableDepthStencilResolveThroughAttachment = {
1333         "disableDepthStencilResolveThroughAttachment",
1334         FeatureCategory::VulkanWorkarounds,
1335         "On some drivers, using a depth/stencil resolve attachment results in errors",
1336         &members, "http://anglebug.com/8658"
1337     };
1338 
1339     FeatureInfo limitMaxStorageBufferSize = {
1340         "limitMaxStorageBufferSize",
1341         FeatureCategory::VulkanWorkarounds,
1342         "On some drivers, a storage buffer max size limit is exposed that is incompatible with "
1343         "older hardware",
1344         &members, "http://anglebug.com/345244067"
1345     };
1346 
1347     FeatureInfo clDumpVkSpirv = {
1348         "clDumpVkSpirv",
1349         FeatureCategory::VulkanFeatures,
1350         "Enable SPIR-V dumping at runtime for OpenCL programs compiled with clspv",
1351         &members,
1352     };
1353 
1354     FeatureInfo enableAdditionalBlendFactorsForDithering = {
1355         "enableAdditionalBlendFactorsForDithering",
1356         FeatureCategory::VulkanAppWorkarounds,
1357         "Dithering darkens or brightens pixels depending on coordinates and when repeated "
1358         "sufficient numbers of times this effect becomes visible to users. Conditionally "
1359         "enable additional blend factors for dithering",
1360         &members, "https://issuetracker.google.com/328837151"
1361     };
1362 
1363     FeatureInfo enableMergeClientAttribBuffer = {
1364         "enableMergeClientAttribBuffer",
1365         FeatureCategory::VulkanFeatures,
1366         "Enable merge for client attrib buffer if possible",
1367         &members, "https://issuetracker.google.com/328301788"
1368     };
1369 
1370     FeatureInfo supportsShaderNonSemanticInfo = {
1371         "supportsShaderNonSemanticInfo",
1372         FeatureCategory::VulkanFeatures,
1373         "Enable non-semantic info inside shader module via VK_KHR_shader_non_semantic_info extension",
1374         &members, "http://anglebug.com/8549"
1375     };
1376 
1377     FeatureInfo supports8BitStorageBuffer = {
1378         "supports8BitStorageBuffer",
1379         FeatureCategory::VulkanFeatures,
1380         "VkDevice supports the VK_KHR_8bit_storage extension and has the storageBuffer8BitAccess feature",
1381         &members, "http://anglebug.com/8676"
1382     };
1383 
1384     FeatureInfo supports8BitUniformAndStorageBuffer = {
1385         "supports8BitUniformAndStorageBuffer",
1386         FeatureCategory::VulkanFeatures,
1387         "VkDevice supports the VK_KHR_8bit_storage extension and has the uniformAndStorageBuffer8BitAccess feature",
1388         &members, "http://anglebug.com/8676"
1389     };
1390 
1391     FeatureInfo supports8BitPushConstant = {
1392         "supports8BitPushConstant",
1393         FeatureCategory::VulkanFeatures,
1394         "VkDevice supports the VK_KHR_8bit_storage extension and has the storagePushConstant8 feature",
1395         &members, "http://anglebug.com/8676"
1396     };
1397 
1398     FeatureInfo supports16BitStorageBuffer = {
1399         "supports16BitStorageBuffer",
1400         FeatureCategory::VulkanFeatures,
1401         "VkDevice supports the VK_KHR_16bit_storage extension and has the storageBuffer16BitAccess feature",
1402         &members, "http://anglebug.com/8676"
1403     };
1404 
1405     FeatureInfo supports16BitUniformAndStorageBuffer = {
1406         "supports16BitUniformAndStorageBuffer",
1407         FeatureCategory::VulkanFeatures,
1408         "VkDevice supports the VK_KHR_16bit_storage extension and has the uniformAndStorageBuffer16BitAccess feature",
1409         &members, "http://anglebug.com/8676"
1410     };
1411 
1412     FeatureInfo supports16BitPushConstant = {
1413         "supports16BitPushConstant",
1414         FeatureCategory::VulkanFeatures,
1415         "VkDevice supports the VK_KHR_16bit_storage extension and has the storagePushConstant16 feature",
1416         &members, "http://anglebug.com/8676"
1417     };
1418 
1419     FeatureInfo supports16BitInputOutput = {
1420         "supports16BitInputOutput",
1421         FeatureCategory::VulkanFeatures,
1422         "VkDevice supports the VK_KHR_16bit_storage extension and has the storageInputOutput16 feature",
1423         &members, "http://anglebug.com/8676"
1424     };
1425 
1426     FeatureInfo useVkEventForImageBarrier = {
1427         "useVkEventForImageBarrier",
1428         FeatureCategory::VulkanFeatures,
1429         "Uses VkEvent instead of VkCmdPipelineBarrier for image barriers",
1430         &members, "https://issuetracker.google.com/336844257"
1431     };
1432 
1433     FeatureInfo supportsSynchronization2 = {
1434         "supportsSynchronization2",
1435         FeatureCategory::VulkanFeatures,
1436         "VkDevice supports VK_KHR_synchronization2 extension",
1437         &members, "https://issuetracker.google.com/336844257"
1438     };
1439 
1440     FeatureInfo supportsDynamicRendering = {
1441         "supportsDynamicRendering",
1442         FeatureCategory::VulkanFeatures,
1443         "VkDevice supports VK_KHR_dynamic_rendering extension",
1444         &members, "http://anglebug.com/42267038"
1445     };
1446 
1447     FeatureInfo supportsDynamicRenderingLocalRead = {
1448         "supportsDynamicRenderingLocalRead",
1449         FeatureCategory::VulkanFeatures,
1450         "VkDevice supports VK_KHR_dynamic_rendering_local_read extension",
1451         &members, "http://anglebug.com/42267038"
1452     };
1453 
1454     FeatureInfo preferDynamicRendering = {
1455         "preferDynamicRendering",
1456         FeatureCategory::VulkanFeatures,
1457         "Whether dynamic rendering should be used instead of render pass objects",
1458         &members, "http://anglebug.com/42267038"
1459     };
1460 
1461 };
1462 
1463 inline FeaturesVk::FeaturesVk()  = default;
1464 inline FeaturesVk::~FeaturesVk() = default;
1465 
1466 }  // namespace angle
1467 
1468 #endif  // ANGLE_PLATFORM_AUTOGEN_FEATURESVK_H_
1469