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

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

data Capability = Matrix 
                | Shader 
                | Geometry 
                | Tessellation 
                | Addresses 
                | Linkage 
                | Kernel 
                | Vector16 
                | Float16Buffer 
                | Float16 
                | Float64 
                | Int64 
                | Int64Atomics 
                | ImageBasic 
                | ImageReadWrite 
                | ImageMipmap 
                | ImageSRGBWrite 
                | Pipes 
                | Groups 
                | DeviceEnqueue 
                | LiteralSampler 
                | AtomicStorage 
                | Int16 
                | TessellationPointSize 
                | GeometryPointSize 
                | ImageGatherExtended 
                | StorageImageExtendedFormats 
                | StorageImageMultisample 
                | UniformBufferArrayDynamicIndexing 
                | SampledImageArrayDynamicIndexing 
                | StorageBufferArrayDynamicIndexing 
                | StorageImageArrayDynamicIndexing 
                | ClipDistance 
                | CullDistance 
                | ImageCubeArray 
                | SampleRateShading
  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 ImageSRGBWrite = 16
  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 StorageImageExtendedFormats = 26
  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

  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 16 = Just ImageSRGBWrite
  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 26 = Just StorageImageExtendedFormats
  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 _ = Nothing

  requiredCapabilities Shader = [Matrix]
  requiredCapabilities Geometry = [Shader]
  requiredCapabilities Tessellation = [Shader]
  requiredCapabilities _ = []