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

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

data StorageClass = UniformConstant 
                  | Input 
                  | Uniform 
                  | Output 
                  | WorkgroupLocal 
                  | WorkgroupGlobal 
                  | PrivateGlobal 
                  | Function 
                  | Generic 
                  | AtomicCounter 
                  | Image
  deriving(Read, Show, Eq, Ord)

instance SpirEnum StorageClass Word32 where
  toWord UniformConstant = 0
  toWord Input = 1
  toWord Uniform = 2
  toWord Output = 3
  toWord WorkgroupLocal = 4
  toWord WorkgroupGlobal = 5
  toWord PrivateGlobal = 6
  toWord Function = 7
  toWord Generic = 8
  toWord AtomicCounter = 10
  toWord Image = 11

  fromWord 0 = Just UniformConstant
  fromWord 1 = Just Input
  fromWord 2 = Just Uniform
  fromWord 3 = Just Output
  fromWord 4 = Just WorkgroupLocal
  fromWord 5 = Just WorkgroupGlobal
  fromWord 6 = Just PrivateGlobal
  fromWord 7 = Just Function
  fromWord 8 = Just Generic
  fromWord 10 = Just AtomicCounter
  fromWord 11 = Just Image
  fromWord _ = Nothing

  requiredCapabilities Input = [Capability.Shader]
  requiredCapabilities Uniform = [Capability.Shader]
  requiredCapabilities Output = [Capability.Shader]
  requiredCapabilities PrivateGlobal = [Capability.Shader]
  requiredCapabilities Generic = [Capability.Kernel]
  requiredCapabilities AtomicCounter = [Capability.AtomicStorage]
  requiredCapabilities _ = []