packages feed

vulkan-3.27: src/Vulkan/SPIRVRequirements.hs

{-# language CPP #-}
{-# language OverloadedLists #-}
{-# language TupleSections #-}
-- No documentation found for Chapter "SPIRVRequirements"
module Vulkan.SPIRVRequirements  ( spirvExtensionRequirements
                                 , spirvCapabilityRequirements
                                 ) where

import Data.Bits (Bits)
import Data.Bits (zeroBits)
import Vulkan.Requirement (DeviceRequirement(..))
import Vulkan.Requirement (InstanceRequirement(..))
import Data.Bits ((.&.))
import Data.ByteString (ByteString)
import Vulkan.Core10.Handles (Instance)
import Vulkan.Core10.Handles (PhysicalDevice)
import Vulkan.Core10.DeviceInitialization (PhysicalDeviceFeatures(..))
import Vulkan.Core11.Promoted_From_VK_KHR_shader_draw_parameters (PhysicalDeviceShaderDrawParametersFeatures(..))
import Vulkan.Core12 (PhysicalDeviceVulkan11Features(..))
import Vulkan.Core12 (PhysicalDeviceVulkan11Properties)
import Vulkan.Core12 (PhysicalDeviceVulkan11Properties(..))
import Vulkan.Core12 (PhysicalDeviceVulkan12Features(..))
import Vulkan.Version (pattern MAKE_API_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_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_API_VERSION 1 1 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 1 0]
  "SPV_AMD_shader_explicit_vertex_parameter" -> (,) [] []
  "SPV_AMD_gcn_shader" -> (,) [] []
  "SPV_AMD_gpu_shader_half_float" -> (,) [] []
  "SPV_AMD_gpu_shader_int16" -> (,) [] []
  "SPV_AMD_shader_ballot" -> (,) [] []
  "SPV_AMD_shader_fragment_mask" -> (,) [] []
  "SPV_AMD_shader_image_load_store_lod" -> (,) [] []
  "SPV_AMD_shader_trinary_minmax" -> (,) [] []
  "SPV_AMD_texture_gather_bias_lod" -> (,) [] []
  "SPV_AMD_shader_early_and_late_fragment_tests" -> (,) [] []
  "SPV_KHR_shader_draw_parameters" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 1 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 1 0]
  "SPV_KHR_8bit_storage" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 2 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 2 0]
  "SPV_KHR_16bit_storage" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 1 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 1 0]
  "SPV_KHR_shader_clock" -> (,) [] []
  "SPV_KHR_float_controls" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 2 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 2 0]
  "SPV_KHR_storage_buffer_storage_class" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 1 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 1 0]
  "SPV_KHR_post_depth_coverage" -> (,) [] []
  "SPV_EXT_shader_stencil_export" -> (,) [] []
  "SPV_KHR_shader_ballot" -> (,) [] []
  "SPV_KHR_subgroup_vote" -> (,) [] []
  "SPV_NV_sample_mask_override_coverage" -> (,) [] []
  "SPV_NV_geometry_shader_passthrough" -> (,) [] []
  "SPV_NV_mesh_shader" -> (,) [] []
  "SPV_NV_viewport_array2" -> (,) [] []
  "SPV_NV_shader_subgroup_partitioned" -> (,) [] []
  "SPV_EXT_shader_subgroup_partitioned" -> (,) [] []
  "SPV_NV_shader_invocation_reorder" -> (,) [] []
  "SPV_EXT_shader_viewport_index_layer" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 2 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 2 0]
  "SPV_NVX_multiview_per_view_attributes" -> (,) [] []
  "SPV_EXT_descriptor_indexing" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 2 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 2 0]
  "SPV_KHR_vulkan_memory_model" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 2 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 2 0]
  "SPV_NV_compute_shader_derivatives" -> (,) [] []
  "SPV_NV_fragment_shader_barycentric" -> (,) [] []
  "SPV_NV_shader_image_footprint" -> (,) [] []
  "SPV_NV_shading_rate" -> (,) [] []
  "SPV_NV_ray_tracing" -> (,) [] []
  "SPV_KHR_ray_tracing" -> (,) [] []
  "SPV_KHR_ray_query" -> (,) [] []
  "SPV_KHR_ray_cull_mask" -> (,) [] []
  "SPV_GOOGLE_hlsl_functionality1" -> (,) [] []
  "SPV_GOOGLE_user_type" -> (,) [] []
  "SPV_GOOGLE_decorate_string" -> (,) [] []
  "SPV_EXT_fragment_invocation_density" -> (,) [] []
  "SPV_KHR_physical_storage_buffer" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 2 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 2 0]
  "SPV_EXT_physical_storage_buffer" -> (,) [] []
  "SPV_NV_cooperative_matrix" -> (,) [] []
  "SPV_NV_shader_sm_builtins" -> (,) [] []
  "SPV_EXT_fragment_shader_interlock" -> (,) [] []
  "SPV_EXT_demote_to_helper_invocation" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 3 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 3 0]
  "SPV_KHR_fragment_shading_rate" -> (,) [] []
  "SPV_KHR_non_semantic_info" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 3 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 3 0]
  "SPV_EXT_shader_image_int64" -> (,) [] []
  "SPV_KHR_terminate_invocation" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 3 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 3 0]
  "SPV_KHR_multiview" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 1 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 1 0]
  "SPV_KHR_workgroup_memory_explicit_layout" -> (,) [] []
  "SPV_EXT_shader_atomic_float_add" -> (,) [] []
  "SPV_KHR_fragment_shader_barycentric" -> (,) [] []
  "SPV_KHR_subgroup_uniform_control_flow" -> (,) [] []
  "SPV_EXT_shader_atomic_float_min_max" -> (,) [] []
  "SPV_EXT_shader_atomic_float16_add" -> (,) [] []
  "SPV_NV_shader_atomic_fp16_vector" -> (,) [] []
  "SPV_EXT_fragment_fully_covered" -> (,) [] []
  "SPV_KHR_integer_dot_product" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 3 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 3 0]
  "SPV_INTEL_shader_integer_functions2" -> (,) [] []
  "SPV_KHR_device_group" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 1 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 1 0]
  "SPV_QCOM_image_processing" -> (,) [] []
  "SPV_QCOM_image_processing2" -> (,) [] []
  "SPV_QCOM_image_processing3" -> (,) [] []
  "SPV_QCOM_cooperative_matrix_conversion" -> (,) [] []
  "SPV_QCOM_multiple_wait_queues" -> (,) [] []
  "SPV_EXT_mesh_shader" -> (,) [] []
  "SPV_KHR_ray_tracing_position_fetch" -> (,) [] []
  "SPV_EXT_shader_tile_image" -> (,) [] []
  "SPV_EXT_opacity_micromap" -> (,) [] []
  "SPV_KHR_opacity_micromap" -> (,) [] []
  "SPV_EXT_split_barrier" -> (,) [] []
  "SPV_KHR_cooperative_matrix" -> (,) [] []
  "SPV_ARM_core_builtins" -> (,) [] []
  "SPV_HUAWEI_cluster_culling_shader" -> (,) [] []
  "SPV_HUAWEI_subpass_shading" -> (,) [] []
  "SPV_NV_ray_tracing_motion_blur" -> (,) [] []
  "SPV_KHR_maximal_reconvergence" -> (,) [] []
  "SPV_KHR_subgroup_rotate" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 4 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 4 0]
  "SPV_KHR_expect_assume" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 4 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 4 0]
  "SPV_KHR_float_controls2" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 4 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 4 0]
  "SPV_KHR_fma" -> (,) [] []
  "SPV_KHR_quad_control" -> (,) [] []
  "SPV_KHR_bfloat16" -> (,) [] []
  "SPV_NV_raw_access_chains" -> (,) [] []
  "SPV_KHR_compute_shader_derivatives" -> (,) [] []
  "SPV_EXT_replicated_composites" -> (,) [] []
  "SPV_KHR_relaxed_extended_instruction" -> (,) [] []
  "SPV_NV_cooperative_matrix2" -> (,) [] []
  "SPV_NV_tensor_addressing" -> (,) [] []
  "SPV_NV_linear_swept_spheres" -> (,) [] []
  "SPV_NV_cluster_acceleration_structure" -> (,) [] []
  "SPV_NV_cooperative_vector" -> (,) [] []
  "SPV_NV_push_constant_bank" -> (,) [] []
  "SPV_EXT_shader_invocation_reorder" -> (,) [] []
  "SPV_QCOM_tile_shading" -> (,) [] []
  "SPV_ARM_tensors" -> (,) [] []
  "SPV_EXT_float8" -> (,) [] []
  "SPV_ARM_graph" -> (,) [] []
  "SPV_KHR_untyped_pointers" -> (,) [] []
  "SPV_EXT_shader_64bit_indexing" -> (,) [] []
  "SPV_EXT_long_vector" -> (,) [] []
  "SPV_EXT_descriptor_heap" -> (,) [] []
  "SPV_VALVE_mixed_float_dot_product" -> (,) [] []
  "SPV_KHR_abort" -> (,) [] []
  "SPV_KHR_constant_data" -> (,) [] []
  _ -> ([], [])

spirvCapabilityRequirements :: ByteString -> ([InstanceRequirement], [DeviceRequirement])
spirvCapabilityRequirements = \case
  "Matrix" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 0 0]
  "Shader" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 0 0]
  "InputAttachment" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 0 0]
  "Sampled1D" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 0 0]
  "Image1D" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 0 0]
  "SampledBuffer" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 0 0]
  "ImageBuffer" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 0 0]
  "ImageQuery" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 0 0]
  "DerivativeControl" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 0 0]
  "Geometry" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [ RequireDeviceFeature
          { featureName = "geometryShader"
          , checkFeature = \PhysicalDeviceFeatures{geometryShader} -> geometryShader
          , enableFeature = \PhysicalDeviceFeatures{..} -> PhysicalDeviceFeatures{geometryShader = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 0 0
      ]
  "Tessellation" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [ RequireDeviceFeature
          { featureName = "tessellationShader"
          , checkFeature = \PhysicalDeviceFeatures{tessellationShader} -> tessellationShader
          , enableFeature = \PhysicalDeviceFeatures{..} -> PhysicalDeviceFeatures{tessellationShader = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 0 0
      ]
  "Float64" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [ RequireDeviceFeature
          { featureName = "shaderFloat64"
          , checkFeature = \PhysicalDeviceFeatures{shaderFloat64} -> shaderFloat64
          , enableFeature = \PhysicalDeviceFeatures{..} -> PhysicalDeviceFeatures{shaderFloat64 = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 0 0
      ]
  "Int64" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [ RequireDeviceFeature
          { featureName = "shaderInt64"
          , checkFeature = \PhysicalDeviceFeatures{shaderInt64} -> shaderInt64
          , enableFeature = \PhysicalDeviceFeatures{..} -> PhysicalDeviceFeatures{shaderInt64 = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 0 0
      ]
  "Int64Atomics" -> (,) [] []
  "AtomicFloat16AddEXT" -> (,) [] []
  "AtomicFloat32AddEXT" -> (,) [] []
  "AtomicFloat64AddEXT" -> (,) [] []
  "AtomicFloat16MinMaxEXT" -> (,) [] []
  "AtomicFloat32MinMaxEXT" -> (,) [] []
  "AtomicFloat64MinMaxEXT" -> (,) [] []
  "AtomicFloat16VectorNV" -> (,) [] []
  "Int64ImageEXT" -> (,) [] []
  "Int16" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [ RequireDeviceFeature
          { featureName = "shaderInt16"
          , checkFeature = \PhysicalDeviceFeatures{shaderInt16} -> shaderInt16
          , enableFeature = \PhysicalDeviceFeatures{..} -> PhysicalDeviceFeatures{shaderInt16 = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 0 0
      ]
  "TessellationPointSize" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [ RequireDeviceFeature
          { featureName = "shaderTessellationAndGeometryPointSize"
          , checkFeature = \PhysicalDeviceFeatures{shaderTessellationAndGeometryPointSize} -> shaderTessellationAndGeometryPointSize
          , enableFeature = \PhysicalDeviceFeatures{..} -> PhysicalDeviceFeatures{shaderTessellationAndGeometryPointSize = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 0 0
      ]
  "GeometryPointSize" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [ RequireDeviceFeature
          { featureName = "shaderTessellationAndGeometryPointSize"
          , checkFeature = \PhysicalDeviceFeatures{shaderTessellationAndGeometryPointSize} -> shaderTessellationAndGeometryPointSize
          , enableFeature = \PhysicalDeviceFeatures{..} -> PhysicalDeviceFeatures{shaderTessellationAndGeometryPointSize = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 0 0
      ]
  "ImageGatherExtended" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [ RequireDeviceFeature
          { featureName = "shaderImageGatherExtended"
          , checkFeature = \PhysicalDeviceFeatures{shaderImageGatherExtended} -> shaderImageGatherExtended
          , enableFeature = \PhysicalDeviceFeatures{..} -> PhysicalDeviceFeatures{shaderImageGatherExtended = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 0 0
      ]
  "StorageImageMultisample" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [ RequireDeviceFeature
          { featureName = "shaderStorageImageMultisample"
          , checkFeature = \PhysicalDeviceFeatures{shaderStorageImageMultisample} -> shaderStorageImageMultisample
          , enableFeature = \PhysicalDeviceFeatures{..} -> PhysicalDeviceFeatures{shaderStorageImageMultisample = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 0 0
      ]
  "UniformBufferArrayDynamicIndexing" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [ RequireDeviceFeature
          { featureName = "shaderUniformBufferArrayDynamicIndexing"
          , checkFeature = \PhysicalDeviceFeatures{shaderUniformBufferArrayDynamicIndexing} -> shaderUniformBufferArrayDynamicIndexing
          , enableFeature = \PhysicalDeviceFeatures{..} -> PhysicalDeviceFeatures{shaderUniformBufferArrayDynamicIndexing = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 0 0
      ]
  "SampledImageArrayDynamicIndexing" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [ RequireDeviceFeature
          { featureName = "shaderSampledImageArrayDynamicIndexing"
          , checkFeature = \PhysicalDeviceFeatures{shaderSampledImageArrayDynamicIndexing} -> shaderSampledImageArrayDynamicIndexing
          , enableFeature = \PhysicalDeviceFeatures{..} -> PhysicalDeviceFeatures{shaderSampledImageArrayDynamicIndexing = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 0 0
      ]
  "StorageBufferArrayDynamicIndexing" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [ RequireDeviceFeature
          { featureName = "shaderStorageBufferArrayDynamicIndexing"
          , checkFeature = \PhysicalDeviceFeatures{shaderStorageBufferArrayDynamicIndexing} -> shaderStorageBufferArrayDynamicIndexing
          , enableFeature = \PhysicalDeviceFeatures{..} -> PhysicalDeviceFeatures{shaderStorageBufferArrayDynamicIndexing = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 0 0
      ]
  "StorageImageArrayDynamicIndexing" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [ RequireDeviceFeature
          { featureName = "shaderStorageImageArrayDynamicIndexing"
          , checkFeature = \PhysicalDeviceFeatures{shaderStorageImageArrayDynamicIndexing} -> shaderStorageImageArrayDynamicIndexing
          , enableFeature = \PhysicalDeviceFeatures{..} -> PhysicalDeviceFeatures{shaderStorageImageArrayDynamicIndexing = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 0 0
      ]
  "ClipDistance" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [ RequireDeviceFeature
          { featureName = "shaderClipDistance"
          , checkFeature = \PhysicalDeviceFeatures{shaderClipDistance} -> shaderClipDistance
          , enableFeature = \PhysicalDeviceFeatures{..} -> PhysicalDeviceFeatures{shaderClipDistance = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 0 0
      ]
  "CullDistance" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [ RequireDeviceFeature
          { featureName = "shaderCullDistance"
          , checkFeature = \PhysicalDeviceFeatures{shaderCullDistance} -> shaderCullDistance
          , enableFeature = \PhysicalDeviceFeatures{..} -> PhysicalDeviceFeatures{shaderCullDistance = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 0 0
      ]
  "ImageCubeArray" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [ RequireDeviceFeature
          { featureName = "imageCubeArray"
          , checkFeature = \PhysicalDeviceFeatures{imageCubeArray} -> imageCubeArray
          , enableFeature = \PhysicalDeviceFeatures{..} -> PhysicalDeviceFeatures{imageCubeArray = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 0 0
      ]
  "SampleRateShading" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [ RequireDeviceFeature
          { featureName = "sampleRateShading"
          , checkFeature = \PhysicalDeviceFeatures{sampleRateShading} -> sampleRateShading
          , enableFeature = \PhysicalDeviceFeatures{..} -> PhysicalDeviceFeatures{sampleRateShading = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 0 0
      ]
  "SparseResidency" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [ RequireDeviceFeature
          { featureName = "shaderResourceResidency"
          , checkFeature = \PhysicalDeviceFeatures{shaderResourceResidency} -> shaderResourceResidency
          , enableFeature = \PhysicalDeviceFeatures{..} -> PhysicalDeviceFeatures{shaderResourceResidency = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 0 0
      ]
  "MinLod" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [ RequireDeviceFeature
          { featureName = "shaderResourceMinLod"
          , checkFeature = \PhysicalDeviceFeatures{shaderResourceMinLod} -> shaderResourceMinLod
          , enableFeature = \PhysicalDeviceFeatures{..} -> PhysicalDeviceFeatures{shaderResourceMinLod = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 0 0
      ]
  "SampledCubeArray" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [ RequireDeviceFeature
          { featureName = "imageCubeArray"
          , checkFeature = \PhysicalDeviceFeatures{imageCubeArray} -> imageCubeArray
          , enableFeature = \PhysicalDeviceFeatures{..} -> PhysicalDeviceFeatures{imageCubeArray = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 0 0
      ]
  "ImageMSArray" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [ RequireDeviceFeature
          { featureName = "shaderStorageImageMultisample"
          , checkFeature = \PhysicalDeviceFeatures{shaderStorageImageMultisample} -> shaderStorageImageMultisample
          , enableFeature = \PhysicalDeviceFeatures{..} -> PhysicalDeviceFeatures{shaderStorageImageMultisample = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 0 0
      ]
  "StorageImageExtendedFormats" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 0 0]
  "InterpolationFunction" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [ RequireDeviceFeature
          { featureName = "sampleRateShading"
          , checkFeature = \PhysicalDeviceFeatures{sampleRateShading} -> sampleRateShading
          , enableFeature = \PhysicalDeviceFeatures{..} -> PhysicalDeviceFeatures{sampleRateShading = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 0 0
      ]
  "StorageImageReadWithoutFormat" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [ RequireDeviceFeature
          { featureName = "shaderStorageImageReadWithoutFormat"
          , checkFeature = \PhysicalDeviceFeatures{shaderStorageImageReadWithoutFormat} -> shaderStorageImageReadWithoutFormat
          , enableFeature = \PhysicalDeviceFeatures{..} -> PhysicalDeviceFeatures{shaderStorageImageReadWithoutFormat = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 0 0
      ]
  "StorageImageWriteWithoutFormat" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [ RequireDeviceFeature
          { featureName = "shaderStorageImageWriteWithoutFormat"
          , checkFeature = \PhysicalDeviceFeatures{shaderStorageImageWriteWithoutFormat} -> shaderStorageImageWriteWithoutFormat
          , enableFeature = \PhysicalDeviceFeatures{..} -> PhysicalDeviceFeatures{shaderStorageImageWriteWithoutFormat = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 0 0
      ]
  "MultiViewport" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 0 0]
      [ RequireDeviceFeature
          { featureName = "multiViewport"
          , checkFeature = \PhysicalDeviceFeatures{multiViewport} -> multiViewport
          , enableFeature = \PhysicalDeviceFeatures{..} -> PhysicalDeviceFeatures{multiViewport = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 0 0
      ]
  "DrawParameters" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 2 0]
      [ RequireDeviceFeature
          { featureName = "shaderDrawParameters"
          , checkFeature = \PhysicalDeviceVulkan11Features{shaderDrawParameters} -> shaderDrawParameters
          , enableFeature = \PhysicalDeviceVulkan11Features{..} -> PhysicalDeviceVulkan11Features{shaderDrawParameters = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 2 0
      ]
  "MultiView" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 2 0]
      [ RequireDeviceFeature
          { featureName = "multiview"
          , checkFeature = \PhysicalDeviceVulkan11Features{multiview} -> multiview
          , enableFeature = \PhysicalDeviceVulkan11Features{..} -> PhysicalDeviceVulkan11Features{multiview = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 2 0
      ]
  "DeviceGroup" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 1 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 1 0]
  "VariablePointersStorageBuffer" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 2 0]
      [ RequireDeviceFeature
          { featureName = "variablePointersStorageBuffer"
          , checkFeature = \PhysicalDeviceVulkan11Features{variablePointersStorageBuffer} -> variablePointersStorageBuffer
          , enableFeature = \PhysicalDeviceVulkan11Features{..} -> PhysicalDeviceVulkan11Features{variablePointersStorageBuffer = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 2 0
      ]
  "VariablePointers" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 2 0]
      [ RequireDeviceFeature
          { featureName = "variablePointers"
          , checkFeature = \PhysicalDeviceVulkan11Features{variablePointers} -> variablePointers
          , enableFeature = \PhysicalDeviceVulkan11Features{..} -> PhysicalDeviceVulkan11Features{variablePointers = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 2 0
      ]
  "ShaderClockKHR" -> (,) [] []
  "StencilExportEXT" -> (,) [] []
  "SubgroupBallotKHR" -> (,) [] []
  "SubgroupVoteKHR" -> (,) [] []
  "ImageReadWriteLodAMD" -> (,) [] []
  "ImageGatherBiasLodAMD" -> (,) [] []
  "FragmentMaskAMD" -> (,) [] []
  "SampleMaskOverrideCoverageNV" -> (,) [] []
  "GeometryShaderPassthroughNV" -> (,) [] []
  "ShaderViewportIndex" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 2 0]
      [ RequireDeviceFeature
          { featureName = "shaderOutputViewportIndex"
          , checkFeature = \PhysicalDeviceVulkan12Features{shaderOutputViewportIndex} -> shaderOutputViewportIndex
          , enableFeature = \PhysicalDeviceVulkan12Features{..} -> PhysicalDeviceVulkan12Features{shaderOutputViewportIndex = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 2 0
      ]
  "ShaderLayer" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 2 0]
      [ RequireDeviceFeature
          { featureName = "shaderOutputLayer"
          , checkFeature = \PhysicalDeviceVulkan12Features{shaderOutputLayer} -> shaderOutputLayer
          , enableFeature = \PhysicalDeviceVulkan12Features{..} -> PhysicalDeviceVulkan12Features{shaderOutputLayer = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 2 0
      ]
  "ShaderViewportIndexLayerEXT" -> (,) [] []
  "ShaderViewportMaskNV" -> (,) [] []
  "PerViewAttributesNV" -> (,) [] []
  "StorageBuffer16BitAccess" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 2 0]
      [ RequireDeviceFeature
          { featureName = "storageBuffer16BitAccess"
          , checkFeature = \PhysicalDeviceVulkan11Features{storageBuffer16BitAccess} -> storageBuffer16BitAccess
          , enableFeature = \PhysicalDeviceVulkan11Features{..} -> PhysicalDeviceVulkan11Features{storageBuffer16BitAccess = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 2 0
      ]
  "UniformAndStorageBuffer16BitAccess" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 2 0]
      [ RequireDeviceFeature
          { featureName = "uniformAndStorageBuffer16BitAccess"
          , checkFeature = \PhysicalDeviceVulkan11Features{uniformAndStorageBuffer16BitAccess} -> uniformAndStorageBuffer16BitAccess
          , enableFeature = \PhysicalDeviceVulkan11Features{..} -> PhysicalDeviceVulkan11Features{uniformAndStorageBuffer16BitAccess = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 2 0
      ]
  "StoragePushConstant16" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 2 0]
      [ RequireDeviceFeature
          { featureName = "storagePushConstant16"
          , checkFeature = \PhysicalDeviceVulkan11Features{storagePushConstant16} -> storagePushConstant16
          , enableFeature = \PhysicalDeviceVulkan11Features{..} -> PhysicalDeviceVulkan11Features{storagePushConstant16 = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 2 0
      ]
  "StorageInputOutput16" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 2 0]
      [ RequireDeviceFeature
          { featureName = "storageInputOutput16"
          , checkFeature = \PhysicalDeviceVulkan11Features{storageInputOutput16} -> storageInputOutput16
          , enableFeature = \PhysicalDeviceVulkan11Features{..} -> PhysicalDeviceVulkan11Features{storageInputOutput16 = True, ..}
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 2 0
      ]
  "GroupNonUniform" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 1 0]
      [ RequireDeviceProperty
          { propertyName = "VkPhysicalDeviceVulkan11Properties"
          , checkProperty = \p -> SUBGROUP_FEATURE_BASIC_BIT .&&. subgroupSupportedOperations (p :: PhysicalDeviceVulkan11Properties)
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 1 0
      ]
  "GroupNonUniformVote" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 1 0]
      [ RequireDeviceProperty
          { propertyName = "VkPhysicalDeviceVulkan11Properties"
          , checkProperty = \p -> SUBGROUP_FEATURE_VOTE_BIT .&&. subgroupSupportedOperations (p :: PhysicalDeviceVulkan11Properties)
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 1 0
      ]
  "GroupNonUniformArithmetic" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 1 0]
      [ RequireDeviceProperty
          { propertyName = "VkPhysicalDeviceVulkan11Properties"
          , checkProperty = \p -> SUBGROUP_FEATURE_ARITHMETIC_BIT .&&. subgroupSupportedOperations (p :: PhysicalDeviceVulkan11Properties)
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 1 0
      ]
  "GroupNonUniformBallot" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 1 0]
      [ RequireDeviceProperty
          { propertyName = "VkPhysicalDeviceVulkan11Properties"
          , checkProperty = \p -> SUBGROUP_FEATURE_BALLOT_BIT .&&. subgroupSupportedOperations (p :: PhysicalDeviceVulkan11Properties)
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 1 0
      ]
  "GroupNonUniformShuffle" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 1 0]
      [ RequireDeviceProperty
          { propertyName = "VkPhysicalDeviceVulkan11Properties"
          , checkProperty = \p -> SUBGROUP_FEATURE_SHUFFLE_BIT .&&. subgroupSupportedOperations (p :: PhysicalDeviceVulkan11Properties)
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 1 0
      ]
  "GroupNonUniformShuffleRelative" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 1 0]
      [ RequireDeviceProperty
          { propertyName = "VkPhysicalDeviceVulkan11Properties"
          , checkProperty = \p -> SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT .&&. subgroupSupportedOperations (p :: PhysicalDeviceVulkan11Properties)
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 1 0
      ]
  "GroupNonUniformClustered" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 1 0]
      [ RequireDeviceProperty
          { propertyName = "VkPhysicalDeviceVulkan11Properties"
          , checkProperty = \p -> SUBGROUP_FEATURE_CLUSTERED_BIT .&&. subgroupSupportedOperations (p :: PhysicalDeviceVulkan11Properties)
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 1 0
      ]
  "GroupNonUniformQuad" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 1 0]
      [ RequireDeviceProperty
          { propertyName = "VkPhysicalDeviceVulkan11Properties"
          , checkProperty = \p -> SUBGROUP_FEATURE_QUAD_BIT .&&. subgroupSupportedOperations (p :: PhysicalDeviceVulkan11Properties)
          }
      , RequireDeviceVersion $ MAKE_API_VERSION 1 1 0
      ]
  "GroupNonUniformPartitionedEXT" -> (,) [] []
  "SampleMaskPostDepthCoverage" -> (,) [] []
  "ShaderNonUniform" ->
    (,)
      [RequireInstanceVersion $ MAKE_API_VERSION 1 2 0]
      [RequireDeviceVersion $ MAKE_API_VERSION 1 2 0]
  "RuntimeDescriptorArray" -> (,) [] []
  "InputAttachmentArrayDynamicIndexing" -> (,) [] []
  "UniformTexelBufferArrayDynamicIndexing" -> (,) [] []
  "StorageTexelBufferArrayDynamicIndexing" -> (,) [] []
  "UniformBufferArrayNonUniformIndexing" -> (,) [] []
  "SampledImageArrayNonUniformIndexing" -> (,) [] []
  "StorageBufferArrayNonUniformIndexing" -> (,) [] []
  "StorageImageArrayNonUniformIndexing" -> (,) [] []
  "InputAttachmentArrayNonUniformIndexing" -> (,) [] []
  "UniformTexelBufferArrayNonUniformIndexing" -> (,) [] []
  "StorageTexelBufferArrayNonUniformIndexing" -> (,) [] []
  "FragmentFullyCoveredEXT" -> (,) [] []
  "Float16" -> (,) [] []
  "Int8" -> (,) [] []
  "StorageBuffer8BitAccess" -> (,) [] []
  "UniformAndStorageBuffer8BitAccess" -> (,) [] []
  "StoragePushConstant8" -> (,) [] []
  "VulkanMemoryModel" -> (,) [] []
  "VulkanMemoryModelDeviceScope" -> (,) [] []
  "DenormPreserve" -> (,) [] []
  "DenormFlushToZero" -> (,) [] []
  "SignedZeroInfNanPreserve" -> (,) [] []
  "RoundingModeRTE" -> (,) [] []
  "RoundingModeRTZ" -> (,) [] []
  "ComputeDerivativeGroupQuadsKHR" -> (,) [] []
  "ComputeDerivativeGroupLinearKHR" -> (,) [] []
  "ImageFootprintNV" -> (,) [] []
  "MeshShadingNV" -> (,) [] []
  "RayTracingKHR" -> (,) [] []
  "RayQueryKHR" -> (,) [] []
  "RayTraversalPrimitiveCullingKHR" -> (,) [] []
  "RayCullMaskKHR" -> (,) [] []
  "RayTracingNV" -> (,) [] []
  "RayTracingMotionBlurNV" -> (,) [] []
  "TransformFeedback" -> (,) [] []
  "GeometryStreams" -> (,) [] []
  "FragmentDensityEXT" -> (,) [] []
  "PhysicalStorageBufferAddresses" -> (,) [] []
  "CooperativeMatrixNV" -> (,) [] []
  "IntegerFunctions2INTEL" -> (,) [] []
  "ShaderSMBuiltinsNV" -> (,) [] []
  "FragmentShaderSampleInterlockEXT" -> (,) [] []
  "FragmentShaderPixelInterlockEXT" -> (,) [] []
  "FragmentShaderShadingRateInterlockEXT" -> (,) [] []
  "DemoteToHelperInvocation" -> (,) [] []
  "FragmentShadingRateKHR" -> (,) [] []
  "WorkgroupMemoryExplicitLayoutKHR" -> (,) [] []
  "WorkgroupMemoryExplicitLayout8BitAccessKHR" -> (,) [] []
  "WorkgroupMemoryExplicitLayout16BitAccessKHR" -> (,) [] []
  "DotProductInputAll" -> (,) [] []
  "DotProductInput4x8Bit" -> (,) [] []
  "DotProductInput4x8BitPacked" -> (,) [] []
  "DotProduct" -> (,) [] []
  "FragmentBarycentricKHR" -> (,) [] []
  "TextureSampleWeightedQCOM" -> (,) [] []
  "TextureBoxFilterQCOM" -> (,) [] []
  "TextureBlockMatchQCOM" -> (,) [] []
  "TextureBlockMatch2QCOM" -> (,) [] []
  "ImageGatherLinearQCOM" -> (,) [] []
  "ImageGatherExtendedModesQCOM" -> (,) [] []
  "MeshShadingEXT" -> (,) [] []
  "RayTracingOpacityMicromapEXT" -> (,) [] []
  "RayTracingOpacityMicromapKHR" -> (,) [] []
  "RayTracingOpacityMicromapExecutionModeKHR" -> (,) [] []
  "CoreBuiltinsARM" -> (,) [] []
  "ShaderInvocationReorderNV" -> (,) [] []
  "ClusterCullingShadingHUAWEI" -> (,) [] []
  "RayTracingPositionFetchKHR" -> (,) [] []
  "RayQueryPositionFetchKHR" -> (,) [] []
  "TileImageColorReadAccessEXT" -> (,) [] []
  "TileImageDepthReadAccessEXT" -> (,) [] []
  "TileImageStencilReadAccessEXT" -> (,) [] []
  "CooperativeMatrixKHR" -> (,) [] []
  "CooperativeMatrixConversionQCOM" -> (,) [] []
  "ShaderEnqueueAMDX" -> (,) [] []
  "GroupNonUniformRotateKHR" -> (,) [] []
  "ExpectAssumeKHR" -> (,) [] []
  "FloatControls2" -> (,) [] []
  "QuadControlKHR" -> (,) [] []
  "BFloat16TypeKHR" -> (,) [] []
  "BFloat16DotProductKHR" -> (,) [] []
  "BFloat16CooperativeMatrixKHR" -> (,) [] []
  "RawAccessChainsNV" -> (,) [] []
  "ReplicatedCompositesEXT" -> (,) [] []
  "TensorAddressingNV" -> (,) [] []
  "CooperativeMatrixReductionsNV" -> (,) [] []
  "CooperativeMatrixConversionsNV" -> (,) [] []
  "CooperativeMatrixPerElementOperationsNV" -> (,) [] []
  "CooperativeMatrixTensorAddressingNV" -> (,) [] []
  "CooperativeMatrixBlockLoadsNV" -> (,) [] []
  "RayTracingSpheresGeometryNV" -> (,) [] []
  "RayTracingLinearSweptSpheresGeometryNV" -> (,) [] []
  "RayTracingClusterAccelerationStructureNV" -> (,) [] []
  "CooperativeVectorNV" -> (,) [] []
  "CooperativeVectorTrainingNV" -> (,) [] []
  "PushConstantBanksNV" -> (,) [] []
  "ShaderInvocationReorderEXT" -> (,) [] []
  "TileShadingQCOM" -> (,) [] []
  "SplitBarrierEXT" -> (,) [] []
  "MultipleWaitQueuesQCOM" -> (,) [] []
  "TensorsARM" -> (,) [] []
  "StorageTensorArrayDynamicIndexingARM" -> (,) [] []
  "StorageTensorArrayNonUniformIndexingARM" -> (,) [] []
  "Float8EXT" -> (,) [] []
  "Float8CooperativeMatrixEXT" -> (,) [] []
  "GraphARM" -> (,) [] []
  "UntypedPointersKHR" -> (,) [] []
  "FMAKHR" -> (,) [] []
  "Shader64BitIndexingEXT" -> (,) [] []
  "LongVectorEXT" -> (,) [] []
  "DescriptorHeapEXT" -> (,) [] []
  "DotProductFloat16AccFloat32VALVE" -> (,) [] []
  "DotProductFloat16AccFloat16VALVE" -> (,) [] []
  "DotProductBFloat16AccVALVE" -> (,) [] []
  "DotProductFloat8AccFloat32VALVE" -> (,) [] []
  "ConstantDataKHR" -> (,) [] []
  "AbortKHR" -> (,) [] []
  _ -> ([], [])