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

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

data ImageChannelOrder = R 
                       | A 
                       | RG 
                       | RA 
                       | RGB 
                       | RGBA 
                       | BGRA 
                       | ARGB 
                       | Intensity 
                       | Luminance 
                       | Rx 
                       | RGx 
                       | RGBx 
                       | Depth 
                       | DepthStencil 
                       | SRGB 
                       | SRGBx 
                       | SRGBA 
                       | SBGRA
  deriving(Read, Show, Eq, Ord)

instance SpirEnum ImageChannelOrder Word32 where
  toWord R = 0
  toWord A = 1
  toWord RG = 2
  toWord RA = 3
  toWord RGB = 4
  toWord RGBA = 5
  toWord BGRA = 6
  toWord ARGB = 7
  toWord Intensity = 8
  toWord Luminance = 9
  toWord Rx = 10
  toWord RGx = 11
  toWord RGBx = 12
  toWord Depth = 13
  toWord DepthStencil = 14
  toWord SRGB = 15
  toWord SRGBx = 16
  toWord SRGBA = 17
  toWord SBGRA = 18

  fromWord 0 = Just R
  fromWord 1 = Just A
  fromWord 2 = Just RG
  fromWord 3 = Just RA
  fromWord 4 = Just RGB
  fromWord 5 = Just RGBA
  fromWord 6 = Just BGRA
  fromWord 7 = Just ARGB
  fromWord 8 = Just Intensity
  fromWord 9 = Just Luminance
  fromWord 10 = Just Rx
  fromWord 11 = Just RGx
  fromWord 12 = Just RGBx
  fromWord 13 = Just Depth
  fromWord 14 = Just DepthStencil
  fromWord 15 = Just SRGB
  fromWord 16 = Just SRGBx
  fromWord 17 = Just SRGBA
  fromWord 18 = Just SBGRA
  fromWord _ = Nothing

  requiredCapabilities R = [Capability.Kernel]
  requiredCapabilities A = [Capability.Kernel]
  requiredCapabilities RG = [Capability.Kernel]
  requiredCapabilities RA = [Capability.Kernel]
  requiredCapabilities RGB = [Capability.Kernel]
  requiredCapabilities RGBA = [Capability.Kernel]
  requiredCapabilities BGRA = [Capability.Kernel]
  requiredCapabilities ARGB = [Capability.Kernel]
  requiredCapabilities Intensity = [Capability.Kernel]
  requiredCapabilities Luminance = [Capability.Kernel]
  requiredCapabilities Rx = [Capability.Kernel]
  requiredCapabilities RGx = [Capability.Kernel]
  requiredCapabilities RGBx = [Capability.Kernel]
  requiredCapabilities Depth = [Capability.Kernel]
  requiredCapabilities DepthStencil = [Capability.Kernel]
  requiredCapabilities SRGB = [Capability.Kernel]
  requiredCapabilities SRGBx = [Capability.Kernel]
  requiredCapabilities SRGBA = [Capability.Kernel]
  requiredCapabilities SBGRA = [Capability.Kernel]