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

import Data.Word (Word32)
import Language.SpirV.SpirEnum
import qualified Language.SpirV.Capability as Capability


-- | <https:\/\/www.khronos.org\/registry\/spir-v\/specs\/1.0\/SPIRV.html#_a_id_decoration_a_decoration Source for Decoration>
data Decoration =
    RelaxedPrecision
  | SpecId
  | Block
  | BufferBlock
  | RowMajor
  | ColMajor
  | ArrayStride
  | MatrixStride
  | GLSLShared
  | GLSLPacked
  | CPacked
  | BuiltIn
  | NoPerspective
  | Flat
  | Patch
  | Centroid
  | Sample
  | Invariant
  | Restrict
  | Aliased
  | Volatile
  | Constant
  | Coherent
  | NonWritable
  | NonReadable
  | Uniform
  | SaturatedConversion
  | Stream
  | Location
  | Component
  | Index
  | Binding
  | DescriptorSet
  | Offset
  | XfbBuffer
  | XfbStride
  | FuncParamAttr
  | FPRoundingMode
  | FPFastMathMode
  | LinkageAttributes
  | NoContraction
  | InputAttachmentIndex
  | Alignment
  deriving(Read, Show, Eq, Ord)

instance SpirEnum Decoration Word32 where
  toWord RelaxedPrecision = 0
  toWord SpecId = 1
  toWord Block = 2
  toWord BufferBlock = 3
  toWord RowMajor = 4
  toWord ColMajor = 5
  toWord ArrayStride = 6
  toWord MatrixStride = 7
  toWord GLSLShared = 8
  toWord GLSLPacked = 9
  toWord CPacked = 10
  toWord BuiltIn = 11
  toWord NoPerspective = 13
  toWord Flat = 14
  toWord Patch = 15
  toWord Centroid = 16
  toWord Sample = 17
  toWord Invariant = 18
  toWord Restrict = 19
  toWord Aliased = 20
  toWord Volatile = 21
  toWord Constant = 22
  toWord Coherent = 23
  toWord NonWritable = 24
  toWord NonReadable = 25
  toWord Uniform = 26
  toWord SaturatedConversion = 28
  toWord Stream = 29
  toWord Location = 30
  toWord Component = 31
  toWord Index = 32
  toWord Binding = 33
  toWord DescriptorSet = 34
  toWord Offset = 35
  toWord XfbBuffer = 36
  toWord XfbStride = 37
  toWord FuncParamAttr = 38
  toWord FPRoundingMode = 39
  toWord FPFastMathMode = 40
  toWord LinkageAttributes = 41
  toWord NoContraction = 42
  toWord InputAttachmentIndex = 43
  toWord Alignment = 44

  fromWord 0 = Just RelaxedPrecision
  fromWord 1 = Just SpecId
  fromWord 2 = Just Block
  fromWord 3 = Just BufferBlock
  fromWord 4 = Just RowMajor
  fromWord 5 = Just ColMajor
  fromWord 6 = Just ArrayStride
  fromWord 7 = Just MatrixStride
  fromWord 8 = Just GLSLShared
  fromWord 9 = Just GLSLPacked
  fromWord 10 = Just CPacked
  fromWord 11 = Just BuiltIn
  fromWord 13 = Just NoPerspective
  fromWord 14 = Just Flat
  fromWord 15 = Just Patch
  fromWord 16 = Just Centroid
  fromWord 17 = Just Sample
  fromWord 18 = Just Invariant
  fromWord 19 = Just Restrict
  fromWord 20 = Just Aliased
  fromWord 21 = Just Volatile
  fromWord 22 = Just Constant
  fromWord 23 = Just Coherent
  fromWord 24 = Just NonWritable
  fromWord 25 = Just NonReadable
  fromWord 26 = Just Uniform
  fromWord 28 = Just SaturatedConversion
  fromWord 29 = Just Stream
  fromWord 30 = Just Location
  fromWord 31 = Just Component
  fromWord 32 = Just Index
  fromWord 33 = Just Binding
  fromWord 34 = Just DescriptorSet
  fromWord 35 = Just Offset
  fromWord 36 = Just XfbBuffer
  fromWord 37 = Just XfbStride
  fromWord 38 = Just FuncParamAttr
  fromWord 39 = Just FPRoundingMode
  fromWord 40 = Just FPFastMathMode
  fromWord 41 = Just LinkageAttributes
  fromWord 42 = Just NoContraction
  fromWord 43 = Just InputAttachmentIndex
  fromWord 44 = Just Alignment
  fromWord _ = Nothing

  requiredCapabilities RelaxedPrecision = [Capability.Shader]
  requiredCapabilities SpecId = [Capability.Shader]
  requiredCapabilities Block = [Capability.Shader]
  requiredCapabilities BufferBlock = [Capability.Shader]
  requiredCapabilities RowMajor = [Capability.Matrix]
  requiredCapabilities ColMajor = [Capability.Matrix]
  requiredCapabilities ArrayStride = [Capability.Shader]
  requiredCapabilities MatrixStride = [Capability.Matrix]
  requiredCapabilities GLSLShared = [Capability.Shader]
  requiredCapabilities GLSLPacked = [Capability.Shader]
  requiredCapabilities CPacked = [Capability.Kernel]
  requiredCapabilities NoPerspective = [Capability.Shader]
  requiredCapabilities Flat = [Capability.Shader]
  requiredCapabilities Patch = [Capability.Tessellation]
  requiredCapabilities Centroid = [Capability.Shader]
  requiredCapabilities Sample = [Capability.SampleRateShading]
  requiredCapabilities Invariant = [Capability.Shader]
  requiredCapabilities Constant = [Capability.Kernel]
  requiredCapabilities Uniform = [Capability.Shader]
  requiredCapabilities SaturatedConversion = [Capability.Kernel]
  requiredCapabilities Stream = [Capability.GeometryStreams]
  requiredCapabilities Location = [Capability.Shader]
  requiredCapabilities Component = [Capability.Shader]
  requiredCapabilities Index = [Capability.Shader]
  requiredCapabilities Binding = [Capability.Shader]
  requiredCapabilities DescriptorSet = [Capability.Shader]
  requiredCapabilities Offset = [Capability.Shader]
  requiredCapabilities XfbBuffer = [Capability.TransformFeedback]
  requiredCapabilities XfbStride = [Capability.TransformFeedback]
  requiredCapabilities FuncParamAttr = [Capability.Kernel]
  requiredCapabilities FPRoundingMode = [Capability.Kernel]
  requiredCapabilities FPFastMathMode = [Capability.Kernel]
  requiredCapabilities LinkageAttributes = [Capability.Linkage]
  requiredCapabilities NoContraction = [Capability.Shader]
  requiredCapabilities InputAttachmentIndex = [Capability.InputAttachment]
  requiredCapabilities Alignment = [Capability.Kernel]
  requiredCapabilities _ = []