{-# LANGUAGE MultiParamTypeClasses #-}
module Language.SpirV.Capability where

import Data.Word (Word32)
import Language.SpirV.SpirEnum


-- | <https:\/\/www.khronos.org\/registry\/spir-v\/specs\/1.0\/SPIRV.html#_a_id_capability_a_capability Source for Capability>
data Capability =
    Matrix
  | Shader
  | Geometry
  | Tessellation
  | Addresses
  | Linkage
  | Kernel
  | Vector16
  | Float16Buffer
  | Float16
  | Float64
  | Int64
  | Int64Atomics
  | ImageBasic
  | ImageReadWrite
  | ImageMipmap
  | Pipes
  | Groups
  | DeviceEnqueue
  | LiteralSampler
  | AtomicStorage
  | Int16
  | TessellationPointSize
  | GeometryPointSize
  | ImageGatherExtended
  | StorageImageMultisample
  | UniformBufferArrayDynamicIndexing
  | SampledImageArrayDynamicIndexing
  | StorageBufferArrayDynamicIndexing
  | StorageImageArrayDynamicIndexing
  | ClipDistance
  | CullDistance
  | ImageCubeArray
  | SampleRateShading
  | ImageRect
  | SampledRect
  | GenericPointer
  | Int8
  | InputAttachment
  | SparseResidency
  | MinLod
  | Sampled1D
  | Image1D
  | SampledCubeArray
  | SampledBuffer
  | ImageBuffer
  | ImageMSArray
  | StorageImageExtendedFormats
  | ImageQuery
  | DerivativeControl
  | InterpolationFunction
  | TransformFeedback
  | GeometryStreams
  | StorageImageReadWithoutFormat
  | StorageImageWriteWithoutFormat
  | MultiViewport
  deriving(Read, Show, Eq, Ord)

instance SpirEnum Capability Word32 where
  toWord Matrix = 0
  toWord Shader = 1
  toWord Geometry = 2
  toWord Tessellation = 3
  toWord Addresses = 4
  toWord Linkage = 5
  toWord Kernel = 6
  toWord Vector16 = 7
  toWord Float16Buffer = 8
  toWord Float16 = 9
  toWord Float64 = 10
  toWord Int64 = 11
  toWord Int64Atomics = 12
  toWord ImageBasic = 13
  toWord ImageReadWrite = 14
  toWord ImageMipmap = 15
  toWord Pipes = 17
  toWord Groups = 18
  toWord DeviceEnqueue = 19
  toWord LiteralSampler = 20
  toWord AtomicStorage = 21
  toWord Int16 = 22
  toWord TessellationPointSize = 23
  toWord GeometryPointSize = 24
  toWord ImageGatherExtended = 25
  toWord StorageImageMultisample = 27
  toWord UniformBufferArrayDynamicIndexing = 28
  toWord SampledImageArrayDynamicIndexing = 29
  toWord StorageBufferArrayDynamicIndexing = 30
  toWord StorageImageArrayDynamicIndexing = 31
  toWord ClipDistance = 32
  toWord CullDistance = 33
  toWord ImageCubeArray = 34
  toWord SampleRateShading = 35
  toWord ImageRect = 36
  toWord SampledRect = 37
  toWord GenericPointer = 38
  toWord Int8 = 39
  toWord InputAttachment = 40
  toWord SparseResidency = 41
  toWord MinLod = 42
  toWord Sampled1D = 43
  toWord Image1D = 44
  toWord SampledCubeArray = 45
  toWord SampledBuffer = 46
  toWord ImageBuffer = 47
  toWord ImageMSArray = 48
  toWord StorageImageExtendedFormats = 49
  toWord ImageQuery = 50
  toWord DerivativeControl = 51
  toWord InterpolationFunction = 52
  toWord TransformFeedback = 53
  toWord GeometryStreams = 54
  toWord StorageImageReadWithoutFormat = 55
  toWord StorageImageWriteWithoutFormat = 56
  toWord MultiViewport = 57

  fromWord 0 = Just Matrix
  fromWord 1 = Just Shader
  fromWord 2 = Just Geometry
  fromWord 3 = Just Tessellation
  fromWord 4 = Just Addresses
  fromWord 5 = Just Linkage
  fromWord 6 = Just Kernel
  fromWord 7 = Just Vector16
  fromWord 8 = Just Float16Buffer
  fromWord 9 = Just Float16
  fromWord 10 = Just Float64
  fromWord 11 = Just Int64
  fromWord 12 = Just Int64Atomics
  fromWord 13 = Just ImageBasic
  fromWord 14 = Just ImageReadWrite
  fromWord 15 = Just ImageMipmap
  fromWord 17 = Just Pipes
  fromWord 18 = Just Groups
  fromWord 19 = Just DeviceEnqueue
  fromWord 20 = Just LiteralSampler
  fromWord 21 = Just AtomicStorage
  fromWord 22 = Just Int16
  fromWord 23 = Just TessellationPointSize
  fromWord 24 = Just GeometryPointSize
  fromWord 25 = Just ImageGatherExtended
  fromWord 27 = Just StorageImageMultisample
  fromWord 28 = Just UniformBufferArrayDynamicIndexing
  fromWord 29 = Just SampledImageArrayDynamicIndexing
  fromWord 30 = Just StorageBufferArrayDynamicIndexing
  fromWord 31 = Just StorageImageArrayDynamicIndexing
  fromWord 32 = Just ClipDistance
  fromWord 33 = Just CullDistance
  fromWord 34 = Just ImageCubeArray
  fromWord 35 = Just SampleRateShading
  fromWord 36 = Just ImageRect
  fromWord 37 = Just SampledRect
  fromWord 38 = Just GenericPointer
  fromWord 39 = Just Int8
  fromWord 40 = Just InputAttachment
  fromWord 41 = Just SparseResidency
  fromWord 42 = Just MinLod
  fromWord 43 = Just Sampled1D
  fromWord 44 = Just Image1D
  fromWord 45 = Just SampledCubeArray
  fromWord 46 = Just SampledBuffer
  fromWord 47 = Just ImageBuffer
  fromWord 48 = Just ImageMSArray
  fromWord 49 = Just StorageImageExtendedFormats
  fromWord 50 = Just ImageQuery
  fromWord 51 = Just DerivativeControl
  fromWord 52 = Just InterpolationFunction
  fromWord 53 = Just TransformFeedback
  fromWord 54 = Just GeometryStreams
  fromWord 55 = Just StorageImageReadWithoutFormat
  fromWord 56 = Just StorageImageWriteWithoutFormat
  fromWord 57 = Just MultiViewport
  fromWord _ = Nothing

  requiredCapabilities Shader = [Matrix]
  requiredCapabilities Geometry = [Shader]
  requiredCapabilities Tessellation = [Shader]
  requiredCapabilities Vector16 = [Kernel]
  requiredCapabilities Float16Buffer = [Kernel]
  requiredCapabilities Int64Atomics = [Int64]
  requiredCapabilities ImageBasic = [Kernel]
  requiredCapabilities ImageReadWrite = [ImageBasic]
  requiredCapabilities ImageMipmap = [ImageBasic]
  requiredCapabilities Pipes = [Kernel]
  requiredCapabilities DeviceEnqueue = [Kernel]
  requiredCapabilities LiteralSampler = [Kernel]
  requiredCapabilities AtomicStorage = [Shader]
  requiredCapabilities TessellationPointSize = [Tessellation]
  requiredCapabilities GeometryPointSize = [Geometry]
  requiredCapabilities ImageGatherExtended = [Shader]
  requiredCapabilities StorageImageMultisample = [Shader]
  requiredCapabilities UniformBufferArrayDynamicIndexing = [Shader]
  requiredCapabilities SampledImageArrayDynamicIndexing = [Shader]
  requiredCapabilities StorageBufferArrayDynamicIndexing = [Shader]
  requiredCapabilities StorageImageArrayDynamicIndexing = [Shader]
  requiredCapabilities ClipDistance = [Shader]
  requiredCapabilities CullDistance = [Shader]
  requiredCapabilities ImageCubeArray = [SampledCubeArray]
  requiredCapabilities SampleRateShading = [Shader]
  requiredCapabilities ImageRect = [SampledRect]
  requiredCapabilities SampledRect = [Shader]
  requiredCapabilities GenericPointer = [Addresses]
  requiredCapabilities Int8 = [Kernel]
  requiredCapabilities InputAttachment = [Shader]
  requiredCapabilities SparseResidency = [Shader]
  requiredCapabilities MinLod = [Shader]
  requiredCapabilities Sampled1D = [Shader]
  requiredCapabilities Image1D = [Sampled1D]
  requiredCapabilities SampledCubeArray = [Shader]
  requiredCapabilities SampledBuffer = [Shader]
  requiredCapabilities ImageBuffer = [SampledBuffer]
  requiredCapabilities ImageMSArray = [Shader]
  requiredCapabilities StorageImageExtendedFormats = [Shader]
  requiredCapabilities ImageQuery = [Shader]
  requiredCapabilities DerivativeControl = [Shader]
  requiredCapabilities InterpolationFunction = [Shader]
  requiredCapabilities TransformFeedback = [Shader]
  requiredCapabilities GeometryStreams = [Geometry]
  requiredCapabilities StorageImageReadWithoutFormat = [Shader]
  requiredCapabilities StorageImageWriteWithoutFormat = [Shader]
  requiredCapabilities MultiViewport = [Geometry]
  requiredCapabilities _ = []