{-# LANGUAGE MultiParamTypeClasses #-}
module Language.SpirV.KernelEnqueueFlags 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_kernel_enqueue_flags_a_kernel_enqueue_flags Source for Kernel Enqueue Flags>
data KernelEnqueueFlags =
    NoWait
  | WaitKernel
  | WaitWorkGroup
  deriving(Read, Show, Eq, Ord)

instance SpirEnum KernelEnqueueFlags Word32 where
  toWord NoWait = 0
  toWord WaitKernel = 1
  toWord WaitWorkGroup = 2

  fromWord 0 = Just NoWait
  fromWord 1 = Just WaitKernel
  fromWord 2 = Just WaitWorkGroup
  fromWord _ = Nothing

  requiredCapabilities NoWait = [Capability.Kernel]
  requiredCapabilities WaitKernel = [Capability.Kernel]
  requiredCapabilities WaitWorkGroup = [Capability.Kernel]