module Engine.Vulkan.Pipeline.Raytrace where

import RIO

import Vulkan.Core10 qualified as Vk

import Engine.Vulkan.Pipeline.Stages (StageInfo(..))
import Resource.Collection (Generic1, Generically1(..))

data Stages a = Stages
  { forall a. Stages a -> a
rgen  :: a -- ^ ray generation
  , forall a. Stages a -> a
rint  :: a -- ^ ray intersection
  , forall a. Stages a -> a
rahit :: a -- ^ ray any hit
  , forall a. Stages a -> a
rchit :: a -- ^ ray closest hit
  , forall a. Stages a -> a
rmiss :: a -- ^ ray miss
  , forall a. Stages a -> a
rcall :: a -- ^ ray callable
  }
  deriving (Stages a -> Stages a -> Bool
(Stages a -> Stages a -> Bool)
-> (Stages a -> Stages a -> Bool) -> Eq (Stages a)
forall a. Eq a => Stages a -> Stages a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Stages a -> Stages a -> Bool
$c/= :: forall a. Eq a => Stages a -> Stages a -> Bool
== :: Stages a -> Stages a -> Bool
$c== :: forall a. Eq a => Stages a -> Stages a -> Bool
Eq, Eq (Stages a)
Eq (Stages a)
-> (Stages a -> Stages a -> Ordering)
-> (Stages a -> Stages a -> Bool)
-> (Stages a -> Stages a -> Bool)
-> (Stages a -> Stages a -> Bool)
-> (Stages a -> Stages a -> Bool)
-> (Stages a -> Stages a -> Stages a)
-> (Stages a -> Stages a -> Stages a)
-> Ord (Stages a)
Stages a -> Stages a -> Bool
Stages a -> Stages a -> Ordering
Stages a -> Stages a -> Stages a
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall {a}. Ord a => Eq (Stages a)
forall a. Ord a => Stages a -> Stages a -> Bool
forall a. Ord a => Stages a -> Stages a -> Ordering
forall a. Ord a => Stages a -> Stages a -> Stages a
min :: Stages a -> Stages a -> Stages a
$cmin :: forall a. Ord a => Stages a -> Stages a -> Stages a
max :: Stages a -> Stages a -> Stages a
$cmax :: forall a. Ord a => Stages a -> Stages a -> Stages a
>= :: Stages a -> Stages a -> Bool
$c>= :: forall a. Ord a => Stages a -> Stages a -> Bool
> :: Stages a -> Stages a -> Bool
$c> :: forall a. Ord a => Stages a -> Stages a -> Bool
<= :: Stages a -> Stages a -> Bool
$c<= :: forall a. Ord a => Stages a -> Stages a -> Bool
< :: Stages a -> Stages a -> Bool
$c< :: forall a. Ord a => Stages a -> Stages a -> Bool
compare :: Stages a -> Stages a -> Ordering
$ccompare :: forall a. Ord a => Stages a -> Stages a -> Ordering
Ord, Int -> Stages a -> ShowS
[Stages a] -> ShowS
Stages a -> String
(Int -> Stages a -> ShowS)
-> (Stages a -> String) -> ([Stages a] -> ShowS) -> Show (Stages a)
forall a. Show a => Int -> Stages a -> ShowS
forall a. Show a => [Stages a] -> ShowS
forall a. Show a => Stages a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Stages a] -> ShowS
$cshowList :: forall a. Show a => [Stages a] -> ShowS
show :: Stages a -> String
$cshow :: forall a. Show a => Stages a -> String
showsPrec :: Int -> Stages a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> Stages a -> ShowS
Show, (forall a b. (a -> b) -> Stages a -> Stages b)
-> (forall a b. a -> Stages b -> Stages a) -> Functor Stages
forall a b. a -> Stages b -> Stages a
forall a b. (a -> b) -> Stages a -> Stages b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> Stages b -> Stages a
$c<$ :: forall a b. a -> Stages b -> Stages a
fmap :: forall a b. (a -> b) -> Stages a -> Stages b
$cfmap :: forall a b. (a -> b) -> Stages a -> Stages b
Functor, (forall m. Monoid m => Stages m -> m)
-> (forall m a. Monoid m => (a -> m) -> Stages a -> m)
-> (forall m a. Monoid m => (a -> m) -> Stages a -> m)
-> (forall a b. (a -> b -> b) -> b -> Stages a -> b)
-> (forall a b. (a -> b -> b) -> b -> Stages a -> b)
-> (forall b a. (b -> a -> b) -> b -> Stages a -> b)
-> (forall b a. (b -> a -> b) -> b -> Stages a -> b)
-> (forall a. (a -> a -> a) -> Stages a -> a)
-> (forall a. (a -> a -> a) -> Stages a -> a)
-> (forall a. Stages a -> [a])
-> (forall a. Stages a -> Bool)
-> (forall a. Stages a -> Int)
-> (forall a. Eq a => a -> Stages a -> Bool)
-> (forall a. Ord a => Stages a -> a)
-> (forall a. Ord a => Stages a -> a)
-> (forall a. Num a => Stages a -> a)
-> (forall a. Num a => Stages a -> a)
-> Foldable Stages
forall a. Eq a => a -> Stages a -> Bool
forall a. Num a => Stages a -> a
forall a. Ord a => Stages a -> a
forall m. Monoid m => Stages m -> m
forall a. Stages a -> Bool
forall a. Stages a -> Int
forall a. Stages a -> [a]
forall a. (a -> a -> a) -> Stages a -> a
forall m a. Monoid m => (a -> m) -> Stages a -> m
forall b a. (b -> a -> b) -> b -> Stages a -> b
forall a b. (a -> b -> b) -> b -> Stages a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
product :: forall a. Num a => Stages a -> a
$cproduct :: forall a. Num a => Stages a -> a
sum :: forall a. Num a => Stages a -> a
$csum :: forall a. Num a => Stages a -> a
minimum :: forall a. Ord a => Stages a -> a
$cminimum :: forall a. Ord a => Stages a -> a
maximum :: forall a. Ord a => Stages a -> a
$cmaximum :: forall a. Ord a => Stages a -> a
elem :: forall a. Eq a => a -> Stages a -> Bool
$celem :: forall a. Eq a => a -> Stages a -> Bool
length :: forall a. Stages a -> Int
$clength :: forall a. Stages a -> Int
null :: forall a. Stages a -> Bool
$cnull :: forall a. Stages a -> Bool
toList :: forall a. Stages a -> [a]
$ctoList :: forall a. Stages a -> [a]
foldl1 :: forall a. (a -> a -> a) -> Stages a -> a
$cfoldl1 :: forall a. (a -> a -> a) -> Stages a -> a
foldr1 :: forall a. (a -> a -> a) -> Stages a -> a
$cfoldr1 :: forall a. (a -> a -> a) -> Stages a -> a
foldl' :: forall b a. (b -> a -> b) -> b -> Stages a -> b
$cfoldl' :: forall b a. (b -> a -> b) -> b -> Stages a -> b
foldl :: forall b a. (b -> a -> b) -> b -> Stages a -> b
$cfoldl :: forall b a. (b -> a -> b) -> b -> Stages a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> Stages a -> b
$cfoldr' :: forall a b. (a -> b -> b) -> b -> Stages a -> b
foldr :: forall a b. (a -> b -> b) -> b -> Stages a -> b
$cfoldr :: forall a b. (a -> b -> b) -> b -> Stages a -> b
foldMap' :: forall m a. Monoid m => (a -> m) -> Stages a -> m
$cfoldMap' :: forall m a. Monoid m => (a -> m) -> Stages a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> Stages a -> m
$cfoldMap :: forall m a. Monoid m => (a -> m) -> Stages a -> m
fold :: forall m. Monoid m => Stages m -> m
$cfold :: forall m. Monoid m => Stages m -> m
Foldable, Functor Stages
Foldable Stages
Functor Stages
-> Foldable Stages
-> (forall (f :: * -> *) a b.
    Applicative f =>
    (a -> f b) -> Stages a -> f (Stages b))
-> (forall (f :: * -> *) a.
    Applicative f =>
    Stages (f a) -> f (Stages a))
-> (forall (m :: * -> *) a b.
    Monad m =>
    (a -> m b) -> Stages a -> m (Stages b))
-> (forall (m :: * -> *) a.
    Monad m =>
    Stages (m a) -> m (Stages a))
-> Traversable Stages
forall (t :: * -> *).
Functor t
-> Foldable t
-> (forall (f :: * -> *) a b.
    Applicative f =>
    (a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
    Monad m =>
    (a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (m :: * -> *) a. Monad m => Stages (m a) -> m (Stages a)
forall (f :: * -> *) a.
Applicative f =>
Stages (f a) -> f (Stages a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Stages a -> m (Stages b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Stages a -> f (Stages b)
sequence :: forall (m :: * -> *) a. Monad m => Stages (m a) -> m (Stages a)
$csequence :: forall (m :: * -> *) a. Monad m => Stages (m a) -> m (Stages a)
mapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Stages a -> m (Stages b)
$cmapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Stages a -> m (Stages b)
sequenceA :: forall (f :: * -> *) a.
Applicative f =>
Stages (f a) -> f (Stages a)
$csequenceA :: forall (f :: * -> *) a.
Applicative f =>
Stages (f a) -> f (Stages a)
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Stages a -> f (Stages b)
$ctraverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Stages a -> f (Stages b)
Traversable, (forall a. Stages a -> Rep1 Stages a)
-> (forall a. Rep1 Stages a -> Stages a) -> Generic1 Stages
forall a. Rep1 Stages a -> Stages a
forall a. Stages a -> Rep1 Stages a
forall k (f :: k -> *).
(forall (a :: k). f a -> Rep1 f a)
-> (forall (a :: k). Rep1 f a -> f a) -> Generic1 f
$cto1 :: forall a. Rep1 Stages a -> Stages a
$cfrom1 :: forall a. Stages a -> Rep1 Stages a
Generic1)
  deriving Functor Stages
Functor Stages
-> (forall a. a -> Stages a)
-> (forall a b. Stages (a -> b) -> Stages a -> Stages b)
-> (forall a b c.
    (a -> b -> c) -> Stages a -> Stages b -> Stages c)
-> (forall a b. Stages a -> Stages b -> Stages b)
-> (forall a b. Stages a -> Stages b -> Stages a)
-> Applicative Stages
forall a. a -> Stages a
forall a b. Stages a -> Stages b -> Stages a
forall a b. Stages a -> Stages b -> Stages b
forall a b. Stages (a -> b) -> Stages a -> Stages b
forall a b c. (a -> b -> c) -> Stages a -> Stages b -> Stages c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: forall a b. Stages a -> Stages b -> Stages a
$c<* :: forall a b. Stages a -> Stages b -> Stages a
*> :: forall a b. Stages a -> Stages b -> Stages b
$c*> :: forall a b. Stages a -> Stages b -> Stages b
liftA2 :: forall a b c. (a -> b -> c) -> Stages a -> Stages b -> Stages c
$cliftA2 :: forall a b c. (a -> b -> c) -> Stages a -> Stages b -> Stages c
<*> :: forall a b. Stages (a -> b) -> Stages a -> Stages b
$c<*> :: forall a b. Stages (a -> b) -> Stages a -> Stages b
pure :: forall a. a -> Stages a
$cpure :: forall a. a -> Stages a
Applicative via (Generically1 Stages)

instance StageInfo Stages where
  stageNames :: forall label. IsString label => Stages label
stageNames = Stages :: forall a. a -> a -> a -> a -> a -> a -> Stages a
Stages
    { $sel:rgen:Stages :: label
rgen  = label
"rgen"
    , $sel:rint:Stages :: label
rint  = label
"rint"
    , $sel:rahit:Stages :: label
rahit = label
"rahit"
    , $sel:rchit:Stages :: label
rchit = label
"rchit"
    , $sel:rmiss:Stages :: label
rmiss = label
"rmiss"
    , $sel:rcall:Stages :: label
rcall = label
"rcall"
    }

  stageFlagBits :: Stages ShaderStageFlagBits
stageFlagBits = Stages :: forall a. a -> a -> a -> a -> a -> a -> Stages a
Stages
    { $sel:rgen:Stages :: ShaderStageFlagBits
rgen  = ShaderStageFlagBits
Vk.SHADER_STAGE_CALLABLE_BIT_KHR
    , $sel:rint:Stages :: ShaderStageFlagBits
rint  = ShaderStageFlagBits
Vk.SHADER_STAGE_INTERSECTION_BIT_KHR
    , $sel:rahit:Stages :: ShaderStageFlagBits
rahit = ShaderStageFlagBits
Vk.SHADER_STAGE_MISS_BIT_KHR
    , $sel:rchit:Stages :: ShaderStageFlagBits
rchit = ShaderStageFlagBits
Vk.SHADER_STAGE_CLOSEST_HIT_BIT_KHR
    , $sel:rmiss:Stages :: ShaderStageFlagBits
rmiss = ShaderStageFlagBits
Vk.SHADER_STAGE_ANY_HIT_BIT_KHR
    , $sel:rcall:Stages :: ShaderStageFlagBits
rcall = ShaderStageFlagBits
Vk.SHADER_STAGE_RAYGEN_BIT_KHR
    }