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

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

data ImageChannelDataType = SnormInt8 
                          | SnormInt16 
                          | UnormInt8 
                          | UnormInt16 
                          | UnormShort565 
                          | UnormShort555 
                          | UnormInt101010 
                          | SignedInt8 
                          | SignedInt16 
                          | SignedInt32 
                          | UnsignedInt8 
                          | UnsignedInt16 
                          | UnsignedInt32 
                          | HalfFloat 
                          | Float 
                          | UnormInt24
  deriving(Read, Show, Eq, Ord)

instance SpirEnum ImageChannelDataType Word32 where
  toWord SnormInt8 = 0
  toWord SnormInt16 = 1
  toWord UnormInt8 = 2
  toWord UnormInt16 = 3
  toWord UnormShort565 = 4
  toWord UnormShort555 = 5
  toWord UnormInt101010 = 6
  toWord SignedInt8 = 7
  toWord SignedInt16 = 8
  toWord SignedInt32 = 9
  toWord UnsignedInt8 = 10
  toWord UnsignedInt16 = 11
  toWord UnsignedInt32 = 12
  toWord HalfFloat = 13
  toWord Float = 14
  toWord UnormInt24 = 15

  fromWord 0 = Just SnormInt8
  fromWord 1 = Just SnormInt16
  fromWord 2 = Just UnormInt8
  fromWord 3 = Just UnormInt16
  fromWord 4 = Just UnormShort565
  fromWord 5 = Just UnormShort555
  fromWord 6 = Just UnormInt101010
  fromWord 7 = Just SignedInt8
  fromWord 8 = Just SignedInt16
  fromWord 9 = Just SignedInt32
  fromWord 10 = Just UnsignedInt8
  fromWord 11 = Just UnsignedInt16
  fromWord 12 = Just UnsignedInt32
  fromWord 13 = Just HalfFloat
  fromWord 14 = Just Float
  fromWord 15 = Just UnormInt24
  fromWord _ = Nothing

  requiredCapabilities SnormInt8 = [Capability.Kernel]
  requiredCapabilities SnormInt16 = [Capability.Kernel]
  requiredCapabilities UnormInt8 = [Capability.Kernel]
  requiredCapabilities UnormInt16 = [Capability.Kernel]
  requiredCapabilities UnormShort565 = [Capability.Kernel]
  requiredCapabilities UnormShort555 = [Capability.Kernel]
  requiredCapabilities UnormInt101010 = [Capability.Kernel]
  requiredCapabilities SignedInt8 = [Capability.Kernel]
  requiredCapabilities SignedInt16 = [Capability.Kernel]
  requiredCapabilities SignedInt32 = [Capability.Kernel]
  requiredCapabilities UnsignedInt8 = [Capability.Kernel]
  requiredCapabilities UnsignedInt16 = [Capability.Kernel]
  requiredCapabilities UnsignedInt32 = [Capability.Kernel]
  requiredCapabilities HalfFloat = [Capability.Kernel]
  requiredCapabilities Float = [Capability.Kernel]
  requiredCapabilities UnormInt24 = [Capability.Kernel]