diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -2,6 +2,17 @@
 
 ## WIP
 
+## [3.8] - 2020-11-30
+
+- Bump API version to v1.2.163
+- Add `Vulkan.Requirement`, a module for specifying requirements for `Device`s
+  and `Instance`s
+- Expose SPIR-V Extensions and Capabilities in `Vulkan.SPIRVRequirements`
+- Expose extension dependencies in `Vulkan.Extensions.Dependencies`
+- Squash some warnings
+
+Thanks to @sheaf for their help with this release!
+
 ## [3.7] - 2020-11-24
 - Bump API version to v1.2.162
   - This is a breaking change to anyone using VK_KHR_ray_tracing (which no
diff --git a/package.yaml b/package.yaml
--- a/package.yaml
+++ b/package.yaml
@@ -1,5 +1,5 @@
 name: vulkan
-version: "3.7"
+version: "3.8"
 synopsis: Bindings to the Vulkan graphics API.
 category: Graphics
 maintainer: Joe Hermaszewski <live.long.and.prosper@monoid.al>
diff --git a/src-manual/Vulkan/Requirement.hs b/src-manual/Vulkan/Requirement.hs
new file mode 100644
--- /dev/null
+++ b/src-manual/Vulkan/Requirement.hs
@@ -0,0 +1,163 @@
+{-# LANGUAGE DataKinds               #-}
+{-# LANGUAGE DerivingStrategies      #-}
+{-# LANGUAGE DeriveTraversable       #-}
+{-# LANGUAGE DuplicateRecordFields   #-}
+{-# LANGUAGE FlexibleInstances       #-}
+{-# LANGUAGE GADTs                   #-}
+{-# LANGUAGE MagicHash               #-}
+{-# LANGUAGE NamedFieldPuns          #-}
+{-# LANGUAGE PatternSynonyms         #-}
+{-# LANGUAGE PolyKinds               #-}
+{-# LANGUAGE RecordWildCards         #-}
+{-# LANGUAGE ScopedTypeVariables     #-}
+{-# LANGUAGE Strict                  #-}
+{-# LANGUAGE TypeApplications        #-}
+{-# LANGUAGE TypeFamilies            #-}
+{-# LANGUAGE TypeOperators           #-}
+{-# LANGUAGE UndecidableInstances    #-}
+{-# LANGUAGE UndecidableSuperClasses #-}
+
+module Vulkan.Requirement
+  ( -- * Vulkan requirements
+    InstanceRequirement(..)
+  , DeviceRequirement(..)
+  , -- * Utility functionality for handling structure chains
+    KnownFeatureStruct(..)
+  , KnownPropertyStruct(..)
+  , SFeatureStruct(..)
+  , SPropertyStruct(..)
+  ) where
+
+-- base
+import Data.Typeable
+  ( Typeable )
+import Data.Word
+  ( Word32 )
+
+-- bytestring
+import Data.ByteString
+  ( ByteString )
+
+-- vulkan
+import Vulkan.Core10.Device
+  ( DeviceCreateInfo(..)
+  )
+import Vulkan.Core10.DeviceInitialization
+  ( PhysicalDeviceFeatures, PhysicalDeviceProperties
+  )
+import Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2
+    ( PhysicalDeviceFeatures2(..), PhysicalDeviceProperties2(..) )
+import Vulkan.CStruct
+  ( FromCStruct, ToCStruct )
+import Vulkan.CStruct.Extends
+  ( Extends )
+import Vulkan.Zero
+
+----------------------------------------------------------------
+-- Instance Requirements
+----------------------------------------------------------------
+
+-- | A requirement on a Vulkan 'Instance'.
+data InstanceRequirement where
+  -- | Require a minimum Vulkan instance version.
+  RequireInstanceVersion
+    :: { version :: Word32 }
+    -> InstanceRequirement
+  -- | Require a Vulkan layer.
+  RequireInstanceLayer
+    :: { instanceLayerName       :: ByteString
+       , instanceLayerMinVersion :: Word32
+         -- ^ The 'implementationVersion' of the layer must meet or exceed this
+         -- version
+       }
+    -> InstanceRequirement
+  -- | Require a Vulkan instance extension.
+  RequireInstanceExtension
+    :: { instanceExtensionLayerName  :: Maybe ByteString
+       , instanceExtensionName       :: ByteString
+       , instanceExtensionMinVersion :: Word32
+       }
+    -> InstanceRequirement
+
+----------------------------------------------------------------
+-- Device Requirements
+----------------------------------------------------------------
+
+-- A requirement on a Vulkan 'PhysicalDevice'.
+data DeviceRequirement where
+  -- | Require a minimum device version.
+  RequireDeviceVersion
+    :: { version :: Word32 }
+    -> DeviceRequirement
+  -- | Require a Vulkan physical device feature.
+  RequireDeviceFeature
+    :: forall struct
+    .  KnownFeatureStruct struct
+    => { featureName   :: ByteString
+       , checkFeature  :: struct -> Bool
+       , enableFeature :: struct -> struct
+       }
+    -> DeviceRequirement
+  -- | Require a Vulkan physical device property.
+  RequireDeviceProperty
+    :: forall struct
+    .  KnownPropertyStruct struct
+    => { propertyName  :: ByteString
+       , checkProperty :: struct -> Bool
+       }
+    -> DeviceRequirement
+  -- | Require a Vulkan device extension.
+  RequireDeviceExtension
+    :: { deviceExtensionLayerName  :: Maybe ByteString
+       , deviceExtensionName       :: ByteString
+       , deviceExtensionMinVersion :: Word32
+       }
+    -> DeviceRequirement
+
+-- | Singleton for a Vulkan structure that can appear in 'PhysicalDeviceFeatures2'.
+--
+-- It is either 'PhysicalDeviceFeatures', or it 'Extends' 'PhysicalDeviceFeatures2'.
+data SFeatureStruct feat where
+  BasicFeatureStruct
+    :: SFeatureStruct PhysicalDeviceFeatures
+  ExtendedFeatureStruct
+    :: ( Show feat
+       , Extends PhysicalDeviceFeatures2 feat, Extends DeviceCreateInfo feat
+       , Zero feat, FromCStruct feat, ToCStruct feat
+       )
+    => SFeatureStruct feat
+
+-- | A Vulkan structure that can appear in 'PhysicalDeviceFeatures2'.
+class Typeable feat => KnownFeatureStruct feat where
+  sFeatureStruct :: SFeatureStruct feat
+
+instance KnownFeatureStruct PhysicalDeviceFeatures where
+  sFeatureStruct = BasicFeatureStruct
+
+instance {-# OVERLAPPABLE #-}
+         ( Typeable feat, Show feat
+         , Extends PhysicalDeviceFeatures2 feat, Extends DeviceCreateInfo feat
+         , Zero feat, FromCStruct feat, ToCStruct feat
+         )
+      => KnownFeatureStruct feat where
+  sFeatureStruct = ExtendedFeatureStruct
+
+-- | Singleton for a Vulkan structure that can appear in 'PhysicalDeviceProperties2'.
+--
+-- It is either 'PhysicalDeviceProperties', or it 'Extends' 'PhysicalDeviceProperties2'.
+data SPropertyStruct prop where
+  BasicPropertyStruct
+    :: SPropertyStruct PhysicalDeviceProperties
+  ExtendedPropertyStruct
+    :: ( Typeable prop, Extends PhysicalDeviceProperties2 prop, FromCStruct prop, ToCStruct prop )
+    => SPropertyStruct prop
+
+-- | A Vulkan structure that can appear in 'PhysicalDeviceProperties2'.
+class Typeable prop => KnownPropertyStruct prop where
+  sPropertyStruct :: SPropertyStruct prop
+instance KnownPropertyStruct PhysicalDeviceProperties where
+  sPropertyStruct = BasicPropertyStruct
+instance {-# OVERLAPPABLE #-}
+         ( Typeable prop, Extends PhysicalDeviceProperties2 prop, FromCStruct prop, ToCStruct prop )
+       => KnownPropertyStruct prop where
+  sPropertyStruct = ExtendedPropertyStruct
diff --git a/src/Vulkan.hs b/src/Vulkan.hs
--- a/src/Vulkan.hs
+++ b/src/Vulkan.hs
@@ -6,6 +6,7 @@
                , module Vulkan.Core12
                , module Vulkan.Extensions
                , module Vulkan.NamedType
+               , module Vulkan.SPIRVRequirements
                , module Vulkan.Version
                , module Vulkan.Zero
                ) where
@@ -15,6 +16,7 @@
 import Vulkan.Core12
 import Vulkan.Extensions
 import Vulkan.NamedType
+import Vulkan.SPIRVRequirements
 import Vulkan.Version
 import Vulkan.Zero
 
diff --git a/src/Vulkan/Extensions.hs b/src/Vulkan/Extensions.hs
--- a/src/Vulkan/Extensions.hs
+++ b/src/Vulkan/Extensions.hs
@@ -1,6 +1,7 @@
 {-# language CPP #-}
 -- No documentation found for Chapter "Extensions"
-module Vulkan.Extensions  ( module Vulkan.Extensions.Handles
+module Vulkan.Extensions  ( module Vulkan.Extensions.Dependencies
+                          , module Vulkan.Extensions.Handles
                           , module Vulkan.Extensions.VK_AMD_buffer_marker
                           , module Vulkan.Extensions.VK_AMD_device_coherent_memory
                           , module Vulkan.Extensions.VK_AMD_display_native_hdr
@@ -223,6 +224,7 @@
                           , module Vulkan.Extensions.VK_QCOM_render_pass_transform
                           , module Vulkan.Extensions.VK_QCOM_rotated_copy_commands
                           ) where
+import Vulkan.Extensions.Dependencies
 import Vulkan.Extensions.Handles
 import Vulkan.Extensions.VK_AMD_buffer_marker
 import Vulkan.Extensions.VK_AMD_device_coherent_memory
diff --git a/src/Vulkan/Extensions/Dependencies.hs b/src/Vulkan/Extensions/Dependencies.hs
new file mode 100644
--- /dev/null
+++ b/src/Vulkan/Extensions/Dependencies.hs
@@ -0,0 +1,481 @@
+{-# language CPP #-}
+-- No documentation found for Chapter "Dependencies"
+module Vulkan.Extensions.Dependencies  () where
+
+import Data.Word (Word32)
+import Data.ByteString (ByteString)
+import Vulkan.NamedType ((:::))
+import Vulkan.Extensions.VK_AMD_display_native_hdr (pattern AMD_DISPLAY_NATIVE_HDR_EXTENSION_NAME)
+import Vulkan.Extensions.VK_AMD_shader_core_properties2 (pattern AMD_SHADER_CORE_PROPERTIES_2_EXTENSION_NAME)
+import Vulkan.Extensions.VK_AMD_shader_core_properties (pattern AMD_SHADER_CORE_PROPERTIES_EXTENSION_NAME)
+import Vulkan.Extensions.VK_AMD_texture_gather_bias_lod (pattern AMD_TEXTURE_GATHER_BIAS_LOD_EXTENSION_NAME)
+import Vulkan.Extensions.VK_ANDROID_external_memory_android_hardware_buffer (pattern ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME)
+import Vulkan.Core10 (pattern API_VERSION_1_0)
+import Vulkan.Extensions.VK_EXT_4444_formats (pattern EXT_4444_FORMATS_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_acquire_xlib_display (pattern EXT_ACQUIRE_XLIB_DISPLAY_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_astc_decode_mode (pattern EXT_ASTC_DECODE_MODE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_buffer_device_address (pattern EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_conservative_rasterization (pattern EXT_CONSERVATIVE_RASTERIZATION_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_debug_marker (pattern EXT_DEBUG_MARKER_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_debug_report (pattern EXT_DEBUG_REPORT_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_descriptor_indexing (pattern EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_device_memory_report (pattern EXT_DEVICE_MEMORY_REPORT_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_directfb_surface (pattern EXT_DIRECTFB_SURFACE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_direct_mode_display (pattern EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_discard_rectangles (pattern EXT_DISCARD_RECTANGLES_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_display_control (pattern EXT_DISPLAY_CONTROL_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_display_surface_counter (pattern EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_extended_dynamic_state (pattern EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_external_memory_dma_buf (pattern EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_external_memory_host (pattern EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_fragment_density_map2 (pattern EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_fragment_density_map (pattern EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_fragment_shader_interlock (pattern EXT_FRAGMENT_SHADER_INTERLOCK_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_full_screen_exclusive (pattern EXT_FULL_SCREEN_EXCLUSIVE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_hdr_metadata (pattern EXT_HDR_METADATA_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_headless_surface (pattern EXT_HEADLESS_SURFACE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_host_query_reset (pattern EXT_HOST_QUERY_RESET_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_image_drm_format_modifier (pattern EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_image_robustness (pattern EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_inline_uniform_block (pattern EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_line_rasterization (pattern EXT_LINE_RASTERIZATION_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_memory_budget (pattern EXT_MEMORY_BUDGET_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_memory_priority (pattern EXT_MEMORY_PRIORITY_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_metal_surface (pattern EXT_METAL_SURFACE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_pci_bus_info (pattern EXT_PCI_BUS_INFO_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_queue_family_foreign (pattern EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_sampler_filter_minmax (pattern EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_sample_locations (pattern EXT_SAMPLE_LOCATIONS_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_scalar_block_layout (pattern EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_shader_atomic_float (pattern EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_shader_demote_to_helper_invocation (pattern EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_shader_image_atomic_int64 (pattern EXT_SHADER_IMAGE_ATOMIC_INT64_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_subgroup_size_control (pattern EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_swapchain_colorspace (pattern EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_texel_buffer_alignment (pattern EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_texture_compression_astc_hdr (pattern EXT_TEXTURE_COMPRESSION_ASTC_HDR_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_transform_feedback (pattern EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_vertex_attribute_divisor (pattern EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_ycbcr_image_arrays (pattern EXT_YCBCR_IMAGE_ARRAYS_EXTENSION_NAME)
+import Vulkan.Extensions.VK_FUCHSIA_imagepipe_surface (pattern FUCHSIA_IMAGEPIPE_SURFACE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_GGP_frame_token (pattern GGP_FRAME_TOKEN_EXTENSION_NAME)
+import Vulkan.Extensions.VK_GGP_stream_descriptor_surface (pattern GGP_STREAM_DESCRIPTOR_SURFACE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_GOOGLE_display_timing (pattern GOOGLE_DISPLAY_TIMING_EXTENSION_NAME)
+import Vulkan.Extensions.VK_INTEL_shader_integer_functions2 (pattern INTEL_SHADER_INTEGER_FUNCTIONS_2_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_16bit_storage (pattern KHR_16BIT_STORAGE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_8bit_storage (pattern KHR_8BIT_STORAGE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_acceleration_structure (pattern KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_android_surface (pattern KHR_ANDROID_SURFACE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_bind_memory2 (pattern KHR_BIND_MEMORY_2_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_buffer_device_address (pattern KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_copy_commands2 (pattern KHR_COPY_COMMANDS_2_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_create_renderpass2 (pattern KHR_CREATE_RENDERPASS_2_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_dedicated_allocation (pattern KHR_DEDICATED_ALLOCATION_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_deferred_host_operations (pattern KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_depth_stencil_resolve (pattern KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_device_group_creation (pattern KHR_DEVICE_GROUP_CREATION_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_device_group (pattern KHR_DEVICE_GROUP_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_display (pattern KHR_DISPLAY_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_display_swapchain (pattern KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_driver_properties (pattern KHR_DRIVER_PROPERTIES_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_external_fence_capabilities (pattern KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_external_fence (pattern KHR_EXTERNAL_FENCE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_external_fence_fd (pattern KHR_EXTERNAL_FENCE_FD_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_external_fence_win32 (pattern KHR_EXTERNAL_FENCE_WIN32_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_external_memory_capabilities (pattern KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_external_memory (pattern KHR_EXTERNAL_MEMORY_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_external_memory_fd (pattern KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_external_memory_win32 (pattern KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_external_semaphore_capabilities (pattern KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_external_semaphore (pattern KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_external_semaphore_fd (pattern KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_external_semaphore_win32 (pattern KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_fragment_shading_rate (pattern KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_get_display_properties2 (pattern KHR_GET_DISPLAY_PROPERTIES_2_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_get_memory_requirements2 (pattern KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_get_physical_device_properties2 (pattern KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_get_surface_capabilities2 (pattern KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_imageless_framebuffer (pattern KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_image_format_list (pattern KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_incremental_present (pattern KHR_INCREMENTAL_PRESENT_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_maintenance1 (pattern KHR_MAINTENANCE1_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_maintenance2 (pattern KHR_MAINTENANCE2_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_maintenance3 (pattern KHR_MAINTENANCE3_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_multiview (pattern KHR_MULTIVIEW_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_performance_query (pattern KHR_PERFORMANCE_QUERY_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_pipeline_executable_properties (pattern KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_portability_subset (pattern KHR_PORTABILITY_SUBSET_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_push_descriptor (pattern KHR_PUSH_DESCRIPTOR_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_ray_query (pattern KHR_RAY_QUERY_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_ray_tracing_pipeline (pattern KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_sampler_ycbcr_conversion (pattern KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_separate_depth_stencil_layouts (pattern KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_shader_atomic_int64 (pattern KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_shader_clock (pattern KHR_SHADER_CLOCK_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_shader_float16_int8 (pattern KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_shader_float_controls (pattern KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_shader_subgroup_extended_types (pattern KHR_SHADER_SUBGROUP_EXTENDED_TYPES_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_shader_terminate_invocation (pattern KHR_SHADER_TERMINATE_INVOCATION_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_shared_presentable_image (pattern KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_spirv_1_4 (pattern KHR_SPIRV_1_4_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_storage_buffer_storage_class (pattern KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_surface (pattern KHR_SURFACE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_surface_protected_capabilities (pattern KHR_SURFACE_PROTECTED_CAPABILITIES_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_swapchain (pattern KHR_SWAPCHAIN_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_swapchain_mutable_format (pattern KHR_SWAPCHAIN_MUTABLE_FORMAT_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_timeline_semaphore (pattern KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_uniform_buffer_standard_layout (pattern KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_variable_pointers (pattern KHR_VARIABLE_POINTERS_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_wayland_surface (pattern KHR_WAYLAND_SURFACE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_win32_keyed_mutex (pattern KHR_WIN32_KEYED_MUTEX_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_win32_surface (pattern KHR_WIN32_SURFACE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_xcb_surface (pattern KHR_XCB_SURFACE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_xlib_surface (pattern KHR_XLIB_SURFACE_EXTENSION_NAME)
+import Vulkan.Version (pattern MAKE_VERSION)
+import Vulkan.Extensions.VK_MVK_ios_surface (pattern MVK_IOS_SURFACE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_MVK_macos_surface (pattern MVK_MACOS_SURFACE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NN_vi_surface (pattern NN_VI_SURFACE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NVX_multiview_per_view_attributes (pattern NVX_MULTIVIEW_PER_VIEW_ATTRIBUTES_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_compute_shader_derivatives (pattern NV_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_cooperative_matrix (pattern NV_COOPERATIVE_MATRIX_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_corner_sampled_image (pattern NV_CORNER_SAMPLED_IMAGE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_coverage_reduction_mode (pattern NV_COVERAGE_REDUCTION_MODE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_dedicated_allocation_image_aliasing (pattern NV_DEDICATED_ALLOCATION_IMAGE_ALIASING_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_device_diagnostics_config (pattern NV_DEVICE_DIAGNOSTICS_CONFIG_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_device_diagnostic_checkpoints (pattern NV_DEVICE_DIAGNOSTIC_CHECKPOINTS_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_device_generated_commands (pattern NV_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_external_memory_capabilities (pattern NV_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_external_memory (pattern NV_EXTERNAL_MEMORY_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_external_memory_win32 (pattern NV_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_fragment_shader_barycentric (pattern NV_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_fragment_shading_rate_enums (pattern NV_FRAGMENT_SHADING_RATE_ENUMS_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_framebuffer_mixed_samples (pattern NV_FRAMEBUFFER_MIXED_SAMPLES_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_mesh_shader (pattern NV_MESH_SHADER_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_ray_tracing (pattern NV_RAY_TRACING_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_scissor_exclusive (pattern NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_shader_image_footprint (pattern NV_SHADER_IMAGE_FOOTPRINT_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_shader_sm_builtins (pattern NV_SHADER_SM_BUILTINS_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_shader_subgroup_partitioned (pattern NV_SHADER_SUBGROUP_PARTITIONED_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_shading_rate_image (pattern NV_SHADING_RATE_IMAGE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_win32_keyed_mutex (pattern NV_WIN32_KEYED_MUTEX_EXTENSION_NAME)
+import Vulkan.Extensions.VK_QCOM_render_pass_transform (pattern QCOM_RENDER_PASS_TRANSFORM_EXTENSION_NAME)
+import Vulkan.Extensions.VK_QCOM_rotated_copy_commands (pattern QCOM_rotated_copy_commands_EXTENSION_NAME)
+-- | The set of other extensions required to use this extension
+extensionDependencies :: ("extensionName" ::: ByteString) -> [ByteString]
+extensionDependencies = \case
+  KHR_SWAPCHAIN_EXTENSION_NAME -> [KHR_SURFACE_EXTENSION_NAME]
+  KHR_DISPLAY_EXTENSION_NAME   -> [KHR_SURFACE_EXTENSION_NAME]
+  KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME ->
+    [KHR_SWAPCHAIN_EXTENSION_NAME, KHR_DISPLAY_EXTENSION_NAME, KHR_SURFACE_EXTENSION_NAME]
+  KHR_XLIB_SURFACE_EXTENSION_NAME              -> [KHR_SURFACE_EXTENSION_NAME]
+  KHR_XCB_SURFACE_EXTENSION_NAME               -> [KHR_SURFACE_EXTENSION_NAME]
+  KHR_WAYLAND_SURFACE_EXTENSION_NAME           -> [KHR_SURFACE_EXTENSION_NAME]
+  KHR_ANDROID_SURFACE_EXTENSION_NAME           -> [KHR_SURFACE_EXTENSION_NAME]
+  KHR_WIN32_SURFACE_EXTENSION_NAME             -> [KHR_SURFACE_EXTENSION_NAME]
+  EXT_DEBUG_MARKER_EXTENSION_NAME              -> [EXT_DEBUG_REPORT_EXTENSION_NAME]
+  EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME        -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  AMD_TEXTURE_GATHER_BIAS_LOD_EXTENSION_NAME   -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  GGP_STREAM_DESCRIPTOR_SURFACE_EXTENSION_NAME -> [KHR_SURFACE_EXTENSION_NAME]
+  NV_CORNER_SAMPLED_IMAGE_EXTENSION_NAME       -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  KHR_MULTIVIEW_EXTENSION_NAME                 -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  NV_EXTERNAL_MEMORY_EXTENSION_NAME            -> [NV_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME]
+  NV_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME ->
+    [NV_EXTERNAL_MEMORY_EXTENSION_NAME, NV_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME]
+  NV_WIN32_KEYED_MUTEX_EXTENSION_NAME ->
+    [ NV_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME
+    , NV_EXTERNAL_MEMORY_EXTENSION_NAME
+    , NV_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME
+    ]
+  KHR_DEVICE_GROUP_EXTENSION_NAME                 -> [KHR_DEVICE_GROUP_CREATION_EXTENSION_NAME]
+  NN_VI_SURFACE_EXTENSION_NAME                    -> [KHR_SURFACE_EXTENSION_NAME]
+  EXT_TEXTURE_COMPRESSION_ASTC_HDR_EXTENSION_NAME -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  EXT_ASTC_DECODE_MODE_EXTENSION_NAME             -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  KHR_EXTERNAL_MEMORY_EXTENSION_NAME ->
+    [KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME ->
+    [ KHR_EXTERNAL_MEMORY_EXTENSION_NAME
+    , KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME
+    , KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+    ]
+  KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME ->
+    [ KHR_EXTERNAL_MEMORY_EXTENSION_NAME
+    , KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME
+    , KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+    ]
+  KHR_WIN32_KEYED_MUTEX_EXTENSION_NAME ->
+    [ KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME
+    , KHR_EXTERNAL_MEMORY_EXTENSION_NAME
+    , KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME
+    , KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+    ]
+  KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME ->
+    [KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME ->
+    [ KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME
+    , KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME
+    , KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+    ]
+  KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME ->
+    [ KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME
+    , KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME
+    , KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+    ]
+  KHR_PUSH_DESCRIPTOR_EXTENSION_NAME     -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  KHR_16BIT_STORAGE_EXTENSION_NAME ->
+    [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME]
+  KHR_INCREMENTAL_PRESENT_EXTENSION_NAME -> [KHR_SWAPCHAIN_EXTENSION_NAME, KHR_SURFACE_EXTENSION_NAME]
+  EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME -> [KHR_DISPLAY_EXTENSION_NAME, KHR_SURFACE_EXTENSION_NAME]
+  EXT_ACQUIRE_XLIB_DISPLAY_EXTENSION_NAME ->
+    [EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME, KHR_DISPLAY_EXTENSION_NAME, KHR_SURFACE_EXTENSION_NAME]
+  EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME -> [KHR_DISPLAY_EXTENSION_NAME, KHR_SURFACE_EXTENSION_NAME]
+  EXT_DISPLAY_CONTROL_EXTENSION_NAME ->
+    [ EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME
+    , KHR_SWAPCHAIN_EXTENSION_NAME
+    , KHR_DISPLAY_EXTENSION_NAME
+    , KHR_SURFACE_EXTENSION_NAME
+    ]
+  GOOGLE_DISPLAY_TIMING_EXTENSION_NAME -> [KHR_SWAPCHAIN_EXTENSION_NAME, KHR_SURFACE_EXTENSION_NAME]
+  NVX_MULTIVIEW_PER_VIEW_ATTRIBUTES_EXTENSION_NAME ->
+    [KHR_MULTIVIEW_EXTENSION_NAME, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  EXT_DISCARD_RECTANGLES_EXTENSION_NAME         -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  EXT_CONSERVATIVE_RASTERIZATION_EXTENSION_NAME -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME      -> [KHR_SURFACE_EXTENSION_NAME]
+  EXT_HDR_METADATA_EXTENSION_NAME               -> [KHR_SWAPCHAIN_EXTENSION_NAME, KHR_SURFACE_EXTENSION_NAME]
+  KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME -> [KHR_MAINTENANCE2_EXTENSION_NAME, KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME]
+  KHR_CREATE_RENDERPASS_2_EXTENSION_NAME ->
+    [KHR_MULTIVIEW_EXTENSION_NAME, KHR_MAINTENANCE2_EXTENSION_NAME, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME ->
+    [ KHR_SWAPCHAIN_EXTENSION_NAME
+    , KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+    , KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME
+    , KHR_SURFACE_EXTENSION_NAME
+    ]
+  KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  KHR_EXTERNAL_FENCE_EXTENSION_NAME ->
+    [KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  KHR_EXTERNAL_FENCE_WIN32_EXTENSION_NAME ->
+    [ KHR_EXTERNAL_FENCE_EXTENSION_NAME
+    , KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME
+    , KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+    ]
+  KHR_EXTERNAL_FENCE_FD_EXTENSION_NAME ->
+    [ KHR_EXTERNAL_FENCE_EXTENSION_NAME
+    , KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME
+    , KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+    ]
+  KHR_PERFORMANCE_QUERY_EXTENSION_NAME          -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME -> [KHR_SURFACE_EXTENSION_NAME]
+  KHR_VARIABLE_POINTERS_EXTENSION_NAME ->
+    [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME]
+  KHR_GET_DISPLAY_PROPERTIES_2_EXTENSION_NAME -> [KHR_DISPLAY_EXTENSION_NAME, KHR_SURFACE_EXTENSION_NAME]
+  MVK_IOS_SURFACE_EXTENSION_NAME              -> [KHR_SURFACE_EXTENSION_NAME]
+  MVK_MACOS_SURFACE_EXTENSION_NAME            -> [KHR_SURFACE_EXTENSION_NAME]
+  EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME ->
+    [ KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME
+    , KHR_EXTERNAL_MEMORY_EXTENSION_NAME
+    , KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME
+    , KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+    ]
+  EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME ->
+    [ KHR_EXTERNAL_MEMORY_EXTENSION_NAME
+    , KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME
+    , KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+    ]
+  KHR_DEDICATED_ALLOCATION_EXTENSION_NAME -> [KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME]
+  ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME ->
+    [ KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME
+    , KHR_EXTERNAL_MEMORY_EXTENSION_NAME
+    , EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME
+    , KHR_DEDICATED_ALLOCATION_EXTENSION_NAME
+    , KHR_MAINTENANCE1_EXTENSION_NAME
+    , KHR_BIND_MEMORY_2_EXTENSION_NAME
+    , KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME
+    , KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+    , KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME
+    ]
+  EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME ->
+    [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, KHR_MAINTENANCE1_EXTENSION_NAME]
+  EXT_SAMPLE_LOCATIONS_EXTENSION_NAME -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME ->
+    [ EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME
+    , KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME
+    , KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME
+    , KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+    , KHR_MAINTENANCE3_EXTENSION_NAME
+    ]
+  KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME ->
+    [ KHR_SPIRV_1_4_EXTENSION_NAME
+    , KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME
+    , KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME
+    , KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+    , EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME
+    , KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME
+    , KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME
+    , KHR_MAINTENANCE3_EXTENSION_NAME
+    ]
+  KHR_RAY_QUERY_EXTENSION_NAME ->
+    [ KHR_SPIRV_1_4_EXTENSION_NAME
+    , KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME
+    , KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME
+    , KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+    , EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME
+    , KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME
+    , KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME
+    , KHR_MAINTENANCE3_EXTENSION_NAME
+    ]
+  KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME ->
+    [ KHR_MAINTENANCE1_EXTENSION_NAME
+    , KHR_BIND_MEMORY_2_EXTENSION_NAME
+    , KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME
+    , KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+    ]
+  EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME ->
+    [ KHR_BIND_MEMORY_2_EXTENSION_NAME
+    , KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+    , KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME
+    , KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME
+    , KHR_MAINTENANCE1_EXTENSION_NAME
+    , KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME
+    ]
+  EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME ->
+    [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, KHR_MAINTENANCE3_EXTENSION_NAME]
+  KHR_PORTABILITY_SUBSET_EXTENSION_NAME -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  NV_SHADING_RATE_IMAGE_EXTENSION_NAME  -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  NV_RAY_TRACING_EXTENSION_NAME ->
+    [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME]
+  KHR_MAINTENANCE3_EXTENSION_NAME -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  KHR_8BIT_STORAGE_EXTENSION_NAME ->
+    [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME]
+  EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME ->
+    [ KHR_EXTERNAL_MEMORY_EXTENSION_NAME
+    , KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME
+    , KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+    ]
+  KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME      -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  KHR_SHADER_CLOCK_EXTENSION_NAME             -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  AMD_SHADER_CORE_PROPERTIES_EXTENSION_NAME   -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  GGP_FRAME_TOKEN_EXTENSION_NAME ->
+    [KHR_SWAPCHAIN_EXTENSION_NAME, GGP_STREAM_DESCRIPTOR_SURFACE_EXTENSION_NAME, KHR_SURFACE_EXTENSION_NAME]
+  KHR_DRIVER_PROPERTIES_EXTENSION_NAME     -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME ->
+    [ KHR_CREATE_RENDERPASS_2_EXTENSION_NAME
+    , KHR_MULTIVIEW_EXTENSION_NAME
+    , KHR_MAINTENANCE2_EXTENSION_NAME
+    , KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+    ]
+  KHR_SWAPCHAIN_MUTABLE_FORMAT_EXTENSION_NAME ->
+    [ KHR_SWAPCHAIN_EXTENSION_NAME
+    , KHR_MAINTENANCE2_EXTENSION_NAME
+    , KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME
+    , KHR_SURFACE_EXTENSION_NAME
+    ]
+  NV_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME    -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  NV_MESH_SHADER_EXTENSION_NAME                   -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  NV_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME   -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  NV_SHADER_IMAGE_FOOTPRINT_EXTENSION_NAME        -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME             -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  NV_DEVICE_DIAGNOSTIC_CHECKPOINTS_EXTENSION_NAME -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME           -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  INTEL_SHADER_INTEGER_FUNCTIONS_2_EXTENSION_NAME -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  EXT_PCI_BUS_INFO_EXTENSION_NAME                 -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  AMD_DISPLAY_NATIVE_HDR_EXTENSION_NAME ->
+    [ KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+    , KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME
+    , KHR_SWAPCHAIN_EXTENSION_NAME
+    , KHR_SURFACE_EXTENSION_NAME
+    ]
+  FUCHSIA_IMAGEPIPE_SURFACE_EXTENSION_NAME       -> [KHR_SURFACE_EXTENSION_NAME]
+  KHR_SHADER_TERMINATE_INVOCATION_EXTENSION_NAME -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  EXT_METAL_SURFACE_EXTENSION_NAME               -> [KHR_SURFACE_EXTENSION_NAME]
+  EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME        -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME         -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME ->
+    [ KHR_CREATE_RENDERPASS_2_EXTENSION_NAME
+    , KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+    , KHR_MULTIVIEW_EXTENSION_NAME
+    , KHR_MAINTENANCE2_EXTENSION_NAME
+    ]
+  AMD_SHADER_CORE_PROPERTIES_2_EXTENSION_NAME ->
+    [AMD_SHADER_CORE_PROPERTIES_EXTENSION_NAME, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  EXT_SHADER_IMAGE_ATOMIC_INT64_EXTENSION_NAME -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  KHR_SPIRV_1_4_EXTENSION_NAME ->
+    [KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  EXT_MEMORY_BUDGET_EXTENSION_NAME   -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  EXT_MEMORY_PRIORITY_EXTENSION_NAME -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  KHR_SURFACE_PROTECTED_CAPABILITIES_EXTENSION_NAME ->
+    [KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME, KHR_SURFACE_EXTENSION_NAME]
+  NV_DEDICATED_ALLOCATION_IMAGE_ALIASING_EXTENSION_NAME ->
+    [KHR_DEDICATED_ALLOCATION_EXTENSION_NAME, KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME]
+  KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_EXTENSION_NAME ->
+    [ KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+    , KHR_CREATE_RENDERPASS_2_EXTENSION_NAME
+    , KHR_MULTIVIEW_EXTENSION_NAME
+    , KHR_MAINTENANCE2_EXTENSION_NAME
+    ]
+  EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME     -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  NV_COOPERATIVE_MATRIX_EXTENSION_NAME         -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  NV_COVERAGE_REDUCTION_MODE_EXTENSION_NAME    -> [NV_FRAMEBUFFER_MIXED_SAMPLES_EXTENSION_NAME]
+  EXT_FRAGMENT_SHADER_INTERLOCK_EXTENSION_NAME -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  EXT_YCBCR_IMAGE_ARRAYS_EXTENSION_NAME ->
+    [ KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME
+    , KHR_MAINTENANCE1_EXTENSION_NAME
+    , KHR_BIND_MEMORY_2_EXTENSION_NAME
+    , KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME
+    , KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+    ]
+  KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  EXT_FULL_SCREEN_EXCLUSIVE_EXTENSION_NAME ->
+    [ KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+    , KHR_SURFACE_EXTENSION_NAME
+    , KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME
+    , KHR_SWAPCHAIN_EXTENSION_NAME
+    ]
+  EXT_HEADLESS_SURFACE_EXTENSION_NAME                   -> [KHR_SURFACE_EXTENSION_NAME]
+  KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME              -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  EXT_LINE_RASTERIZATION_EXTENSION_NAME                 -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME                -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  EXT_HOST_QUERY_RESET_EXTENSION_NAME                   -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME             -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME     -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME             -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  QCOM_RENDER_PASS_TRANSFORM_EXTENSION_NAME             -> [KHR_SWAPCHAIN_EXTENSION_NAME, KHR_SURFACE_EXTENSION_NAME]
+  EXT_DEVICE_MEMORY_REPORT_EXTENSION_NAME               -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  NV_DEVICE_DIAGNOSTICS_CONFIG_EXTENSION_NAME           -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  NV_FRAGMENT_SHADING_RATE_ENUMS_EXTENSION_NAME ->
+    [ KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME
+    , KHR_CREATE_RENDERPASS_2_EXTENSION_NAME
+    , KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+    , KHR_MULTIVIEW_EXTENSION_NAME
+    , KHR_MAINTENANCE2_EXTENSION_NAME
+    ]
+  EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME ->
+    [EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  QCOM_rotated_copy_commands_EXTENSION_NAME ->
+    [KHR_SWAPCHAIN_EXTENSION_NAME, KHR_COPY_COMMANDS_2_EXTENSION_NAME, KHR_SURFACE_EXTENSION_NAME]
+  EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  EXT_4444_FORMATS_EXTENSION_NAME -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  EXT_DIRECTFB_SURFACE_EXTENSION_NAME -> [KHR_SURFACE_EXTENSION_NAME]
+  _                               -> []
+
+-- | The minimum required API version to use this extension
+extensionCoreRequirement :: ("extensionName" ::: ByteString) -> Word32
+extensionCoreRequirement = \case
+  KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME -> MAKE_VERSION 1 1 0
+  KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME -> MAKE_VERSION 1 1 0
+  KHR_RAY_QUERY_EXTENSION_NAME -> MAKE_VERSION 1 1 0
+  NV_SHADER_SM_BUILTINS_EXTENSION_NAME -> MAKE_VERSION 1 1 0
+  KHR_SHADER_SUBGROUP_EXTENDED_TYPES_EXTENSION_NAME -> MAKE_VERSION 1 1 0
+  NV_SHADER_SUBGROUP_PARTITIONED_EXTENSION_NAME -> MAKE_VERSION 1 1 0
+  EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME -> MAKE_VERSION 1 1 0
+  KHR_SPIRV_1_4_EXTENSION_NAME -> MAKE_VERSION 1 1 0
+  KHR_SURFACE_PROTECTED_CAPABILITIES_EXTENSION_NAME -> MAKE_VERSION 1 1 0
+  NV_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME -> MAKE_VERSION 1 1 0
+  _                            -> API_VERSION_1_0
+
diff --git a/src/Vulkan/Extensions/VK_EXT_private_data.hs b/src/Vulkan/Extensions/VK_EXT_private_data.hs
--- a/src/Vulkan/Extensions/VK_EXT_private_data.hs
+++ b/src/Vulkan/Extensions/VK_EXT_private_data.hs
@@ -490,8 +490,8 @@
                      -- the type of object data is associated with.
                      --
                      -- #VUID-vkGetPrivateDataEXT-objectType-04018# @objectType@ /must/ be
-                     -- 'Vulkan.Core10.Handles.Device' or an object type whose parent is
-                     -- 'Vulkan.Core10.Handles.Device'
+                     -- 'Vulkan.Core10.Enums.ObjectType.OBJECT_TYPE_DEVICE', or an object type
+                     -- whose parent is 'Vulkan.Core10.Handles.Device'
                      --
                      -- #VUID-vkGetPrivateDataEXT-objectType-parameter# @objectType@ /must/ be a
                      -- valid 'Vulkan.Core10.Enums.ObjectType.ObjectType' value
diff --git a/src/Vulkan/Extensions/VK_KHR_acceleration_structure.hs b/src/Vulkan/Extensions/VK_KHR_acceleration_structure.hs
--- a/src/Vulkan/Extensions/VK_KHR_acceleration_structure.hs
+++ b/src/Vulkan/Extensions/VK_KHR_acceleration_structure.hs
@@ -3190,7 +3190,7 @@
   pPpBuildRangeInfos <- ContT $ allocaBytesAligned @(Ptr AccelerationStructureBuildRangeInfoKHR) ((Data.Vector.length (buildRangeInfos)) * 8) 8
   Data.Vector.imapM_ (\i e -> do
     pPpBuildRangeInfos' <- ContT $ allocaBytesAligned @AccelerationStructureBuildRangeInfoKHR ((Data.Vector.length (e)) * 16) 4
-    lift $ Data.Vector.imapM_ (\i e -> poke (pPpBuildRangeInfos' `plusPtr` (16 * (i)) :: Ptr AccelerationStructureBuildRangeInfoKHR) (e)) (e)
+    lift $ Data.Vector.imapM_ (\i' e' -> poke (pPpBuildRangeInfos' `plusPtr` (16 * (i')) :: Ptr AccelerationStructureBuildRangeInfoKHR) (e')) (e)
     lift $ poke (pPpBuildRangeInfos `plusPtr` (8 * (i)) :: Ptr (Ptr AccelerationStructureBuildRangeInfoKHR)) (pPpBuildRangeInfos')) (buildRangeInfos)
   lift $ vkCmdBuildAccelerationStructuresKHR' (commandBufferHandle (commandBuffer)) ((fromIntegral pInfosLength :: Word32)) (pPInfos) (pPpBuildRangeInfos)
   pure $ ()
@@ -3819,7 +3819,7 @@
   pPpMaxPrimitiveCounts <- ContT $ allocaBytesAligned @(Ptr Word32) ((Data.Vector.length (maxPrimitiveCounts)) * 8) 8
   Data.Vector.imapM_ (\i e -> do
     pPpMaxPrimitiveCounts' <- ContT $ allocaBytesAligned @Word32 ((Data.Vector.length (e)) * 4) 4
-    lift $ Data.Vector.imapM_ (\i e -> poke (pPpMaxPrimitiveCounts' `plusPtr` (4 * (i)) :: Ptr Word32) (e)) (e)
+    lift $ Data.Vector.imapM_ (\i' e' -> poke (pPpMaxPrimitiveCounts' `plusPtr` (4 * (i')) :: Ptr Word32) (e')) (e)
     lift $ poke (pPpMaxPrimitiveCounts `plusPtr` (8 * (i)) :: Ptr (Ptr Word32)) (pPpMaxPrimitiveCounts')) (maxPrimitiveCounts)
   lift $ vkCmdBuildAccelerationStructuresIndirectKHR' (commandBufferHandle (commandBuffer)) ((fromIntegral pInfosLength :: Word32)) (pPInfos) (pPIndirectDeviceAddresses) (pPIndirectStrides) (pPpMaxPrimitiveCounts)
   pure $ ()
@@ -4284,7 +4284,7 @@
   pPpBuildRangeInfos <- ContT $ allocaBytesAligned @(Ptr AccelerationStructureBuildRangeInfoKHR) ((Data.Vector.length (buildRangeInfos)) * 8) 8
   Data.Vector.imapM_ (\i e -> do
     pPpBuildRangeInfos' <- ContT $ allocaBytesAligned @AccelerationStructureBuildRangeInfoKHR ((Data.Vector.length (e)) * 16) 4
-    lift $ Data.Vector.imapM_ (\i e -> poke (pPpBuildRangeInfos' `plusPtr` (16 * (i)) :: Ptr AccelerationStructureBuildRangeInfoKHR) (e)) (e)
+    lift $ Data.Vector.imapM_ (\i' e' -> poke (pPpBuildRangeInfos' `plusPtr` (16 * (i')) :: Ptr AccelerationStructureBuildRangeInfoKHR) (e')) (e)
     lift $ poke (pPpBuildRangeInfos `plusPtr` (8 * (i)) :: Ptr (Ptr AccelerationStructureBuildRangeInfoKHR)) (pPpBuildRangeInfos')) (buildRangeInfos)
   r <- lift $ vkBuildAccelerationStructuresKHR' (deviceHandle (device)) (deferredOperation) ((fromIntegral pInfosLength :: Word32)) (pPInfos) (pPpBuildRangeInfos)
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
@@ -6154,8 +6154,8 @@
     lift $ poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
     lift $ unless (Data.ByteString.length (versionData) == 2 * UUID_SIZE) $
       throwIO $ IOError Nothing InvalidArgument "" "AccelerationStructureVersionKHR::versionData must be 2*VK_UUID_SIZE bytes" Nothing Nothing
-    versionData <- fmap (castPtr @CChar @Word8) . ContT $ unsafeUseAsCString (versionData)
-    lift $ poke ((p `plusPtr` 16 :: Ptr (Ptr Word8))) versionData
+    versionData' <- fmap (castPtr @CChar @Word8) . ContT $ unsafeUseAsCString (versionData)
+    lift $ poke ((p `plusPtr` 16 :: Ptr (Ptr Word8))) versionData'
     lift $ f
   cStructSize = 24
   cStructAlignment = 8
diff --git a/src/Vulkan/Extensions/VK_KHR_copy_commands2.hs b/src/Vulkan/Extensions/VK_KHR_copy_commands2.hs
--- a/src/Vulkan/Extensions/VK_KHR_copy_commands2.hs
+++ b/src/Vulkan/Extensions/VK_KHR_copy_commands2.hs
@@ -1930,205 +1930,207 @@
 --
 -- == Valid Usage
 --
--- -   [[VUID-{refpage}-pRegions-00215]] The source region specified by
---     each element of @pRegions@ /must/ be a region that is contained
---     within @srcImage@
+-- -   #VUID-VkBlitImageInfo2KHR-pRegions-00215# The source region
+--     specified by each element of @pRegions@ /must/ be a region that is
+--     contained within @srcImage@
 --
--- -   [[VUID-{refpage}-pRegions-00216]] The destination region specified
---     by each element of @pRegions@ /must/ be a region that is contained
---     within @dstImage@
+-- -   #VUID-VkBlitImageInfo2KHR-pRegions-00216# The destination region
+--     specified by each element of @pRegions@ /must/ be a region that is
+--     contained within @dstImage@
 --
--- -   [[VUID-{refpage}-pRegions-00217]] The union of all destination
---     regions, specified by the elements of @pRegions@, /must/ not overlap
---     in memory with any texel that /may/ be sampled during the blit
---     operation
+-- -   #VUID-VkBlitImageInfo2KHR-pRegions-00217# The union of all
+--     destination regions, specified by the elements of @pRegions@, /must/
+--     not overlap in memory with any texel that /may/ be sampled during
+--     the blit operation
 --
--- -   [[VUID-{refpage}-srcImage-01999]] The
+-- -   #VUID-VkBlitImageInfo2KHR-srcImage-01999# The
 --     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-format-features format features>
 --     of @srcImage@ /must/ contain
 --     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_BLIT_SRC_BIT'
 --
--- -   [[VUID-{refpage}-srcImage-01561]] @srcImage@ /must/ not use a format
---     listed in
+-- -   #VUID-VkBlitImageInfo2KHR-srcImage-01561# @srcImage@ /must/ not use
+--     a format listed in
 --     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion ???>
 --
--- -   [[VUID-{refpage}-srcImage-00219]] @srcImage@ /must/ have been
---     created with
+-- -   #VUID-VkBlitImageInfo2KHR-srcImage-00219# @srcImage@ /must/ have
+--     been created with
 --     'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_TRANSFER_SRC_BIT'
 --     usage flag
 --
--- -   [[VUID-{refpage}-srcImage-00220]] If @srcImage@ is non-sparse then
---     it /must/ be bound completely and contiguously to a single
---     'Vulkan.Core10.Handles.DeviceMemory' object
+-- -   #VUID-VkBlitImageInfo2KHR-srcImage-00220# If @srcImage@ is
+--     non-sparse then it /must/ be bound completely and contiguously to a
+--     single 'Vulkan.Core10.Handles.DeviceMemory' object
 --
--- -   [[VUID-{refpage}-srcImageLayout-00221]] @srcImageLayout@ /must/
---     specify the layout of the image subresources of @srcImage@ specified
---     in @pRegions@ at the time this command is executed on a
+-- -   #VUID-VkBlitImageInfo2KHR-srcImageLayout-00221# @srcImageLayout@
+--     /must/ specify the layout of the image subresources of @srcImage@
+--     specified in @pRegions@ at the time this command is executed on a
 --     'Vulkan.Core10.Handles.Device'
 --
--- -   [[VUID-{refpage}-srcImageLayout-01398]] @srcImageLayout@ /must/ be
+-- -   #VUID-VkBlitImageInfo2KHR-srcImageLayout-01398# @srcImageLayout@
+--     /must/ be
 --     'Vulkan.Core10.Enums.ImageLayout.IMAGE_LAYOUT_SHARED_PRESENT_KHR',
 --     'Vulkan.Core10.Enums.ImageLayout.IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL'
 --     or 'Vulkan.Core10.Enums.ImageLayout.IMAGE_LAYOUT_GENERAL'
 --
--- -   [[VUID-{refpage}-dstImage-02000]] The
+-- -   #VUID-VkBlitImageInfo2KHR-dstImage-02000# The
 --     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-format-features format features>
 --     of @dstImage@ /must/ contain
 --     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_BLIT_DST_BIT'
 --
--- -   [[VUID-{refpage}-dstImage-01562]] @dstImage@ /must/ not use a format
---     listed in
+-- -   #VUID-VkBlitImageInfo2KHR-dstImage-01562# @dstImage@ /must/ not use
+--     a format listed in
 --     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion ???>
 --
--- -   [[VUID-{refpage}-dstImage-00224]] @dstImage@ /must/ have been
---     created with
+-- -   #VUID-VkBlitImageInfo2KHR-dstImage-00224# @dstImage@ /must/ have
+--     been created with
 --     'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_TRANSFER_DST_BIT'
 --     usage flag
 --
--- -   [[VUID-{refpage}-dstImage-00225]] If @dstImage@ is non-sparse then
---     it /must/ be bound completely and contiguously to a single
---     'Vulkan.Core10.Handles.DeviceMemory' object
+-- -   #VUID-VkBlitImageInfo2KHR-dstImage-00225# If @dstImage@ is
+--     non-sparse then it /must/ be bound completely and contiguously to a
+--     single 'Vulkan.Core10.Handles.DeviceMemory' object
 --
--- -   [[VUID-{refpage}-dstImageLayout-00226]] @dstImageLayout@ /must/
---     specify the layout of the image subresources of @dstImage@ specified
---     in @pRegions@ at the time this command is executed on a
+-- -   #VUID-VkBlitImageInfo2KHR-dstImageLayout-00226# @dstImageLayout@
+--     /must/ specify the layout of the image subresources of @dstImage@
+--     specified in @pRegions@ at the time this command is executed on a
 --     'Vulkan.Core10.Handles.Device'
 --
--- -   [[VUID-{refpage}-dstImageLayout-01399]] @dstImageLayout@ /must/ be
+-- -   #VUID-VkBlitImageInfo2KHR-dstImageLayout-01399# @dstImageLayout@
+--     /must/ be
 --     'Vulkan.Core10.Enums.ImageLayout.IMAGE_LAYOUT_SHARED_PRESENT_KHR',
 --     'Vulkan.Core10.Enums.ImageLayout.IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL'
 --     or 'Vulkan.Core10.Enums.ImageLayout.IMAGE_LAYOUT_GENERAL'
 --
--- -   [[VUID-{refpage}-srcImage-00229]] If either of @srcImage@ or
+-- -   #VUID-VkBlitImageInfo2KHR-srcImage-00229# If either of @srcImage@ or
 --     @dstImage@ was created with a signed integer
 --     'Vulkan.Core10.Enums.Format.Format', the other /must/ also have been
 --     created with a signed integer 'Vulkan.Core10.Enums.Format.Format'
 --
--- -   [[VUID-{refpage}-srcImage-00230]] If either of @srcImage@ or
+-- -   #VUID-VkBlitImageInfo2KHR-srcImage-00230# If either of @srcImage@ or
 --     @dstImage@ was created with an unsigned integer
 --     'Vulkan.Core10.Enums.Format.Format', the other /must/ also have been
 --     created with an unsigned integer 'Vulkan.Core10.Enums.Format.Format'
 --
--- -   [[VUID-{refpage}-srcImage-00231]] If either of @srcImage@ or
+-- -   #VUID-VkBlitImageInfo2KHR-srcImage-00231# If either of @srcImage@ or
 --     @dstImage@ was created with a depth\/stencil format, the other
 --     /must/ have exactly the same format
 --
--- -   [[VUID-{refpage}-srcImage-00232]] If @srcImage@ was created with a
---     depth\/stencil format, @filter@ /must/ be
+-- -   #VUID-VkBlitImageInfo2KHR-srcImage-00232# If @srcImage@ was created
+--     with a depth\/stencil format, @filter@ /must/ be
 --     'Vulkan.Core10.Enums.Filter.FILTER_NEAREST'
 --
--- -   [[VUID-{refpage}-srcImage-00233]] @srcImage@ /must/ have been
---     created with a @samples@ value of
+-- -   #VUID-VkBlitImageInfo2KHR-srcImage-00233# @srcImage@ /must/ have
+--     been created with a @samples@ value of
 --     'Vulkan.Core10.Enums.SampleCountFlagBits.SAMPLE_COUNT_1_BIT'
 --
--- -   [[VUID-{refpage}-dstImage-00234]] @dstImage@ /must/ have been
---     created with a @samples@ value of
+-- -   #VUID-VkBlitImageInfo2KHR-dstImage-00234# @dstImage@ /must/ have
+--     been created with a @samples@ value of
 --     'Vulkan.Core10.Enums.SampleCountFlagBits.SAMPLE_COUNT_1_BIT'
 --
--- -   [[VUID-{refpage}-filter-02001]] If @filter@ is
+-- -   #VUID-VkBlitImageInfo2KHR-filter-02001# If @filter@ is
 --     'Vulkan.Core10.Enums.Filter.FILTER_LINEAR', then the
 --     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-format-features format features>
 --     of @srcImage@ /must/ contain
 --     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT'
 --
--- -   [[VUID-{refpage}-filter-02002]] If @filter@ is
+-- -   #VUID-VkBlitImageInfo2KHR-filter-02002# If @filter@ is
 --     'Vulkan.Extensions.VK_EXT_filter_cubic.FILTER_CUBIC_EXT', then the
 --     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-format-features format features>
 --     of @srcImage@ /must/ contain
 --     'Vulkan.Extensions.VK_EXT_filter_cubic.FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT'
 --
--- -   [[VUID-{refpage}-filter-00237]] If @filter@ is
+-- -   #VUID-VkBlitImageInfo2KHR-filter-00237# If @filter@ is
 --     'Vulkan.Extensions.VK_EXT_filter_cubic.FILTER_CUBIC_EXT', @srcImage@
 --     /must/ be of type 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_2D'
 --
--- -   [[VUID-{refpage}-srcSubresource-01705]] The
+-- -   #VUID-VkBlitImageInfo2KHR-srcSubresource-01705# The
 --     @srcSubresource.mipLevel@ member of each element of @pRegions@
 --     /must/ be less than the @mipLevels@ specified in
 --     'Vulkan.Core10.Image.ImageCreateInfo' when @srcImage@ was created
 --
--- -   [[VUID-{refpage}-dstSubresource-01706]] The
+-- -   #VUID-VkBlitImageInfo2KHR-dstSubresource-01706# The
 --     @dstSubresource.mipLevel@ member of each element of @pRegions@
 --     /must/ be less than the @mipLevels@ specified in
 --     'Vulkan.Core10.Image.ImageCreateInfo' when @dstImage@ was created
 --
--- -   [[VUID-{refpage}-srcSubresource-01707]] The
+-- -   #VUID-VkBlitImageInfo2KHR-srcSubresource-01707# The
 --     @srcSubresource.baseArrayLayer@ + @srcSubresource.layerCount@ of
 --     each element of @pRegions@ /must/ be less than or equal to the
 --     @arrayLayers@ specified in 'Vulkan.Core10.Image.ImageCreateInfo'
 --     when @srcImage@ was created
 --
--- -   [[VUID-{refpage}-dstSubresource-01708]] The
+-- -   #VUID-VkBlitImageInfo2KHR-dstSubresource-01708# The
 --     @dstSubresource.baseArrayLayer@ + @dstSubresource.layerCount@ of
 --     each element of @pRegions@ /must/ be less than or equal to the
 --     @arrayLayers@ specified in 'Vulkan.Core10.Image.ImageCreateInfo'
 --     when @dstImage@ was created
 --
--- -   [[VUID-{refpage}-dstImage-02545]] @dstImage@ and @srcImage@ /must/
---     not have been created with @flags@ containing
+-- -   #VUID-VkBlitImageInfo2KHR-dstImage-02545# @dstImage@ and @srcImage@
+--     /must/ not have been created with @flags@ containing
 --     'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SUBSAMPLED_BIT_EXT'
 --
--- -   [[VUID-{refpage}-srcImage-00240]] If either @srcImage@ or @dstImage@
---     is of type 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_3D', then for
---     each element of @pRegions@, @srcSubresource.baseArrayLayer@ and
---     @dstSubresource.baseArrayLayer@ /must/ each be @0@, and
+-- -   #VUID-VkBlitImageInfo2KHR-srcImage-00240# If either @srcImage@ or
+--     @dstImage@ is of type 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_3D',
+--     then for each element of @pRegions@, @srcSubresource.baseArrayLayer@
+--     and @dstSubresource.baseArrayLayer@ /must/ each be @0@, and
 --     @srcSubresource.layerCount@ and @dstSubresource.layerCount@ /must/
 --     each be @1@.
 --
--- -   [[VUID-{refpage}-aspectMask-00241]] For each element of @pRegions@,
---     @srcSubresource.aspectMask@ /must/ specify aspects present in
---     @srcImage@
+-- -   #VUID-VkBlitImageInfo2KHR-aspectMask-00241# For each element of
+--     @pRegions@, @srcSubresource.aspectMask@ /must/ specify aspects
+--     present in @srcImage@
 --
--- -   [[VUID-{refpage}-aspectMask-00242]] For each element of @pRegions@,
---     @dstSubresource.aspectMask@ /must/ specify aspects present in
---     @dstImage@
+-- -   #VUID-VkBlitImageInfo2KHR-aspectMask-00242# For each element of
+--     @pRegions@, @dstSubresource.aspectMask@ /must/ specify aspects
+--     present in @dstImage@
 --
--- -   [[VUID-{refpage}-srcOffset-00243]] For each element of @pRegions@,
---     @srcOffset@[0].x and @srcOffset@[1].x /must/ both be greater than or
---     equal to @0@ and less than or equal to the width of the specified
---     @srcSubresource@ of @srcImage@
+-- -   #VUID-VkBlitImageInfo2KHR-srcOffset-00243# For each element of
+--     @pRegions@, @srcOffset@[0].x and @srcOffset@[1].x /must/ both be
+--     greater than or equal to @0@ and less than or equal to the width of
+--     the specified @srcSubresource@ of @srcImage@
 --
--- -   [[VUID-{refpage}-srcOffset-00244]] For each element of @pRegions@,
---     @srcOffset@[0].y and @srcOffset@[1].y /must/ both be greater than or
---     equal to @0@ and less than or equal to the height of the specified
---     @srcSubresource@ of @srcImage@
+-- -   #VUID-VkBlitImageInfo2KHR-srcOffset-00244# For each element of
+--     @pRegions@, @srcOffset@[0].y and @srcOffset@[1].y /must/ both be
+--     greater than or equal to @0@ and less than or equal to the height of
+--     the specified @srcSubresource@ of @srcImage@
 --
--- -   [[VUID-{refpage}-srcImage-00245]] If @srcImage@ is of type
+-- -   #VUID-VkBlitImageInfo2KHR-srcImage-00245# If @srcImage@ is of type
 --     'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_1D', then for each element
 --     of @pRegions@, @srcOffset@[0].y /must/ be @0@ and @srcOffset@[1].y
 --     /must/ be @1@
 --
--- -   [[VUID-{refpage}-srcOffset-00246]] For each element of @pRegions@,
---     @srcOffset@[0].z and @srcOffset@[1].z /must/ both be greater than or
---     equal to @0@ and less than or equal to the depth of the specified
---     @srcSubresource@ of @srcImage@
+-- -   #VUID-VkBlitImageInfo2KHR-srcOffset-00246# For each element of
+--     @pRegions@, @srcOffset@[0].z and @srcOffset@[1].z /must/ both be
+--     greater than or equal to @0@ and less than or equal to the depth of
+--     the specified @srcSubresource@ of @srcImage@
 --
--- -   [[VUID-{refpage}-srcImage-00247]] If @srcImage@ is of type
+-- -   #VUID-VkBlitImageInfo2KHR-srcImage-00247# If @srcImage@ is of type
 --     'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_1D' or
 --     'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_2D', then for each element
 --     of @pRegions@, @srcOffset@[0].z /must/ be @0@ and @srcOffset@[1].z
 --     /must/ be @1@
 --
--- -   [[VUID-{refpage}-dstOffset-00248]] For each element of @pRegions@,
---     @dstOffset@[0].x and @dstOffset@[1].x /must/ both be greater than or
---     equal to @0@ and less than or equal to the width of the specified
---     @dstSubresource@ of @dstImage@
+-- -   #VUID-VkBlitImageInfo2KHR-dstOffset-00248# For each element of
+--     @pRegions@, @dstOffset@[0].x and @dstOffset@[1].x /must/ both be
+--     greater than or equal to @0@ and less than or equal to the width of
+--     the specified @dstSubresource@ of @dstImage@
 --
--- -   [[VUID-{refpage}-dstOffset-00249]] For each element of @pRegions@,
---     @dstOffset@[0].y and @dstOffset@[1].y /must/ both be greater than or
---     equal to @0@ and less than or equal to the height of the specified
---     @dstSubresource@ of @dstImage@
+-- -   #VUID-VkBlitImageInfo2KHR-dstOffset-00249# For each element of
+--     @pRegions@, @dstOffset@[0].y and @dstOffset@[1].y /must/ both be
+--     greater than or equal to @0@ and less than or equal to the height of
+--     the specified @dstSubresource@ of @dstImage@
 --
--- -   [[VUID-{refpage}-dstImage-00250]] If @dstImage@ is of type
+-- -   #VUID-VkBlitImageInfo2KHR-dstImage-00250# If @dstImage@ is of type
 --     'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_1D', then for each element
 --     of @pRegions@, @dstOffset@[0].y /must/ be @0@ and @dstOffset@[1].y
 --     /must/ be @1@
 --
--- -   [[VUID-{refpage}-dstOffset-00251]] For each element of @pRegions@,
---     @dstOffset@[0].z and @dstOffset@[1].z /must/ both be greater than or
---     equal to @0@ and less than or equal to the depth of the specified
---     @dstSubresource@ of @dstImage@
+-- -   #VUID-VkBlitImageInfo2KHR-dstOffset-00251# For each element of
+--     @pRegions@, @dstOffset@[0].z and @dstOffset@[1].z /must/ both be
+--     greater than or equal to @0@ and less than or equal to the depth of
+--     the specified @dstSubresource@ of @dstImage@
 --
--- -   [[VUID-{refpage}-dstImage-00252]] If @dstImage@ is of type
+-- -   #VUID-VkBlitImageInfo2KHR-dstImage-00252# If @dstImage@ is of type
 --     'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_1D' or
 --     'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_2D', then for each element
 --     of @pRegions@, @dstOffset@[0].z /must/ be @0@ and @dstOffset@[1].z
diff --git a/src/Vulkan/Extensions/VK_NV_device_generated_commands.hs b/src/Vulkan/Extensions/VK_NV_device_generated_commands.hs
--- a/src/Vulkan/Extensions/VK_NV_device_generated_commands.hs
+++ b/src/Vulkan/Extensions/VK_NV_device_generated_commands.hs
@@ -1963,10 +1963,9 @@
 --     @pGroups@
 --
 -- -   #VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pPipelines-02886#
---     Each element of the @pPipelines@ member of @libraries@ /must/ have
---     been created with identical state to the pipeline currently created
---     except the state that can be overriden by
---     'GraphicsShaderGroupCreateInfoNV'
+--     Each element of @pPipelines@ /must/ have been created with identical
+--     state to the pipeline currently created except the state that can be
+--     overridden by 'GraphicsShaderGroupCreateInfoNV'
 --
 -- -   #VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-deviceGeneratedCommands-02887#
 --     The
diff --git a/src/Vulkan/SPIRVRequirements.hs b/src/Vulkan/SPIRVRequirements.hs
new file mode 100644
--- /dev/null
+++ b/src/Vulkan/SPIRVRequirements.hs
@@ -0,0 +1,2203 @@
+{-# language CPP #-}
+{-# language OverloadedLists #-}
+{-# language TupleSections #-}
+-- No documentation found for Chapter "SPIRVRequirements"
+module Vulkan.SPIRVRequirements  ( spirvExtensionRequirements
+                                 , spirvCapabilityRequirements
+                                 ) where
+
+import Vulkan.Requirement (DeviceRequirement(..))
+import Vulkan.Requirement (InstanceRequirement(..))
+import Data.Bits ((.&.))
+import Data.Bits (zeroBits)
+import Data.Bits (Bits)
+import Data.ByteString (ByteString)
+import Vulkan.Core10.Handles (Instance)
+import Vulkan.Core10.Handles (PhysicalDevice)
+import Vulkan.Extensions.VK_EXT_buffer_device_address (PhysicalDeviceBufferDeviceAddressFeaturesEXT)
+import Vulkan.Extensions.VK_EXT_buffer_device_address (PhysicalDeviceBufferDeviceAddressFeaturesEXT(..))
+import Vulkan.Extensions.VK_NV_compute_shader_derivatives (PhysicalDeviceComputeShaderDerivativesFeaturesNV)
+import Vulkan.Extensions.VK_NV_compute_shader_derivatives (PhysicalDeviceComputeShaderDerivativesFeaturesNV(..))
+import Vulkan.Extensions.VK_NV_cooperative_matrix (PhysicalDeviceCooperativeMatrixFeaturesNV)
+import Vulkan.Extensions.VK_NV_cooperative_matrix (PhysicalDeviceCooperativeMatrixFeaturesNV(..))
+import Vulkan.Core10.DeviceInitialization (PhysicalDeviceFeatures)
+import Vulkan.Core10.DeviceInitialization (PhysicalDeviceFeatures(..))
+import Vulkan.Extensions.VK_EXT_fragment_density_map (PhysicalDeviceFragmentDensityMapFeaturesEXT)
+import Vulkan.Extensions.VK_EXT_fragment_density_map (PhysicalDeviceFragmentDensityMapFeaturesEXT(..))
+import Vulkan.Extensions.VK_NV_fragment_shader_barycentric (PhysicalDeviceFragmentShaderBarycentricFeaturesNV)
+import Vulkan.Extensions.VK_NV_fragment_shader_barycentric (PhysicalDeviceFragmentShaderBarycentricFeaturesNV(..))
+import Vulkan.Extensions.VK_EXT_fragment_shader_interlock (PhysicalDeviceFragmentShaderInterlockFeaturesEXT)
+import Vulkan.Extensions.VK_EXT_fragment_shader_interlock (PhysicalDeviceFragmentShaderInterlockFeaturesEXT(..))
+import Vulkan.Extensions.VK_KHR_fragment_shading_rate (PhysicalDeviceFragmentShadingRateFeaturesKHR)
+import Vulkan.Extensions.VK_KHR_fragment_shading_rate (PhysicalDeviceFragmentShadingRateFeaturesKHR(..))
+import Vulkan.Extensions.VK_KHR_ray_query (PhysicalDeviceRayQueryFeaturesKHR)
+import Vulkan.Extensions.VK_KHR_ray_query (PhysicalDeviceRayQueryFeaturesKHR(..))
+import Vulkan.Extensions.VK_KHR_ray_tracing_pipeline (PhysicalDeviceRayTracingPipelineFeaturesKHR)
+import Vulkan.Extensions.VK_KHR_ray_tracing_pipeline (PhysicalDeviceRayTracingPipelineFeaturesKHR(..))
+import Vulkan.Extensions.VK_EXT_shader_atomic_float (PhysicalDeviceShaderAtomicFloatFeaturesEXT)
+import Vulkan.Extensions.VK_EXT_shader_atomic_float (PhysicalDeviceShaderAtomicFloatFeaturesEXT(..))
+import Vulkan.Extensions.VK_EXT_shader_demote_to_helper_invocation (PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT)
+import Vulkan.Extensions.VK_EXT_shader_demote_to_helper_invocation (PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(..))
+import Vulkan.Extensions.VK_EXT_shader_image_atomic_int64 (PhysicalDeviceShaderImageAtomicInt64FeaturesEXT)
+import Vulkan.Extensions.VK_EXT_shader_image_atomic_int64 (PhysicalDeviceShaderImageAtomicInt64FeaturesEXT(..))
+import Vulkan.Extensions.VK_NV_shader_image_footprint (PhysicalDeviceShaderImageFootprintFeaturesNV)
+import Vulkan.Extensions.VK_NV_shader_image_footprint (PhysicalDeviceShaderImageFootprintFeaturesNV(..))
+import Vulkan.Extensions.VK_INTEL_shader_integer_functions2 (PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL)
+import Vulkan.Extensions.VK_INTEL_shader_integer_functions2 (PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(..))
+import Vulkan.Extensions.VK_NV_shader_sm_builtins (PhysicalDeviceShaderSMBuiltinsFeaturesNV)
+import Vulkan.Extensions.VK_NV_shader_sm_builtins (PhysicalDeviceShaderSMBuiltinsFeaturesNV(..))
+import Vulkan.Extensions.VK_NV_shading_rate_image (PhysicalDeviceShadingRateImageFeaturesNV)
+import Vulkan.Extensions.VK_NV_shading_rate_image (PhysicalDeviceShadingRateImageFeaturesNV(..))
+import Vulkan.Extensions.VK_EXT_transform_feedback (PhysicalDeviceTransformFeedbackFeaturesEXT)
+import Vulkan.Extensions.VK_EXT_transform_feedback (PhysicalDeviceTransformFeedbackFeaturesEXT(..))
+import Vulkan.Core12 (PhysicalDeviceVulkan11Features)
+import Vulkan.Core12 (PhysicalDeviceVulkan11Features(..))
+import Vulkan.Core12 (PhysicalDeviceVulkan11Properties)
+import Vulkan.Core12 (PhysicalDeviceVulkan11Properties(..))
+import Vulkan.Core12 (PhysicalDeviceVulkan12Features)
+import Vulkan.Core12 (PhysicalDeviceVulkan12Features(..))
+import Vulkan.Core12 (PhysicalDeviceVulkan12Properties)
+import Vulkan.Core12 (PhysicalDeviceVulkan12Properties(..))
+import Vulkan.Extensions.VK_AMD_gcn_shader (pattern AMD_GCN_SHADER_EXTENSION_NAME)
+import Vulkan.Extensions.VK_AMD_gcn_shader (pattern AMD_GCN_SHADER_SPEC_VERSION)
+import Vulkan.Extensions.VK_AMD_gpu_shader_half_float (pattern AMD_GPU_SHADER_HALF_FLOAT_EXTENSION_NAME)
+import Vulkan.Extensions.VK_AMD_gpu_shader_half_float (pattern AMD_GPU_SHADER_HALF_FLOAT_SPEC_VERSION)
+import Vulkan.Extensions.VK_AMD_gpu_shader_int16 (pattern AMD_GPU_SHADER_INT16_EXTENSION_NAME)
+import Vulkan.Extensions.VK_AMD_gpu_shader_int16 (pattern AMD_GPU_SHADER_INT16_SPEC_VERSION)
+import Vulkan.Extensions.VK_AMD_shader_ballot (pattern AMD_SHADER_BALLOT_EXTENSION_NAME)
+import Vulkan.Extensions.VK_AMD_shader_ballot (pattern AMD_SHADER_BALLOT_SPEC_VERSION)
+import Vulkan.Extensions.VK_AMD_shader_explicit_vertex_parameter (pattern AMD_SHADER_EXPLICIT_VERTEX_PARAMETER_EXTENSION_NAME)
+import Vulkan.Extensions.VK_AMD_shader_explicit_vertex_parameter (pattern AMD_SHADER_EXPLICIT_VERTEX_PARAMETER_SPEC_VERSION)
+import Vulkan.Extensions.VK_AMD_shader_fragment_mask (pattern AMD_SHADER_FRAGMENT_MASK_EXTENSION_NAME)
+import Vulkan.Extensions.VK_AMD_shader_fragment_mask (pattern AMD_SHADER_FRAGMENT_MASK_SPEC_VERSION)
+import Vulkan.Extensions.VK_AMD_shader_image_load_store_lod (pattern AMD_SHADER_IMAGE_LOAD_STORE_LOD_EXTENSION_NAME)
+import Vulkan.Extensions.VK_AMD_shader_image_load_store_lod (pattern AMD_SHADER_IMAGE_LOAD_STORE_LOD_SPEC_VERSION)
+import Vulkan.Extensions.VK_AMD_shader_trinary_minmax (pattern AMD_SHADER_TRINARY_MINMAX_EXTENSION_NAME)
+import Vulkan.Extensions.VK_AMD_shader_trinary_minmax (pattern AMD_SHADER_TRINARY_MINMAX_SPEC_VERSION)
+import Vulkan.Extensions.VK_AMD_texture_gather_bias_lod (pattern AMD_TEXTURE_GATHER_BIAS_LOD_EXTENSION_NAME)
+import Vulkan.Extensions.VK_AMD_texture_gather_bias_lod (pattern AMD_TEXTURE_GATHER_BIAS_LOD_SPEC_VERSION)
+import Vulkan.Extensions.VK_EXT_buffer_device_address (pattern EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_buffer_device_address (pattern EXT_BUFFER_DEVICE_ADDRESS_SPEC_VERSION)
+import Vulkan.Extensions.VK_EXT_descriptor_indexing (pattern EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_descriptor_indexing (pattern EXT_DESCRIPTOR_INDEXING_SPEC_VERSION)
+import Vulkan.Extensions.VK_EXT_fragment_density_map (pattern EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_fragment_density_map (pattern EXT_FRAGMENT_DENSITY_MAP_SPEC_VERSION)
+import Vulkan.Extensions.VK_EXT_fragment_shader_interlock (pattern EXT_FRAGMENT_SHADER_INTERLOCK_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_fragment_shader_interlock (pattern EXT_FRAGMENT_SHADER_INTERLOCK_SPEC_VERSION)
+import Vulkan.Extensions.VK_EXT_post_depth_coverage (pattern EXT_POST_DEPTH_COVERAGE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_post_depth_coverage (pattern EXT_POST_DEPTH_COVERAGE_SPEC_VERSION)
+import Vulkan.Extensions.VK_EXT_shader_atomic_float (pattern EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_shader_atomic_float (pattern EXT_SHADER_ATOMIC_FLOAT_SPEC_VERSION)
+import Vulkan.Extensions.VK_EXT_shader_demote_to_helper_invocation (pattern EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_shader_demote_to_helper_invocation (pattern EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_SPEC_VERSION)
+import Vulkan.Extensions.VK_EXT_shader_image_atomic_int64 (pattern EXT_SHADER_IMAGE_ATOMIC_INT64_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_shader_image_atomic_int64 (pattern EXT_SHADER_IMAGE_ATOMIC_INT64_SPEC_VERSION)
+import Vulkan.Extensions.VK_EXT_shader_stencil_export (pattern EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_shader_stencil_export (pattern EXT_SHADER_STENCIL_EXPORT_SPEC_VERSION)
+import Vulkan.Extensions.VK_EXT_shader_subgroup_ballot (pattern EXT_SHADER_SUBGROUP_BALLOT_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_shader_subgroup_ballot (pattern EXT_SHADER_SUBGROUP_BALLOT_SPEC_VERSION)
+import Vulkan.Extensions.VK_EXT_shader_subgroup_vote (pattern EXT_SHADER_SUBGROUP_VOTE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_shader_subgroup_vote (pattern EXT_SHADER_SUBGROUP_VOTE_SPEC_VERSION)
+import Vulkan.Extensions.VK_EXT_shader_viewport_index_layer (pattern EXT_SHADER_VIEWPORT_INDEX_LAYER_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_shader_viewport_index_layer (pattern EXT_SHADER_VIEWPORT_INDEX_LAYER_SPEC_VERSION)
+import Vulkan.Extensions.VK_EXT_transform_feedback (pattern EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)
+import Vulkan.Extensions.VK_EXT_transform_feedback (pattern EXT_TRANSFORM_FEEDBACK_SPEC_VERSION)
+import Vulkan.Extensions.VK_GOOGLE_decorate_string (pattern GOOGLE_DECORATE_STRING_EXTENSION_NAME)
+import Vulkan.Extensions.VK_GOOGLE_decorate_string (pattern GOOGLE_DECORATE_STRING_SPEC_VERSION)
+import Vulkan.Extensions.VK_GOOGLE_hlsl_functionality1 (pattern GOOGLE_HLSL_FUNCTIONALITY1_EXTENSION_NAME)
+import Vulkan.Extensions.VK_GOOGLE_hlsl_functionality1 (pattern GOOGLE_HLSL_FUNCTIONALITY1_SPEC_VERSION)
+import Vulkan.Extensions.VK_GOOGLE_user_type (pattern GOOGLE_USER_TYPE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_GOOGLE_user_type (pattern GOOGLE_USER_TYPE_SPEC_VERSION)
+import Vulkan.Extensions.VK_INTEL_shader_integer_functions2 (pattern INTEL_SHADER_INTEGER_FUNCTIONS_2_EXTENSION_NAME)
+import Vulkan.Extensions.VK_INTEL_shader_integer_functions2 (pattern INTEL_SHADER_INTEGER_FUNCTIONS_2_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_16bit_storage (pattern KHR_16BIT_STORAGE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_16bit_storage (pattern KHR_16BIT_STORAGE_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_8bit_storage (pattern KHR_8BIT_STORAGE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_8bit_storage (pattern KHR_8BIT_STORAGE_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_acceleration_structure (pattern KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_acceleration_structure (pattern KHR_ACCELERATION_STRUCTURE_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_buffer_device_address (pattern KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_buffer_device_address (pattern KHR_BUFFER_DEVICE_ADDRESS_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_create_renderpass2 (pattern KHR_CREATE_RENDERPASS_2_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_create_renderpass2 (pattern KHR_CREATE_RENDERPASS_2_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_deferred_host_operations (pattern KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_deferred_host_operations (pattern KHR_DEFERRED_HOST_OPERATIONS_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_device_group_creation (pattern KHR_DEVICE_GROUP_CREATION_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_device_group_creation (pattern KHR_DEVICE_GROUP_CREATION_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_device_group (pattern KHR_DEVICE_GROUP_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_device_group (pattern KHR_DEVICE_GROUP_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_fragment_shading_rate (pattern KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_fragment_shading_rate (pattern KHR_FRAGMENT_SHADING_RATE_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_get_memory_requirements2 (pattern KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_get_memory_requirements2 (pattern KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_get_physical_device_properties2 (pattern KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_get_physical_device_properties2 (pattern KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_maintenance2 (pattern KHR_MAINTENANCE2_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_maintenance2 (pattern KHR_MAINTENANCE2_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_maintenance3 (pattern KHR_MAINTENANCE3_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_maintenance3 (pattern KHR_MAINTENANCE3_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_multiview (pattern KHR_MULTIVIEW_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_multiview (pattern KHR_MULTIVIEW_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_ray_query (pattern KHR_RAY_QUERY_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_ray_query (pattern KHR_RAY_QUERY_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_ray_tracing_pipeline (pattern KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_ray_tracing_pipeline (pattern KHR_RAY_TRACING_PIPELINE_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_shader_atomic_int64 (pattern KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_shader_atomic_int64 (pattern KHR_SHADER_ATOMIC_INT64_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_shader_clock (pattern KHR_SHADER_CLOCK_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_shader_clock (pattern KHR_SHADER_CLOCK_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_shader_draw_parameters (pattern KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_shader_draw_parameters (pattern KHR_SHADER_DRAW_PARAMETERS_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_shader_float16_int8 (pattern KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_shader_float16_int8 (pattern KHR_SHADER_FLOAT16_INT8_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_shader_float_controls (pattern KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_shader_float_controls (pattern KHR_SHADER_FLOAT_CONTROLS_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_shader_non_semantic_info (pattern KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_shader_non_semantic_info (pattern KHR_SHADER_NON_SEMANTIC_INFO_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_shader_terminate_invocation (pattern KHR_SHADER_TERMINATE_INVOCATION_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_shader_terminate_invocation (pattern KHR_SHADER_TERMINATE_INVOCATION_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_spirv_1_4 (pattern KHR_SPIRV_1_4_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_spirv_1_4 (pattern KHR_SPIRV_1_4_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_storage_buffer_storage_class (pattern KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_storage_buffer_storage_class (pattern KHR_STORAGE_BUFFER_STORAGE_CLASS_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_variable_pointers (pattern KHR_VARIABLE_POINTERS_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_variable_pointers (pattern KHR_VARIABLE_POINTERS_SPEC_VERSION)
+import Vulkan.Extensions.VK_KHR_vulkan_memory_model (pattern KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME)
+import Vulkan.Extensions.VK_KHR_vulkan_memory_model (pattern KHR_VULKAN_MEMORY_MODEL_SPEC_VERSION)
+import Vulkan.Version (pattern MAKE_VERSION)
+import Vulkan.Extensions.VK_NVX_multiview_per_view_attributes (pattern NVX_MULTIVIEW_PER_VIEW_ATTRIBUTES_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NVX_multiview_per_view_attributes (pattern NVX_MULTIVIEW_PER_VIEW_ATTRIBUTES_SPEC_VERSION)
+import Vulkan.Extensions.VK_NV_compute_shader_derivatives (pattern NV_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_compute_shader_derivatives (pattern NV_COMPUTE_SHADER_DERIVATIVES_SPEC_VERSION)
+import Vulkan.Extensions.VK_NV_cooperative_matrix (pattern NV_COOPERATIVE_MATRIX_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_cooperative_matrix (pattern NV_COOPERATIVE_MATRIX_SPEC_VERSION)
+import Vulkan.Extensions.VK_NV_fragment_shader_barycentric (pattern NV_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_fragment_shader_barycentric (pattern NV_FRAGMENT_SHADER_BARYCENTRIC_SPEC_VERSION)
+import Vulkan.Extensions.VK_NV_geometry_shader_passthrough (pattern NV_GEOMETRY_SHADER_PASSTHROUGH_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_geometry_shader_passthrough (pattern NV_GEOMETRY_SHADER_PASSTHROUGH_SPEC_VERSION)
+import Vulkan.Extensions.VK_NV_mesh_shader (pattern NV_MESH_SHADER_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_mesh_shader (pattern NV_MESH_SHADER_SPEC_VERSION)
+import Vulkan.Extensions.VK_NV_ray_tracing (pattern NV_RAY_TRACING_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_ray_tracing (pattern NV_RAY_TRACING_SPEC_VERSION)
+import Vulkan.Extensions.VK_NV_sample_mask_override_coverage (pattern NV_SAMPLE_MASK_OVERRIDE_COVERAGE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_sample_mask_override_coverage (pattern NV_SAMPLE_MASK_OVERRIDE_COVERAGE_SPEC_VERSION)
+import Vulkan.Extensions.VK_NV_shader_image_footprint (pattern NV_SHADER_IMAGE_FOOTPRINT_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_shader_image_footprint (pattern NV_SHADER_IMAGE_FOOTPRINT_SPEC_VERSION)
+import Vulkan.Extensions.VK_NV_shader_sm_builtins (pattern NV_SHADER_SM_BUILTINS_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_shader_sm_builtins (pattern NV_SHADER_SM_BUILTINS_SPEC_VERSION)
+import Vulkan.Extensions.VK_NV_shader_subgroup_partitioned (pattern NV_SHADER_SUBGROUP_PARTITIONED_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_shader_subgroup_partitioned (pattern NV_SHADER_SUBGROUP_PARTITIONED_SPEC_VERSION)
+import Vulkan.Extensions.VK_NV_shading_rate_image (pattern NV_SHADING_RATE_IMAGE_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_shading_rate_image (pattern NV_SHADING_RATE_IMAGE_SPEC_VERSION)
+import Vulkan.Extensions.VK_NV_viewport_array2 (pattern NV_VIEWPORT_ARRAY2_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_viewport_array2 (pattern NV_VIEWPORT_ARRAY2_SPEC_VERSION)
+import Vulkan.Core11.Enums.SubgroupFeatureFlagBits (SubgroupFeatureFlags)
+import Vulkan.Core11.Enums.SubgroupFeatureFlagBits (SubgroupFeatureFlagBits(SUBGROUP_FEATURE_ARITHMETIC_BIT))
+import Vulkan.Core11.Enums.SubgroupFeatureFlagBits (SubgroupFeatureFlags)
+import Vulkan.Core11.Enums.SubgroupFeatureFlagBits (SubgroupFeatureFlagBits(SUBGROUP_FEATURE_BALLOT_BIT))
+import Vulkan.Core11.Enums.SubgroupFeatureFlagBits (SubgroupFeatureFlags)
+import Vulkan.Core11.Enums.SubgroupFeatureFlagBits (SubgroupFeatureFlagBits(SUBGROUP_FEATURE_BASIC_BIT))
+import Vulkan.Core11.Enums.SubgroupFeatureFlagBits (SubgroupFeatureFlags)
+import Vulkan.Core11.Enums.SubgroupFeatureFlagBits (SubgroupFeatureFlagBits(SUBGROUP_FEATURE_CLUSTERED_BIT))
+import Vulkan.Core11.Enums.SubgroupFeatureFlagBits (SubgroupFeatureFlags)
+import Vulkan.Core11.Enums.SubgroupFeatureFlagBits (SubgroupFeatureFlagBits(SUBGROUP_FEATURE_PARTITIONED_BIT_NV))
+import Vulkan.Core11.Enums.SubgroupFeatureFlagBits (SubgroupFeatureFlags)
+import Vulkan.Core11.Enums.SubgroupFeatureFlagBits (SubgroupFeatureFlagBits(SUBGROUP_FEATURE_QUAD_BIT))
+import Vulkan.Core11.Enums.SubgroupFeatureFlagBits (SubgroupFeatureFlags)
+import Vulkan.Core11.Enums.SubgroupFeatureFlagBits (SubgroupFeatureFlagBits(SUBGROUP_FEATURE_SHUFFLE_BIT))
+import Vulkan.Core11.Enums.SubgroupFeatureFlagBits (SubgroupFeatureFlags)
+import Vulkan.Core11.Enums.SubgroupFeatureFlagBits (SubgroupFeatureFlagBits(SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT))
+import Vulkan.Core11.Enums.SubgroupFeatureFlagBits (SubgroupFeatureFlags)
+import Vulkan.Core11.Enums.SubgroupFeatureFlagBits (SubgroupFeatureFlagBits(SUBGROUP_FEATURE_VOTE_BIT))
+-- | Check if the intersection of bits is non-zero
+(.&&.) :: Bits a => a -> a -> Bool
+x .&&. y = (x .&. y) /= zeroBits
+
+spirvExtensionRequirements :: ByteString -> ([InstanceRequirement], [DeviceRequirement])
+spirvExtensionRequirements = \case
+  "SPV_KHR_variable_pointers" ->
+    (,) [RequireInstanceVersion $ MAKE_VERSION 1 1 0] [RequireDeviceVersion $ MAKE_VERSION 1 1 0]
+  "SPV_AMD_shader_explicit_vertex_parameter" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = AMD_SHADER_EXPLICIT_VERTEX_PARAMETER_EXTENSION_NAME
+                             , deviceExtensionMinVersion = AMD_SHADER_EXPLICIT_VERTEX_PARAMETER_SPEC_VERSION
+                             }
+    ]
+  "SPV_AMD_gcn_shader" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = AMD_GCN_SHADER_EXTENSION_NAME
+                             , deviceExtensionMinVersion = AMD_GCN_SHADER_SPEC_VERSION
+                             }
+    ]
+  "SPV_AMD_gpu_shader_half_float" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = AMD_GPU_SHADER_HALF_FLOAT_EXTENSION_NAME
+                             , deviceExtensionMinVersion = AMD_GPU_SHADER_HALF_FLOAT_SPEC_VERSION
+                             }
+    ]
+  "SPV_AMD_gpu_shader_int16" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = AMD_GPU_SHADER_INT16_EXTENSION_NAME
+                             , deviceExtensionMinVersion = AMD_GPU_SHADER_INT16_SPEC_VERSION
+                             }
+    ]
+  "SPV_AMD_shader_ballot" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = AMD_SHADER_BALLOT_EXTENSION_NAME
+                             , deviceExtensionMinVersion = AMD_SHADER_BALLOT_SPEC_VERSION
+                             }
+    ]
+  "SPV_AMD_shader_fragment_mask" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = AMD_SHADER_FRAGMENT_MASK_EXTENSION_NAME
+                             , deviceExtensionMinVersion = AMD_SHADER_FRAGMENT_MASK_SPEC_VERSION
+                             }
+    ]
+  "SPV_AMD_shader_image_load_store_lod" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = AMD_SHADER_IMAGE_LOAD_STORE_LOD_EXTENSION_NAME
+                             , deviceExtensionMinVersion = AMD_SHADER_IMAGE_LOAD_STORE_LOD_SPEC_VERSION
+                             }
+    ]
+  "SPV_AMD_shader_trinary_minmax" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = AMD_SHADER_TRINARY_MINMAX_EXTENSION_NAME
+                             , deviceExtensionMinVersion = AMD_SHADER_TRINARY_MINMAX_SPEC_VERSION
+                             }
+    ]
+  "SPV_AMD_texture_gather_bias_lod" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = AMD_TEXTURE_GATHER_BIAS_LOD_EXTENSION_NAME
+                             , deviceExtensionMinVersion = AMD_TEXTURE_GATHER_BIAS_LOD_SPEC_VERSION
+                             }
+    ]
+  "SPV_KHR_shader_draw_parameters" ->
+    (,) [RequireInstanceVersion $ MAKE_VERSION 1 1 0] [RequireDeviceVersion $ MAKE_VERSION 1 1 0]
+  "SPV_KHR_8bit_storage" ->
+    (,) [RequireInstanceVersion $ MAKE_VERSION 1 2 0] [RequireDeviceVersion $ MAKE_VERSION 1 2 0]
+  "SPV_KHR_16bit_storage" ->
+    (,) [RequireInstanceVersion $ MAKE_VERSION 1 1 0] [RequireDeviceVersion $ MAKE_VERSION 1 1 0]
+  "SPV_KHR_shader_clock" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_SHADER_CLOCK_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_SHADER_CLOCK_SPEC_VERSION
+                             }
+    ]
+  "SPV_KHR_float_controls" ->
+    (,) [RequireInstanceVersion $ MAKE_VERSION 1 2 0] [RequireDeviceVersion $ MAKE_VERSION 1 2 0]
+  "SPV_KHR_storage_buffer_storage_class" ->
+    (,) [RequireInstanceVersion $ MAKE_VERSION 1 1 0] [RequireDeviceVersion $ MAKE_VERSION 1 1 0]
+  "SPV_KHR_post_depth_coverage" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_POST_DEPTH_COVERAGE_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_POST_DEPTH_COVERAGE_SPEC_VERSION
+                             }
+    ]
+  "SPV_EXT_shader_stencil_export" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_SHADER_STENCIL_EXPORT_SPEC_VERSION
+                             }
+    ]
+  "SPV_KHR_shader_ballot" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_SHADER_SUBGROUP_BALLOT_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_SHADER_SUBGROUP_BALLOT_SPEC_VERSION
+                             }
+    ]
+  "SPV_KHR_subgroup_vote" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_SHADER_SUBGROUP_VOTE_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_SHADER_SUBGROUP_VOTE_SPEC_VERSION
+                             }
+    ]
+  "SPV_NV_sample_mask_override_coverage" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NV_SAMPLE_MASK_OVERRIDE_COVERAGE_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NV_SAMPLE_MASK_OVERRIDE_COVERAGE_SPEC_VERSION
+                             }
+    ]
+  "SPV_NV_geometry_shader_passthrough" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NV_GEOMETRY_SHADER_PASSTHROUGH_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NV_GEOMETRY_SHADER_PASSTHROUGH_SPEC_VERSION
+                             }
+    ]
+  "SPV_NV_mesh_shader" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NV_MESH_SHADER_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NV_MESH_SHADER_SPEC_VERSION
+                             }
+    ]
+  "SPV_NV_viewport_array2" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NV_VIEWPORT_ARRAY2_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NV_VIEWPORT_ARRAY2_SPEC_VERSION
+                             }
+    ]
+  "SPV_NV_shader_subgroup_partitioned" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NV_SHADER_SUBGROUP_PARTITIONED_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NV_SHADER_SUBGROUP_PARTITIONED_SPEC_VERSION
+                             }
+    ]
+  "SPV_EXT_shader_viewport_index_layer" ->
+    (,) [RequireInstanceVersion $ MAKE_VERSION 1 2 0] [RequireDeviceVersion $ MAKE_VERSION 1 2 0]
+  "SPV_NVX_multiview_per_view_attributes" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NVX_MULTIVIEW_PER_VIEW_ATTRIBUTES_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NVX_MULTIVIEW_PER_VIEW_ATTRIBUTES_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_MULTIVIEW_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_MULTIVIEW_SPEC_VERSION
+                             }
+    ]
+  "SPV_EXT_descriptor_indexing" ->
+    (,) [RequireInstanceVersion $ MAKE_VERSION 1 2 0] [RequireDeviceVersion $ MAKE_VERSION 1 2 0]
+  "SPV_KHR_vulkan_memory_model" ->
+    (,) [RequireInstanceVersion $ MAKE_VERSION 1 2 0] [RequireDeviceVersion $ MAKE_VERSION 1 2 0]
+  "SPV_NV_compute_shader_derivatives" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NV_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NV_COMPUTE_SHADER_DERIVATIVES_SPEC_VERSION
+                             }
+    ]
+  "SPV_NV_fragment_shader_barycentric" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NV_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NV_FRAGMENT_SHADER_BARYCENTRIC_SPEC_VERSION
+                             }
+    ]
+  "SPV_NV_shader_image_footprint" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NV_SHADER_IMAGE_FOOTPRINT_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NV_SHADER_IMAGE_FOOTPRINT_SPEC_VERSION
+                             }
+    ]
+  "SPV_NV_shading_rate" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NV_SHADING_RATE_IMAGE_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NV_SHADING_RATE_IMAGE_SPEC_VERSION
+                             }
+    ]
+  "SPV_NV_ray_tracing" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NV_RAY_TRACING_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NV_RAY_TRACING_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION
+                             }
+    ]
+  "SPV_KHR_ray_tracing" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_RAY_TRACING_PIPELINE_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_SPIRV_1_4_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_SPIRV_1_4_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_ACCELERATION_STRUCTURE_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_SHADER_FLOAT_CONTROLS_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_DESCRIPTOR_INDEXING_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_BUFFER_DEVICE_ADDRESS_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_DEFERRED_HOST_OPERATIONS_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_MAINTENANCE3_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_MAINTENANCE3_SPEC_VERSION
+                             }
+    ]
+  "SPV_KHR_ray_query" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_RAY_QUERY_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_RAY_QUERY_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_SPIRV_1_4_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_SPIRV_1_4_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_ACCELERATION_STRUCTURE_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_SHADER_FLOAT_CONTROLS_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_DESCRIPTOR_INDEXING_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_BUFFER_DEVICE_ADDRESS_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_DEFERRED_HOST_OPERATIONS_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_MAINTENANCE3_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_MAINTENANCE3_SPEC_VERSION
+                             }
+    ]
+  "SPV_GOOGLE_hlsl_functionality1" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = GOOGLE_HLSL_FUNCTIONALITY1_EXTENSION_NAME
+                             , deviceExtensionMinVersion = GOOGLE_HLSL_FUNCTIONALITY1_SPEC_VERSION
+                             }
+    ]
+  "SPV_GOOGLE_user_type" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = GOOGLE_USER_TYPE_EXTENSION_NAME
+                             , deviceExtensionMinVersion = GOOGLE_USER_TYPE_SPEC_VERSION
+                             }
+    ]
+  "SPV_GOOGLE_decorate_string" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = GOOGLE_DECORATE_STRING_EXTENSION_NAME
+                             , deviceExtensionMinVersion = GOOGLE_DECORATE_STRING_SPEC_VERSION
+                             }
+    ]
+  "SPV_EXT_fragment_invocation_density" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_FRAGMENT_DENSITY_MAP_SPEC_VERSION
+                             }
+    ]
+  "SPV_KHR_physical_storage_buffer" ->
+    (,) [RequireInstanceVersion $ MAKE_VERSION 1 2 0] [RequireDeviceVersion $ MAKE_VERSION 1 2 0]
+  "SPV_EXT_physical_storage_buffer" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_BUFFER_DEVICE_ADDRESS_SPEC_VERSION
+                             }
+    ]
+  "SPV_NV_cooperative_matrix" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NV_COOPERATIVE_MATRIX_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NV_COOPERATIVE_MATRIX_SPEC_VERSION
+                             }
+    ]
+  "SPV_NV_shader_sm_builtins" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NV_SHADER_SM_BUILTINS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NV_SHADER_SM_BUILTINS_SPEC_VERSION
+                             }
+    ]
+  "SPV_EXT_fragment_shader_interlock" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_FRAGMENT_SHADER_INTERLOCK_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_FRAGMENT_SHADER_INTERLOCK_SPEC_VERSION
+                             }
+    ]
+  "SPV_EXT_demote_to_helper_invocation" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_SPEC_VERSION
+                             }
+    ]
+  "SPV_KHR_fragment_shading_rate" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_FRAGMENT_SHADING_RATE_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_CREATE_RENDERPASS_2_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_CREATE_RENDERPASS_2_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_MULTIVIEW_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_MULTIVIEW_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_MAINTENANCE2_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_MAINTENANCE2_SPEC_VERSION
+                             }
+    ]
+  "SPV_KHR_non_semantic_info" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_SHADER_NON_SEMANTIC_INFO_SPEC_VERSION
+                             }
+    ]
+  "SPV_EXT_shader_image_int64" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_SHADER_IMAGE_ATOMIC_INT64_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_SHADER_IMAGE_ATOMIC_INT64_SPEC_VERSION
+                             }
+    ]
+  "SPV_KHR_terminate_invocation" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_SHADER_TERMINATE_INVOCATION_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_SHADER_TERMINATE_INVOCATION_SPEC_VERSION
+                             }
+    ]
+  _ -> ([], [])
+
+spirvCapabilityRequirements :: ByteString -> ([InstanceRequirement], [DeviceRequirement])
+spirvCapabilityRequirements = \case
+  "Matrix"            -> (,) [RequireInstanceVersion $ MAKE_VERSION 1 0 0] [RequireDeviceVersion $ MAKE_VERSION 1 0 0]
+  "Shader"            -> (,) [RequireInstanceVersion $ MAKE_VERSION 1 0 0] [RequireDeviceVersion $ MAKE_VERSION 1 0 0]
+  "InputAttachment"   -> (,) [RequireInstanceVersion $ MAKE_VERSION 1 0 0] [RequireDeviceVersion $ MAKE_VERSION 1 0 0]
+  "Sampled1D"         -> (,) [RequireInstanceVersion $ MAKE_VERSION 1 0 0] [RequireDeviceVersion $ MAKE_VERSION 1 0 0]
+  "Image1D"           -> (,) [RequireInstanceVersion $ MAKE_VERSION 1 0 0] [RequireDeviceVersion $ MAKE_VERSION 1 0 0]
+  "SampledBuffer"     -> (,) [RequireInstanceVersion $ MAKE_VERSION 1 0 0] [RequireDeviceVersion $ MAKE_VERSION 1 0 0]
+  "ImageBuffer"       -> (,) [RequireInstanceVersion $ MAKE_VERSION 1 0 0] [RequireDeviceVersion $ MAKE_VERSION 1 0 0]
+  "ImageQuery"        -> (,) [RequireInstanceVersion $ MAKE_VERSION 1 0 0] [RequireDeviceVersion $ MAKE_VERSION 1 0 0]
+  "DerivativeControl" -> (,) [RequireInstanceVersion $ MAKE_VERSION 1 0 0] [RequireDeviceVersion $ MAKE_VERSION 1 0 0]
+  "Geometry"          -> (,)
+    []
+    [ RequireDeviceFeature { featureName   = "geometryShader"
+                           , checkFeature  = geometryShader :: PhysicalDeviceFeatures -> Bool
+                           , enableFeature = \f -> f { geometryShader = True } :: PhysicalDeviceFeatures
+                           }
+    ]
+  "Tessellation" -> (,)
+    []
+    [ RequireDeviceFeature { featureName   = "tessellationShader"
+                           , checkFeature  = tessellationShader :: PhysicalDeviceFeatures -> Bool
+                           , enableFeature = \f -> f { tessellationShader = True } :: PhysicalDeviceFeatures
+                           }
+    ]
+  "Float64" -> (,)
+    []
+    [ RequireDeviceFeature { featureName   = "shaderFloat64"
+                           , checkFeature  = shaderFloat64 :: PhysicalDeviceFeatures -> Bool
+                           , enableFeature = \f -> f { shaderFloat64 = True } :: PhysicalDeviceFeatures
+                           }
+    ]
+  "Int64" -> (,)
+    []
+    [ RequireDeviceFeature { featureName   = "shaderInt64"
+                           , checkFeature  = shaderInt64 :: PhysicalDeviceFeatures -> Bool
+                           , enableFeature = \f -> f { shaderInt64 = True } :: PhysicalDeviceFeatures
+                           }
+    ]
+  "Int64Atomics" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 2 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "shaderBufferInt64Atomics"
+      , checkFeature  = shaderBufferInt64Atomics :: PhysicalDeviceVulkan12Features -> Bool
+      , enableFeature = \f -> f { shaderBufferInt64Atomics = True } :: PhysicalDeviceVulkan12Features
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_SHADER_ATOMIC_INT64_SPEC_VERSION
+                             }
+    ]
+  "AtomicFloat32AddEXT" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "shaderBufferFloat32AtomicAdd"
+      , checkFeature  = shaderBufferFloat32AtomicAdd :: PhysicalDeviceShaderAtomicFloatFeaturesEXT -> Bool
+      , enableFeature = \f -> f { shaderBufferFloat32AtomicAdd = True } :: PhysicalDeviceShaderAtomicFloatFeaturesEXT
+      }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_SHADER_ATOMIC_FLOAT_SPEC_VERSION
+                             }
+    ]
+  "AtomicFloat64AddEXT" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "shaderBufferFloat64AtomicAdd"
+      , checkFeature  = shaderBufferFloat64AtomicAdd :: PhysicalDeviceShaderAtomicFloatFeaturesEXT -> Bool
+      , enableFeature = \f -> f { shaderBufferFloat64AtomicAdd = True } :: PhysicalDeviceShaderAtomicFloatFeaturesEXT
+      }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_SHADER_ATOMIC_FLOAT_SPEC_VERSION
+                             }
+    ]
+  "Int64ImageEXT" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "shaderImageInt64Atomics"
+      , checkFeature  = shaderImageInt64Atomics :: PhysicalDeviceShaderImageAtomicInt64FeaturesEXT -> Bool
+      , enableFeature = \f -> f { shaderImageInt64Atomics = True } :: PhysicalDeviceShaderImageAtomicInt64FeaturesEXT
+      }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_SHADER_IMAGE_ATOMIC_INT64_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_SHADER_IMAGE_ATOMIC_INT64_SPEC_VERSION
+                             }
+    ]
+  "Int16" -> (,)
+    []
+    [ RequireDeviceFeature { featureName   = "shaderInt16"
+                           , checkFeature  = shaderInt16 :: PhysicalDeviceFeatures -> Bool
+                           , enableFeature = \f -> f { shaderInt16 = True } :: PhysicalDeviceFeatures
+                           }
+    ]
+  "TessellationPointSize" -> (,)
+    []
+    [ RequireDeviceFeature
+        { featureName   = "shaderTessellationAndGeometryPointSize"
+        , checkFeature  = shaderTessellationAndGeometryPointSize :: PhysicalDeviceFeatures -> Bool
+        , enableFeature = \f -> f { shaderTessellationAndGeometryPointSize = True } :: PhysicalDeviceFeatures
+        }
+    ]
+  "GeometryPointSize" -> (,)
+    []
+    [ RequireDeviceFeature
+        { featureName   = "shaderTessellationAndGeometryPointSize"
+        , checkFeature  = shaderTessellationAndGeometryPointSize :: PhysicalDeviceFeatures -> Bool
+        , enableFeature = \f -> f { shaderTessellationAndGeometryPointSize = True } :: PhysicalDeviceFeatures
+        }
+    ]
+  "ImageGatherExtended" -> (,)
+    []
+    [ RequireDeviceFeature { featureName   = "shaderImageGatherExtended"
+                           , checkFeature  = shaderImageGatherExtended :: PhysicalDeviceFeatures -> Bool
+                           , enableFeature = \f -> f { shaderImageGatherExtended = True } :: PhysicalDeviceFeatures
+                           }
+    ]
+  "StorageImageMultisample" -> (,)
+    []
+    [ RequireDeviceFeature { featureName   = "shaderStorageImageMultisample"
+                           , checkFeature  = shaderStorageImageMultisample :: PhysicalDeviceFeatures -> Bool
+                           , enableFeature = \f -> f { shaderStorageImageMultisample = True } :: PhysicalDeviceFeatures
+                           }
+    ]
+  "UniformBufferArrayDynamicIndexing" -> (,)
+    []
+    [ RequireDeviceFeature
+        { featureName   = "shaderUniformBufferArrayDynamicIndexing"
+        , checkFeature  = shaderUniformBufferArrayDynamicIndexing :: PhysicalDeviceFeatures -> Bool
+        , enableFeature = \f -> f { shaderUniformBufferArrayDynamicIndexing = True } :: PhysicalDeviceFeatures
+        }
+    ]
+  "SampledImageArrayDynamicIndexing" -> (,)
+    []
+    [ RequireDeviceFeature
+        { featureName   = "shaderSampledImageArrayDynamicIndexing"
+        , checkFeature  = shaderSampledImageArrayDynamicIndexing :: PhysicalDeviceFeatures -> Bool
+        , enableFeature = \f -> f { shaderSampledImageArrayDynamicIndexing = True } :: PhysicalDeviceFeatures
+        }
+    ]
+  "StorageBufferArrayDynamicIndexing" -> (,)
+    []
+    [ RequireDeviceFeature
+        { featureName   = "shaderStorageBufferArrayDynamicIndexing"
+        , checkFeature  = shaderStorageBufferArrayDynamicIndexing :: PhysicalDeviceFeatures -> Bool
+        , enableFeature = \f -> f { shaderStorageBufferArrayDynamicIndexing = True } :: PhysicalDeviceFeatures
+        }
+    ]
+  "StorageImageArrayDynamicIndexing" -> (,)
+    []
+    [ RequireDeviceFeature
+        { featureName   = "shaderStorageImageArrayDynamicIndexing"
+        , checkFeature  = shaderStorageImageArrayDynamicIndexing :: PhysicalDeviceFeatures -> Bool
+        , enableFeature = \f -> f { shaderStorageImageArrayDynamicIndexing = True } :: PhysicalDeviceFeatures
+        }
+    ]
+  "ClipDistance" -> (,)
+    []
+    [ RequireDeviceFeature { featureName   = "shaderClipDistance"
+                           , checkFeature  = shaderClipDistance :: PhysicalDeviceFeatures -> Bool
+                           , enableFeature = \f -> f { shaderClipDistance = True } :: PhysicalDeviceFeatures
+                           }
+    ]
+  "CullDistance" -> (,)
+    []
+    [ RequireDeviceFeature { featureName   = "shaderCullDistance"
+                           , checkFeature  = shaderCullDistance :: PhysicalDeviceFeatures -> Bool
+                           , enableFeature = \f -> f { shaderCullDistance = True } :: PhysicalDeviceFeatures
+                           }
+    ]
+  "ImageCubeArray" -> (,)
+    []
+    [ RequireDeviceFeature { featureName   = "imageCubeArray"
+                           , checkFeature  = imageCubeArray :: PhysicalDeviceFeatures -> Bool
+                           , enableFeature = \f -> f { imageCubeArray = True } :: PhysicalDeviceFeatures
+                           }
+    ]
+  "SampleRateShading" -> (,)
+    []
+    [ RequireDeviceFeature { featureName   = "sampleRateShading"
+                           , checkFeature  = sampleRateShading :: PhysicalDeviceFeatures -> Bool
+                           , enableFeature = \f -> f { sampleRateShading = True } :: PhysicalDeviceFeatures
+                           }
+    ]
+  "SparseResidency" -> (,)
+    []
+    [ RequireDeviceFeature { featureName   = "shaderResourceResidency"
+                           , checkFeature  = shaderResourceResidency :: PhysicalDeviceFeatures -> Bool
+                           , enableFeature = \f -> f { shaderResourceResidency = True } :: PhysicalDeviceFeatures
+                           }
+    ]
+  "MinLod" -> (,)
+    []
+    [ RequireDeviceFeature { featureName   = "shaderResourceMinLod"
+                           , checkFeature  = shaderResourceMinLod :: PhysicalDeviceFeatures -> Bool
+                           , enableFeature = \f -> f { shaderResourceMinLod = True } :: PhysicalDeviceFeatures
+                           }
+    ]
+  "SampledCubeArray" -> (,)
+    []
+    [ RequireDeviceFeature { featureName   = "imageCubeArray"
+                           , checkFeature  = imageCubeArray :: PhysicalDeviceFeatures -> Bool
+                           , enableFeature = \f -> f { imageCubeArray = True } :: PhysicalDeviceFeatures
+                           }
+    ]
+  "ImageMSArray" -> (,)
+    []
+    [ RequireDeviceFeature { featureName   = "shaderStorageImageMultisample"
+                           , checkFeature  = shaderStorageImageMultisample :: PhysicalDeviceFeatures -> Bool
+                           , enableFeature = \f -> f { shaderStorageImageMultisample = True } :: PhysicalDeviceFeatures
+                           }
+    ]
+  "StorageImageExtendedFormats" ->
+    (,) [RequireInstanceVersion $ MAKE_VERSION 1 0 0] [RequireDeviceVersion $ MAKE_VERSION 1 0 0]
+  "InterpolationFunction" -> (,)
+    []
+    [ RequireDeviceFeature { featureName   = "sampleRateShading"
+                           , checkFeature  = sampleRateShading :: PhysicalDeviceFeatures -> Bool
+                           , enableFeature = \f -> f { sampleRateShading = True } :: PhysicalDeviceFeatures
+                           }
+    ]
+  "StorageImageReadWithoutFormat" -> (,)
+    []
+    [ RequireDeviceFeature
+        { featureName   = "shaderStorageImageReadWithoutFormat"
+        , checkFeature  = shaderStorageImageReadWithoutFormat :: PhysicalDeviceFeatures -> Bool
+        , enableFeature = \f -> f { shaderStorageImageReadWithoutFormat = True } :: PhysicalDeviceFeatures
+        }
+    ]
+  "StorageImageWriteWithoutFormat" -> (,)
+    []
+    [ RequireDeviceFeature
+        { featureName   = "shaderStorageImageWriteWithoutFormat"
+        , checkFeature  = shaderStorageImageWriteWithoutFormat :: PhysicalDeviceFeatures -> Bool
+        , enableFeature = \f -> f { shaderStorageImageWriteWithoutFormat = True } :: PhysicalDeviceFeatures
+        }
+    ]
+  "MultiViewport" -> (,)
+    []
+    [ RequireDeviceFeature { featureName   = "multiViewport"
+                           , checkFeature  = multiViewport :: PhysicalDeviceFeatures -> Bool
+                           , enableFeature = \f -> f { multiViewport = True } :: PhysicalDeviceFeatures
+                           }
+    ]
+  "DrawParameters" -> (,)
+    [RequireInstanceVersion $ MAKE_VERSION 1 1 0]
+    [ RequireDeviceFeature { featureName   = "shaderDrawParameters"
+                           , checkFeature  = shaderDrawParameters :: PhysicalDeviceVulkan11Features -> Bool
+                           , enableFeature = \f -> f { shaderDrawParameters = True } :: PhysicalDeviceVulkan11Features
+                           }
+    , RequireDeviceVersion $ MAKE_VERSION 1 1 0
+    ]
+  "MultiView" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 1 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature { featureName   = "multiview"
+                           , checkFeature  = multiview :: PhysicalDeviceVulkan11Features -> Bool
+                           , enableFeature = \f -> f { multiview = True } :: PhysicalDeviceVulkan11Features
+                           }
+    , RequireDeviceVersion $ MAKE_VERSION 1 1 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_MULTIVIEW_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_MULTIVIEW_SPEC_VERSION
+                             }
+    ]
+  "DeviceGroup" -> (,) [RequireInstanceVersion $ MAKE_VERSION 1 1 0] [RequireDeviceVersion $ MAKE_VERSION 1 1 0]
+  "VariablePointersStorageBuffer" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 1 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "variablePointersStorageBuffer"
+      , checkFeature  = variablePointersStorageBuffer :: PhysicalDeviceVulkan11Features -> Bool
+      , enableFeature = \f -> f { variablePointersStorageBuffer = True } :: PhysicalDeviceVulkan11Features
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 1 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_VARIABLE_POINTERS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_VARIABLE_POINTERS_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_STORAGE_BUFFER_STORAGE_CLASS_SPEC_VERSION
+                             }
+    ]
+  "VariablePointers" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 1 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature { featureName   = "variablePointers"
+                           , checkFeature  = variablePointers :: PhysicalDeviceVulkan11Features -> Bool
+                           , enableFeature = \f -> f { variablePointers = True } :: PhysicalDeviceVulkan11Features
+                           }
+    , RequireDeviceVersion $ MAKE_VERSION 1 1 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_VARIABLE_POINTERS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_VARIABLE_POINTERS_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_STORAGE_BUFFER_STORAGE_CLASS_SPEC_VERSION
+                             }
+    ]
+  "ShaderClockKHR" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_SHADER_CLOCK_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_SHADER_CLOCK_SPEC_VERSION
+                             }
+    ]
+  "StencilExportEXT" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_SHADER_STENCIL_EXPORT_SPEC_VERSION
+                             }
+    ]
+  "SubgroupBallotKHR" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_SHADER_SUBGROUP_BALLOT_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_SHADER_SUBGROUP_BALLOT_SPEC_VERSION
+                             }
+    ]
+  "SubgroupVoteKHR" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_SHADER_SUBGROUP_VOTE_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_SHADER_SUBGROUP_VOTE_SPEC_VERSION
+                             }
+    ]
+  "ImageReadWriteLodAMD" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = AMD_SHADER_IMAGE_LOAD_STORE_LOD_EXTENSION_NAME
+                             , deviceExtensionMinVersion = AMD_SHADER_IMAGE_LOAD_STORE_LOD_SPEC_VERSION
+                             }
+    ]
+  "ImageGatherBiasLodAMD" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = AMD_TEXTURE_GATHER_BIAS_LOD_EXTENSION_NAME
+                             , deviceExtensionMinVersion = AMD_TEXTURE_GATHER_BIAS_LOD_SPEC_VERSION
+                             }
+    ]
+  "FragmentMaskAMD" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = AMD_SHADER_FRAGMENT_MASK_EXTENSION_NAME
+                             , deviceExtensionMinVersion = AMD_SHADER_FRAGMENT_MASK_SPEC_VERSION
+                             }
+    ]
+  "SampleMaskOverrideCoverageNV" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NV_SAMPLE_MASK_OVERRIDE_COVERAGE_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NV_SAMPLE_MASK_OVERRIDE_COVERAGE_SPEC_VERSION
+                             }
+    ]
+  "GeometryShaderPassthroughNV" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NV_GEOMETRY_SHADER_PASSTHROUGH_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NV_GEOMETRY_SHADER_PASSTHROUGH_SPEC_VERSION
+                             }
+    ]
+  "ShaderViewportIndex" -> (,)
+    [RequireInstanceVersion $ MAKE_VERSION 1 2 0]
+    [ RequireDeviceFeature
+      { featureName   = "shaderOutputViewportIndex"
+      , checkFeature  = shaderOutputViewportIndex :: PhysicalDeviceVulkan12Features -> Bool
+      , enableFeature = \f -> f { shaderOutputViewportIndex = True } :: PhysicalDeviceVulkan12Features
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    ]
+  "ShaderLayer" -> (,)
+    [RequireInstanceVersion $ MAKE_VERSION 1 2 0]
+    [ RequireDeviceFeature { featureName   = "shaderOutputLayer"
+                           , checkFeature  = shaderOutputLayer :: PhysicalDeviceVulkan12Features -> Bool
+                           , enableFeature = \f -> f { shaderOutputLayer = True } :: PhysicalDeviceVulkan12Features
+                           }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    ]
+  "ShaderViewportIndexLayerEXT" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_SHADER_VIEWPORT_INDEX_LAYER_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_SHADER_VIEWPORT_INDEX_LAYER_SPEC_VERSION
+                             }
+    ]
+  "ShaderViewportIndexLayerNV" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NV_VIEWPORT_ARRAY2_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NV_VIEWPORT_ARRAY2_SPEC_VERSION
+                             }
+    ]
+  "ShaderViewportMaskNV" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NV_VIEWPORT_ARRAY2_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NV_VIEWPORT_ARRAY2_SPEC_VERSION
+                             }
+    ]
+  "PerViewAttributesNV" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NVX_MULTIVIEW_PER_VIEW_ATTRIBUTES_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NVX_MULTIVIEW_PER_VIEW_ATTRIBUTES_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_MULTIVIEW_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_MULTIVIEW_SPEC_VERSION
+                             }
+    ]
+  "StorageBuffer16BitAccess" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 1 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "storageBuffer16BitAccess"
+      , checkFeature  = storageBuffer16BitAccess :: PhysicalDeviceVulkan11Features -> Bool
+      , enableFeature = \f -> f { storageBuffer16BitAccess = True } :: PhysicalDeviceVulkan11Features
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 1 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_16BIT_STORAGE_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_16BIT_STORAGE_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_STORAGE_BUFFER_STORAGE_CLASS_SPEC_VERSION
+                             }
+    ]
+  "UniformAndStorageBuffer16BitAccess" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 1 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "uniformAndStorageBuffer16BitAccess"
+      , checkFeature  = uniformAndStorageBuffer16BitAccess :: PhysicalDeviceVulkan11Features -> Bool
+      , enableFeature = \f -> f { uniformAndStorageBuffer16BitAccess = True } :: PhysicalDeviceVulkan11Features
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 1 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_16BIT_STORAGE_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_16BIT_STORAGE_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_STORAGE_BUFFER_STORAGE_CLASS_SPEC_VERSION
+                             }
+    ]
+  "StoragePushConstant16" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 1 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature { featureName   = "storagePushConstant16"
+                           , checkFeature  = storagePushConstant16 :: PhysicalDeviceVulkan11Features -> Bool
+                           , enableFeature = \f -> f { storagePushConstant16 = True } :: PhysicalDeviceVulkan11Features
+                           }
+    , RequireDeviceVersion $ MAKE_VERSION 1 1 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_16BIT_STORAGE_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_16BIT_STORAGE_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_STORAGE_BUFFER_STORAGE_CLASS_SPEC_VERSION
+                             }
+    ]
+  "StorageInputOutput16" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 1 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature { featureName   = "storageInputOutput16"
+                           , checkFeature  = storageInputOutput16 :: PhysicalDeviceVulkan11Features -> Bool
+                           , enableFeature = \f -> f { storageInputOutput16 = True } :: PhysicalDeviceVulkan11Features
+                           }
+    , RequireDeviceVersion $ MAKE_VERSION 1 1 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_16BIT_STORAGE_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_16BIT_STORAGE_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_STORAGE_BUFFER_STORAGE_CLASS_SPEC_VERSION
+                             }
+    ]
+  "GroupNonUniform" -> (,)
+    [RequireInstanceVersion $ MAKE_VERSION 1 1 0]
+    [ RequireDeviceProperty
+      { propertyName  = "VkPhysicalDeviceVulkan11Properties"
+      , checkProperty = \p ->
+        SUBGROUP_FEATURE_BASIC_BIT .&&. subgroupSupportedOperations (p :: PhysicalDeviceVulkan11Properties)
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 1 0
+    ]
+  "GroupNonUniformVote" -> (,)
+    [RequireInstanceVersion $ MAKE_VERSION 1 1 0]
+    [ RequireDeviceProperty
+      { propertyName  = "VkPhysicalDeviceVulkan11Properties"
+      , checkProperty = \p ->
+        SUBGROUP_FEATURE_VOTE_BIT .&&. subgroupSupportedOperations (p :: PhysicalDeviceVulkan11Properties)
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 1 0
+    ]
+  "GroupNonUniformArithmetic" -> (,)
+    [RequireInstanceVersion $ MAKE_VERSION 1 1 0]
+    [ RequireDeviceProperty
+      { propertyName  = "VkPhysicalDeviceVulkan11Properties"
+      , checkProperty = \p ->
+        SUBGROUP_FEATURE_ARITHMETIC_BIT .&&. subgroupSupportedOperations (p :: PhysicalDeviceVulkan11Properties)
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 1 0
+    ]
+  "GroupNonUniformBallot" -> (,)
+    [RequireInstanceVersion $ MAKE_VERSION 1 1 0]
+    [ RequireDeviceProperty
+      { propertyName  = "VkPhysicalDeviceVulkan11Properties"
+      , checkProperty = \p ->
+        SUBGROUP_FEATURE_BALLOT_BIT .&&. subgroupSupportedOperations (p :: PhysicalDeviceVulkan11Properties)
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 1 0
+    ]
+  "GroupNonUniformShuffle" -> (,)
+    [RequireInstanceVersion $ MAKE_VERSION 1 1 0]
+    [ RequireDeviceProperty
+      { propertyName  = "VkPhysicalDeviceVulkan11Properties"
+      , checkProperty = \p ->
+        SUBGROUP_FEATURE_SHUFFLE_BIT .&&. subgroupSupportedOperations (p :: PhysicalDeviceVulkan11Properties)
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 1 0
+    ]
+  "GroupNonUniformShuffleRelative" -> (,)
+    [RequireInstanceVersion $ MAKE_VERSION 1 1 0]
+    [ RequireDeviceProperty
+      { propertyName  = "VkPhysicalDeviceVulkan11Properties"
+      , checkProperty = \p ->
+        SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT .&&. subgroupSupportedOperations (p :: PhysicalDeviceVulkan11Properties)
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 1 0
+    ]
+  "GroupNonUniformClustered" -> (,)
+    [RequireInstanceVersion $ MAKE_VERSION 1 1 0]
+    [ RequireDeviceProperty
+      { propertyName  = "VkPhysicalDeviceVulkan11Properties"
+      , checkProperty = \p ->
+        SUBGROUP_FEATURE_CLUSTERED_BIT .&&. subgroupSupportedOperations (p :: PhysicalDeviceVulkan11Properties)
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 1 0
+    ]
+  "GroupNonUniformQuad" -> (,)
+    [RequireInstanceVersion $ MAKE_VERSION 1 1 0]
+    [ RequireDeviceProperty
+      { propertyName  = "VkPhysicalDeviceVulkan11Properties"
+      , checkProperty = \p ->
+        SUBGROUP_FEATURE_QUAD_BIT .&&. subgroupSupportedOperations (p :: PhysicalDeviceVulkan11Properties)
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 1 0
+    ]
+  "GroupNonUniformPartitionedNV" -> (,)
+    []
+    [ RequireDeviceProperty
+      { propertyName  = "VkPhysicalDeviceVulkan11Properties"
+      , checkProperty = \p ->
+        SUBGROUP_FEATURE_PARTITIONED_BIT_NV .&&. subgroupSupportedOperations (p :: PhysicalDeviceVulkan11Properties)
+      }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NV_SHADER_SUBGROUP_PARTITIONED_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NV_SHADER_SUBGROUP_PARTITIONED_SPEC_VERSION
+                             }
+    ]
+  "SampleMaskPostDepthCoverage" -> (,)
+    []
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_POST_DEPTH_COVERAGE_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_POST_DEPTH_COVERAGE_SPEC_VERSION
+                             }
+    ]
+  "ShaderNonUniform" -> (,) [RequireInstanceVersion $ MAKE_VERSION 1 2 0] [RequireDeviceVersion $ MAKE_VERSION 1 2 0]
+  "RuntimeDescriptorArray" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 2 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature { featureName   = "runtimeDescriptorArray"
+                           , checkFeature  = runtimeDescriptorArray :: PhysicalDeviceVulkan12Features -> Bool
+                           , enableFeature = \f -> f { runtimeDescriptorArray = True } :: PhysicalDeviceVulkan12Features
+                           }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_DESCRIPTOR_INDEXING_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_MAINTENANCE3_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_MAINTENANCE3_SPEC_VERSION
+                             }
+    ]
+  "InputAttachmentArrayDynamicIndexing" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 2 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "shaderInputAttachmentArrayDynamicIndexing"
+      , checkFeature  = shaderInputAttachmentArrayDynamicIndexing :: PhysicalDeviceVulkan12Features -> Bool
+      , enableFeature = \f -> f { shaderInputAttachmentArrayDynamicIndexing = True } :: PhysicalDeviceVulkan12Features
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_DESCRIPTOR_INDEXING_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_MAINTENANCE3_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_MAINTENANCE3_SPEC_VERSION
+                             }
+    ]
+  "UniformTexelBufferArrayDynamicIndexing" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 2 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "shaderUniformTexelBufferArrayDynamicIndexing"
+      , checkFeature  = shaderUniformTexelBufferArrayDynamicIndexing :: PhysicalDeviceVulkan12Features -> Bool
+      , enableFeature = \f ->
+                          f { shaderUniformTexelBufferArrayDynamicIndexing = True } :: PhysicalDeviceVulkan12Features
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_DESCRIPTOR_INDEXING_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_MAINTENANCE3_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_MAINTENANCE3_SPEC_VERSION
+                             }
+    ]
+  "StorageTexelBufferArrayDynamicIndexing" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 2 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "shaderStorageTexelBufferArrayDynamicIndexing"
+      , checkFeature  = shaderStorageTexelBufferArrayDynamicIndexing :: PhysicalDeviceVulkan12Features -> Bool
+      , enableFeature = \f ->
+                          f { shaderStorageTexelBufferArrayDynamicIndexing = True } :: PhysicalDeviceVulkan12Features
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_DESCRIPTOR_INDEXING_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_MAINTENANCE3_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_MAINTENANCE3_SPEC_VERSION
+                             }
+    ]
+  "UniformBufferArrayNonUniformIndexing" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 2 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "shaderUniformBufferArrayNonUniformIndexing"
+      , checkFeature  = shaderUniformBufferArrayNonUniformIndexing :: PhysicalDeviceVulkan12Features -> Bool
+      , enableFeature = \f -> f { shaderUniformBufferArrayNonUniformIndexing = True } :: PhysicalDeviceVulkan12Features
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_DESCRIPTOR_INDEXING_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_MAINTENANCE3_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_MAINTENANCE3_SPEC_VERSION
+                             }
+    ]
+  "SampledImageArrayNonUniformIndexing" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 2 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "shaderSampledImageArrayNonUniformIndexing"
+      , checkFeature  = shaderSampledImageArrayNonUniformIndexing :: PhysicalDeviceVulkan12Features -> Bool
+      , enableFeature = \f -> f { shaderSampledImageArrayNonUniformIndexing = True } :: PhysicalDeviceVulkan12Features
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_DESCRIPTOR_INDEXING_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_MAINTENANCE3_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_MAINTENANCE3_SPEC_VERSION
+                             }
+    ]
+  "StorageBufferArrayNonUniformIndexing" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 2 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "shaderStorageBufferArrayNonUniformIndexing"
+      , checkFeature  = shaderStorageBufferArrayNonUniformIndexing :: PhysicalDeviceVulkan12Features -> Bool
+      , enableFeature = \f -> f { shaderStorageBufferArrayNonUniformIndexing = True } :: PhysicalDeviceVulkan12Features
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_DESCRIPTOR_INDEXING_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_MAINTENANCE3_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_MAINTENANCE3_SPEC_VERSION
+                             }
+    ]
+  "StorageImageArrayNonUniformIndexing" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 2 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "shaderStorageImageArrayNonUniformIndexing"
+      , checkFeature  = shaderStorageImageArrayNonUniformIndexing :: PhysicalDeviceVulkan12Features -> Bool
+      , enableFeature = \f -> f { shaderStorageImageArrayNonUniformIndexing = True } :: PhysicalDeviceVulkan12Features
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_DESCRIPTOR_INDEXING_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_MAINTENANCE3_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_MAINTENANCE3_SPEC_VERSION
+                             }
+    ]
+  "InputAttachmentArrayNonUniformIndexing" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 2 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "shaderInputAttachmentArrayNonUniformIndexing"
+      , checkFeature  = shaderInputAttachmentArrayNonUniformIndexing :: PhysicalDeviceVulkan12Features -> Bool
+      , enableFeature = \f ->
+                          f { shaderInputAttachmentArrayNonUniformIndexing = True } :: PhysicalDeviceVulkan12Features
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_DESCRIPTOR_INDEXING_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_MAINTENANCE3_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_MAINTENANCE3_SPEC_VERSION
+                             }
+    ]
+  "UniformTexelBufferArrayNonUniformIndexing" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 2 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "shaderUniformTexelBufferArrayNonUniformIndexing"
+      , checkFeature  = shaderUniformTexelBufferArrayNonUniformIndexing :: PhysicalDeviceVulkan12Features -> Bool
+      , enableFeature = \f ->
+                          f { shaderUniformTexelBufferArrayNonUniformIndexing = True } :: PhysicalDeviceVulkan12Features
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_DESCRIPTOR_INDEXING_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_MAINTENANCE3_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_MAINTENANCE3_SPEC_VERSION
+                             }
+    ]
+  "StorageTexelBufferArrayNonUniformIndexing" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 2 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "shaderStorageTexelBufferArrayNonUniformIndexing"
+      , checkFeature  = shaderStorageTexelBufferArrayNonUniformIndexing :: PhysicalDeviceVulkan12Features -> Bool
+      , enableFeature = \f ->
+                          f { shaderStorageTexelBufferArrayNonUniformIndexing = True } :: PhysicalDeviceVulkan12Features
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_DESCRIPTOR_INDEXING_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_MAINTENANCE3_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_MAINTENANCE3_SPEC_VERSION
+                             }
+    ]
+  "Float16" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 2 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature { featureName   = "shaderFloat16"
+                           , checkFeature  = shaderFloat16 :: PhysicalDeviceVulkan12Features -> Bool
+                           , enableFeature = \f -> f { shaderFloat16 = True } :: PhysicalDeviceVulkan12Features
+                           }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_SHADER_FLOAT16_INT8_SPEC_VERSION
+                             }
+    ]
+  "Int8" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 2 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature { featureName   = "shaderInt8"
+                           , checkFeature  = shaderInt8 :: PhysicalDeviceVulkan12Features -> Bool
+                           , enableFeature = \f -> f { shaderInt8 = True } :: PhysicalDeviceVulkan12Features
+                           }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_SHADER_FLOAT16_INT8_SPEC_VERSION
+                             }
+    ]
+  "StorageBuffer8BitAccess" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 2 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "storageBuffer8BitAccess"
+      , checkFeature  = storageBuffer8BitAccess :: PhysicalDeviceVulkan12Features -> Bool
+      , enableFeature = \f -> f { storageBuffer8BitAccess = True } :: PhysicalDeviceVulkan12Features
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_8BIT_STORAGE_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_8BIT_STORAGE_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_STORAGE_BUFFER_STORAGE_CLASS_SPEC_VERSION
+                             }
+    ]
+  "UniformAndStorageBuffer8BitAccess" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 2 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "uniformAndStorageBuffer8BitAccess"
+      , checkFeature  = uniformAndStorageBuffer8BitAccess :: PhysicalDeviceVulkan12Features -> Bool
+      , enableFeature = \f -> f { uniformAndStorageBuffer8BitAccess = True } :: PhysicalDeviceVulkan12Features
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_8BIT_STORAGE_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_8BIT_STORAGE_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_STORAGE_BUFFER_STORAGE_CLASS_SPEC_VERSION
+                             }
+    ]
+  "StoragePushConstant8" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 2 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature { featureName   = "storagePushConstant8"
+                           , checkFeature  = storagePushConstant8 :: PhysicalDeviceVulkan12Features -> Bool
+                           , enableFeature = \f -> f { storagePushConstant8 = True } :: PhysicalDeviceVulkan12Features
+                           }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_8BIT_STORAGE_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_8BIT_STORAGE_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_STORAGE_BUFFER_STORAGE_CLASS_SPEC_VERSION
+                             }
+    ]
+  "VulkanMemoryModel" -> (,)
+    [RequireInstanceVersion $ MAKE_VERSION 1 2 0]
+    [ RequireDeviceFeature { featureName   = "vulkanMemoryModel"
+                           , checkFeature  = vulkanMemoryModel :: PhysicalDeviceVulkan12Features -> Bool
+                           , enableFeature = \f -> f { vulkanMemoryModel = True } :: PhysicalDeviceVulkan12Features
+                           }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_VULKAN_MEMORY_MODEL_SPEC_VERSION
+                             }
+    ]
+  "VulkanMemoryModelDeviceScope" -> (,)
+    [RequireInstanceVersion $ MAKE_VERSION 1 2 0]
+    [ RequireDeviceFeature
+      { featureName   = "vulkanMemoryModelDeviceScope"
+      , checkFeature  = vulkanMemoryModelDeviceScope :: PhysicalDeviceVulkan12Features -> Bool
+      , enableFeature = \f -> f { vulkanMemoryModelDeviceScope = True } :: PhysicalDeviceVulkan12Features
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_VULKAN_MEMORY_MODEL_SPEC_VERSION
+                             }
+    ]
+  "DenormPreserve" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 2 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceProperty { propertyName  = "VkPhysicalDeviceVulkan12Properties"
+                            , checkProperty = \p -> shaderDenormPreserveFloat16 (p :: PhysicalDeviceVulkan12Properties)
+                            }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_SHADER_FLOAT_CONTROLS_SPEC_VERSION
+                             }
+    ]
+  "DenormFlushToZero" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 2 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceProperty
+      { propertyName  = "VkPhysicalDeviceVulkan12Properties"
+      , checkProperty = \p -> shaderDenormFlushToZeroFloat16 (p :: PhysicalDeviceVulkan12Properties)
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_SHADER_FLOAT_CONTROLS_SPEC_VERSION
+                             }
+    ]
+  "SignedZeroInfNanPreserve" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 2 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceProperty
+      { propertyName  = "VkPhysicalDeviceVulkan12Properties"
+      , checkProperty = \p -> shaderSignedZeroInfNanPreserveFloat16 (p :: PhysicalDeviceVulkan12Properties)
+      }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_SHADER_FLOAT_CONTROLS_SPEC_VERSION
+                             }
+    ]
+  "RoundingModeRTE" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 2 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceProperty { propertyName  = "VkPhysicalDeviceVulkan12Properties"
+                            , checkProperty = \p -> shaderRoundingModeRTEFloat16 (p :: PhysicalDeviceVulkan12Properties)
+                            }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_SHADER_FLOAT_CONTROLS_SPEC_VERSION
+                             }
+    ]
+  "RoundingModeRTZ" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 2 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceProperty { propertyName  = "VkPhysicalDeviceVulkan12Properties"
+                            , checkProperty = \p -> shaderRoundingModeRTZFloat16 (p :: PhysicalDeviceVulkan12Properties)
+                            }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_SHADER_FLOAT_CONTROLS_SPEC_VERSION
+                             }
+    ]
+  "ComputeDerivativeGroupQuadsNV" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "computeDerivativeGroupQuads"
+      , checkFeature  = computeDerivativeGroupQuads :: PhysicalDeviceComputeShaderDerivativesFeaturesNV -> Bool
+      , enableFeature = \f ->
+                          f { computeDerivativeGroupQuads = True } :: PhysicalDeviceComputeShaderDerivativesFeaturesNV
+      }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NV_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NV_COMPUTE_SHADER_DERIVATIVES_SPEC_VERSION
+                             }
+    ]
+  "ComputeDerivativeGroupLinearNV" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "computeDerivativeGroupLinear"
+      , checkFeature  = computeDerivativeGroupLinear :: PhysicalDeviceComputeShaderDerivativesFeaturesNV -> Bool
+      , enableFeature = \f ->
+                          f { computeDerivativeGroupLinear = True } :: PhysicalDeviceComputeShaderDerivativesFeaturesNV
+      }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NV_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NV_COMPUTE_SHADER_DERIVATIVES_SPEC_VERSION
+                             }
+    ]
+  "FragmentBarycentricNV" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "fragmentShaderBarycentric"
+      , checkFeature  = fragmentShaderBarycentric :: PhysicalDeviceFragmentShaderBarycentricFeaturesNV -> Bool
+      , enableFeature = \f ->
+                          f { fragmentShaderBarycentric = True } :: PhysicalDeviceFragmentShaderBarycentricFeaturesNV
+      }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NV_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NV_FRAGMENT_SHADER_BARYCENTRIC_SPEC_VERSION
+                             }
+    ]
+  "ImageFootprintNV" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "imageFootprint"
+      , checkFeature  = imageFootprint :: PhysicalDeviceShaderImageFootprintFeaturesNV -> Bool
+      , enableFeature = \f -> f { imageFootprint = True } :: PhysicalDeviceShaderImageFootprintFeaturesNV
+      }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NV_SHADER_IMAGE_FOOTPRINT_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NV_SHADER_IMAGE_FOOTPRINT_SPEC_VERSION
+                             }
+    ]
+  "ShadingRateNV" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "shadingRateImage"
+      , checkFeature  = shadingRateImage :: PhysicalDeviceShadingRateImageFeaturesNV -> Bool
+      , enableFeature = \f -> f { shadingRateImage = True } :: PhysicalDeviceShadingRateImageFeaturesNV
+      }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NV_SHADING_RATE_IMAGE_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NV_SHADING_RATE_IMAGE_SPEC_VERSION
+                             }
+    ]
+  "MeshShadingNV" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NV_MESH_SHADER_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NV_MESH_SHADER_SPEC_VERSION
+                             }
+    ]
+  "RayTracingKHR" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "rayTracingPipeline"
+      , checkFeature  = rayTracingPipeline :: PhysicalDeviceRayTracingPipelineFeaturesKHR -> Bool
+      , enableFeature = \f -> f { rayTracingPipeline = True } :: PhysicalDeviceRayTracingPipelineFeaturesKHR
+      }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_RAY_TRACING_PIPELINE_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_SPIRV_1_4_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_SPIRV_1_4_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_ACCELERATION_STRUCTURE_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_SHADER_FLOAT_CONTROLS_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_DESCRIPTOR_INDEXING_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_BUFFER_DEVICE_ADDRESS_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_DEFERRED_HOST_OPERATIONS_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_MAINTENANCE3_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_MAINTENANCE3_SPEC_VERSION
+                             }
+    ]
+  "RayQueryKHR" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature { featureName   = "rayQuery"
+                           , checkFeature  = rayQuery :: PhysicalDeviceRayQueryFeaturesKHR -> Bool
+                           , enableFeature = \f -> f { rayQuery = True } :: PhysicalDeviceRayQueryFeaturesKHR
+                           }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_RAY_QUERY_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_RAY_QUERY_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_SPIRV_1_4_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_SPIRV_1_4_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_ACCELERATION_STRUCTURE_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_SHADER_FLOAT_CONTROLS_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_DESCRIPTOR_INDEXING_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_BUFFER_DEVICE_ADDRESS_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_DEFERRED_HOST_OPERATIONS_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_MAINTENANCE3_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_MAINTENANCE3_SPEC_VERSION
+                             }
+    ]
+  "RayTraversalPrimitiveCullingKHR" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "rayTraversalPrimitiveCulling"
+      , checkFeature  = rayTraversalPrimitiveCulling :: PhysicalDeviceRayTracingPipelineFeaturesKHR -> Bool
+      , enableFeature = \f -> f { rayTraversalPrimitiveCulling = True } :: PhysicalDeviceRayTracingPipelineFeaturesKHR
+      }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_RAY_TRACING_PIPELINE_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_SPIRV_1_4_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_SPIRV_1_4_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_ACCELERATION_STRUCTURE_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_SHADER_FLOAT_CONTROLS_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_DESCRIPTOR_INDEXING_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_BUFFER_DEVICE_ADDRESS_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_DEFERRED_HOST_OPERATIONS_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_MAINTENANCE3_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_MAINTENANCE3_SPEC_VERSION
+                             }
+    ]
+  "RayTracingNV" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NV_RAY_TRACING_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NV_RAY_TRACING_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION
+                             }
+    ]
+  "TransformFeedback" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "transformFeedback"
+      , checkFeature  = transformFeedback :: PhysicalDeviceTransformFeedbackFeaturesEXT -> Bool
+      , enableFeature = \f -> f { transformFeedback = True } :: PhysicalDeviceTransformFeedbackFeaturesEXT
+      }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_TRANSFORM_FEEDBACK_SPEC_VERSION
+                             }
+    ]
+  "GeometryStreams" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "geometryStreams"
+      , checkFeature  = geometryStreams :: PhysicalDeviceTransformFeedbackFeaturesEXT -> Bool
+      , enableFeature = \f -> f { geometryStreams = True } :: PhysicalDeviceTransformFeedbackFeaturesEXT
+      }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_TRANSFORM_FEEDBACK_SPEC_VERSION
+                             }
+    ]
+  "FragmentDensityEXT" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "fragmentDensityMap"
+      , checkFeature  = fragmentDensityMap :: PhysicalDeviceFragmentDensityMapFeaturesEXT -> Bool
+      , enableFeature = \f -> f { fragmentDensityMap = True } :: PhysicalDeviceFragmentDensityMapFeaturesEXT
+      }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_FRAGMENT_DENSITY_MAP_SPEC_VERSION
+                             }
+    ]
+  "PhysicalStorageBufferAddresses" -> (,)
+    [ RequireInstanceVersion $ MAKE_VERSION 1 2 0
+    , RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature { featureName   = "bufferDeviceAddress"
+                           , checkFeature  = bufferDeviceAddress :: PhysicalDeviceVulkan12Features -> Bool
+                           , enableFeature = \f -> f { bufferDeviceAddress = True } :: PhysicalDeviceVulkan12Features
+                           }
+    , RequireDeviceVersion $ MAKE_VERSION 1 2 0
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_BUFFER_DEVICE_ADDRESS_SPEC_VERSION
+                             }
+    ]
+  "CooperativeMatrixNV" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "cooperativeMatrix"
+      , checkFeature  = cooperativeMatrix :: PhysicalDeviceCooperativeMatrixFeaturesNV -> Bool
+      , enableFeature = \f -> f { cooperativeMatrix = True } :: PhysicalDeviceCooperativeMatrixFeaturesNV
+      }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NV_COOPERATIVE_MATRIX_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NV_COOPERATIVE_MATRIX_SPEC_VERSION
+                             }
+    ]
+  "IntegerFunctions2INTEL" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "shaderIntegerFunctions2"
+      , checkFeature  = shaderIntegerFunctions2 :: PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL -> Bool
+      , enableFeature = \f -> f { shaderIntegerFunctions2 = True } :: PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL
+      }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = INTEL_SHADER_INTEGER_FUNCTIONS_2_EXTENSION_NAME
+                             , deviceExtensionMinVersion = INTEL_SHADER_INTEGER_FUNCTIONS_2_SPEC_VERSION
+                             }
+    ]
+  "ShaderSMBuiltinsNV" -> (,)
+    []
+    [ RequireDeviceFeature
+      { featureName   = "shaderSMBuiltins"
+      , checkFeature  = shaderSMBuiltins :: PhysicalDeviceShaderSMBuiltinsFeaturesNV -> Bool
+      , enableFeature = \f -> f { shaderSMBuiltins = True } :: PhysicalDeviceShaderSMBuiltinsFeaturesNV
+      }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = NV_SHADER_SM_BUILTINS_EXTENSION_NAME
+                             , deviceExtensionMinVersion = NV_SHADER_SM_BUILTINS_SPEC_VERSION
+                             }
+    ]
+  "FragmentShaderSampleInterlockEXT" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "fragmentShaderSampleInterlock"
+      , checkFeature  = fragmentShaderSampleInterlock :: PhysicalDeviceFragmentShaderInterlockFeaturesEXT -> Bool
+      , enableFeature = \f ->
+                          f { fragmentShaderSampleInterlock = True } :: PhysicalDeviceFragmentShaderInterlockFeaturesEXT
+      }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_FRAGMENT_SHADER_INTERLOCK_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_FRAGMENT_SHADER_INTERLOCK_SPEC_VERSION
+                             }
+    ]
+  "FragmentShaderPixelInterlockEXT" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "fragmentShaderPixelInterlock"
+      , checkFeature  = fragmentShaderPixelInterlock :: PhysicalDeviceFragmentShaderInterlockFeaturesEXT -> Bool
+      , enableFeature = \f ->
+                          f { fragmentShaderPixelInterlock = True } :: PhysicalDeviceFragmentShaderInterlockFeaturesEXT
+      }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_FRAGMENT_SHADER_INTERLOCK_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_FRAGMENT_SHADER_INTERLOCK_SPEC_VERSION
+                             }
+    ]
+  "FragmentShaderShadingRateInterlockEXT" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "fragmentShaderShadingRateInterlock"
+      , checkFeature  = fragmentShaderShadingRateInterlock :: PhysicalDeviceFragmentShaderInterlockFeaturesEXT -> Bool
+      , enableFeature = \f ->
+        f { fragmentShaderShadingRateInterlock = True } :: PhysicalDeviceFragmentShaderInterlockFeaturesEXT
+      }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_FRAGMENT_SHADER_INTERLOCK_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_FRAGMENT_SHADER_INTERLOCK_SPEC_VERSION
+                             }
+    ]
+  "DemoteToHelperInvocationEXT" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName = "shaderDemoteToHelperInvocation"
+      , checkFeature = shaderDemoteToHelperInvocation :: PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT -> Bool
+      , enableFeature = \f ->
+        f { shaderDemoteToHelperInvocation = True } :: PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT
+      }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME
+                             , deviceExtensionMinVersion = EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_SPEC_VERSION
+                             }
+    ]
+  "FragmentShadingRateKHR" -> (,)
+    [ RequireInstanceExtension { instanceExtensionLayerName  = Nothing
+                               , instanceExtensionName       = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
+                               , instanceExtensionMinVersion = KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION
+                               }
+    ]
+    [ RequireDeviceFeature
+      { featureName   = "pipelineFragmentShadingRate"
+      , checkFeature  = pipelineFragmentShadingRate :: PhysicalDeviceFragmentShadingRateFeaturesKHR -> Bool
+      , enableFeature = \f -> f { pipelineFragmentShadingRate = True } :: PhysicalDeviceFragmentShadingRateFeaturesKHR
+      }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_FRAGMENT_SHADING_RATE_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_CREATE_RENDERPASS_2_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_CREATE_RENDERPASS_2_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_MULTIVIEW_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_MULTIVIEW_SPEC_VERSION
+                             }
+    , RequireDeviceExtension { deviceExtensionLayerName  = Nothing
+                             , deviceExtensionName       = KHR_MAINTENANCE2_EXTENSION_NAME
+                             , deviceExtensionMinVersion = KHR_MAINTENANCE2_SPEC_VERSION
+                             }
+    ]
+  _ -> ([], [])
+
diff --git a/src/Vulkan/Version.hs b/src/Vulkan/Version.hs
--- a/src/Vulkan/Version.hs
+++ b/src/Vulkan/Version.hs
@@ -15,11 +15,11 @@
 import Data.Word (Word32)
 
 pattern HEADER_VERSION :: Word32
-pattern HEADER_VERSION = 162
+pattern HEADER_VERSION = 163
 
 
 pattern HEADER_VERSION_COMPLETE :: Word32
-pattern HEADER_VERSION_COMPLETE = MAKE_VERSION 1 2 162
+pattern HEADER_VERSION_COMPLETE = MAKE_VERSION 1 2 163
 
 
 pattern MAKE_VERSION :: Word32 -> Word32 -> Word32 -> Word32
diff --git a/vulkan.cabal b/vulkan.cabal
--- a/vulkan.cabal
+++ b/vulkan.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           vulkan
-version:        3.7
+version:        3.8
 synopsis:       Bindings to the Vulkan graphics API.
 category:       Graphics
 homepage:       https://github.com/expipiplus1/vulkan#readme
@@ -247,6 +247,7 @@
       Vulkan.Dynamic
       Vulkan.Exception
       Vulkan.Extensions
+      Vulkan.Extensions.Dependencies
       Vulkan.Extensions.Handles
       Vulkan.Extensions.VK_AMD_buffer_marker
       Vulkan.Extensions.VK_AMD_device_coherent_memory
@@ -470,9 +471,11 @@
       Vulkan.Extensions.VK_QCOM_render_pass_transform
       Vulkan.Extensions.VK_QCOM_rotated_copy_commands
       Vulkan.NamedType
+      Vulkan.SPIRVRequirements
       Vulkan.Version
       Vulkan.Zero
       Vulkan.Internal.Utils
+      Vulkan.Requirement
   hs-source-dirs:
       src
       src-manual
