{-# LANGUAGE MultiParamTypeClasses #-}
module Language.SpirV.ImageOperands 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_operands_a_image_operands Source for Image Operands>
data ImageOperands =
    None
  | Bias
  | Lod
  | Grad
  | ConstOffset
  | Offset
  | ConstOffsets
  | Sample
  | MinLod
  deriving(Read, Show, Eq, Ord)

instance SpirEnum ImageOperands Word32 where
  toWord None = 0
  toWord Bias = 1
  toWord Lod = 2
  toWord Grad = 4
  toWord ConstOffset = 8
  toWord Offset = 16
  toWord ConstOffsets = 32
  toWord Sample = 64
  toWord MinLod = 128

  fromWord 0 = Just None
  fromWord 1 = Just Bias
  fromWord 2 = Just Lod
  fromWord 4 = Just Grad
  fromWord 8 = Just ConstOffset
  fromWord 16 = Just Offset
  fromWord 32 = Just ConstOffsets
  fromWord 64 = Just Sample
  fromWord 128 = Just MinLod
  fromWord _ = Nothing

  requiredCapabilities Bias = [Capability.Shader]
  requiredCapabilities Offset = [Capability.ImageGatherExtended]
  requiredCapabilities MinLod = [Capability.MinLod]
  requiredCapabilities _ = []