{-# LANGUAGE MultiParamTypeClasses #-}
module Language.SpirV.ImageChannelOrder 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_image_channel_order_a_image_channel_order Source for Image Channel Order>
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]