{-# LINE 1 "src/Gpu/Vulkan/Subpass/Middle/Internal.hsc" #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE BlockArguments, TupleSections #-}
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Gpu.Vulkan.Subpass.Middle.Internal where

import Foreign.Marshal.Alloc
import Foreign.Marshal.Array
import Foreign.Storable
import Foreign.Storable.PeekPoke
import Foreign.C.Enum
import Control.Arrow
import Data.Word

import Gpu.Vulkan.Enum
import Gpu.Vulkan.Subpass.Enum

import qualified Gpu.Vulkan.Pipeline.Enum as Pipeline
import qualified Gpu.Vulkan.Attachment.Middle.Internal as Attachment
import qualified Gpu.Vulkan.Subpass.Core as C



data Description = Description {
	Description -> DescriptionFlags
descriptionFlags :: DescriptionFlags,
	Description -> BindPoint
descriptionPipelineBindPoint :: Pipeline.BindPoint,
	Description -> [Reference]
descriptionInputAttachments :: [Attachment.Reference],
	Description -> Either [Reference] [(Reference, Reference)]
descriptionColorAndResolveAttachments :: Either
		[Attachment.Reference]
		[(Attachment.Reference, Attachment.Reference)],
	Description -> Maybe Reference
descriptionDepthStencilAttachment :: Maybe Attachment.Reference,
	Description -> [Word32]
descriptionPreserveAttachments :: [Word32] }
	deriving Int -> Description -> ShowS
[Description] -> ShowS
Description -> String
(Int -> Description -> ShowS)
-> (Description -> String)
-> ([Description] -> ShowS)
-> Show Description
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Description -> ShowS
showsPrec :: Int -> Description -> ShowS
$cshow :: Description -> String
show :: Description -> String
$cshowList :: [Description] -> ShowS
showList :: [Description] -> ShowS
Show

descriptionToCore :: Description -> (C.Description -> IO r) -> IO r
descriptionToCore :: forall r. Description -> (Description -> IO r) -> IO r
descriptionToCore Description {
	descriptionFlags :: Description -> DescriptionFlags
descriptionFlags = DescriptionFlagBits Word32
flgs,
	descriptionPipelineBindPoint :: Description -> BindPoint
descriptionPipelineBindPoint = Pipeline.BindPoint Word32
bp,
	descriptionInputAttachments :: Description -> [Reference]
descriptionInputAttachments =
		[Reference] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([Reference] -> Int)
-> ([Reference] -> [Reference])
-> [Reference]
-> (Int, [Reference])
forall b c c'. (b -> c) -> (b -> c') -> b -> (c, c')
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& (Reference -> Reference
Attachment.referenceToCore (Reference -> Reference) -> [Reference] -> [Reference]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) -> (Int
iac, [Reference]
ias),
	descriptionColorAndResolveAttachments :: Description -> Either [Reference] [(Reference, Reference)]
descriptionColorAndResolveAttachments =
		(([Reference], Maybe [Reference]) -> Int
forall a. ([Reference], a) -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length (([Reference], Maybe [Reference]) -> Int)
-> (([Reference], Maybe [Reference])
    -> ([Reference], Maybe [Reference]))
-> ([Reference], Maybe [Reference])
-> (Int, ([Reference], Maybe [Reference]))
forall b c c'. (b -> c) -> (b -> c') -> b -> (c, c')
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& ([Reference], Maybe [Reference])
-> ([Reference], Maybe [Reference])
forall a. a -> a
id)
			(([Reference], Maybe [Reference])
 -> (Int, ([Reference], Maybe [Reference])))
-> (Either [Reference] [(Reference, Reference)]
    -> ([Reference], Maybe [Reference]))
-> Either [Reference] [(Reference, Reference)]
-> (Int, ([Reference], Maybe [Reference]))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Reference] -> ([Reference], Maybe [Reference]))
-> ([(Reference, Reference)] -> ([Reference], Maybe [Reference]))
-> Either [Reference] [(Reference, Reference)]
-> ([Reference], Maybe [Reference])
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (, Maybe [Reference]
forall a. Maybe a
Nothing) (([Reference] -> Maybe [Reference]
forall a. a -> Maybe a
Just ([Reference] -> Maybe [Reference])
-> ([Reference], [Reference]) -> ([Reference], Maybe [Reference])
forall b c d. (b -> c) -> (d, b) -> (d, c)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
`second`) (([Reference], [Reference]) -> ([Reference], Maybe [Reference]))
-> ([(Reference, Reference)] -> ([Reference], [Reference]))
-> [(Reference, Reference)]
-> ([Reference], Maybe [Reference])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(Reference, Reference)] -> ([Reference], [Reference])
forall a b. [(a, b)] -> ([a], [b])
unzip) ->
		(Int
cac, (	(Reference -> Reference
Attachment.referenceToCore (Reference -> Reference) -> [Reference] -> [Reference]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) -> [Reference]
cas,
			((Reference -> Reference
Attachment.referenceToCore (Reference -> Reference) -> [Reference] -> [Reference]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) ([Reference] -> [Reference])
-> Maybe [Reference] -> Maybe [Reference]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) -> Maybe [Reference]
mras)),
	descriptionDepthStencilAttachment :: Description -> Maybe Reference
descriptionDepthStencilAttachment =
		(Reference -> Reference
Attachment.referenceToCore (Reference -> Reference) -> Maybe Reference -> Maybe Reference
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) -> Maybe Reference
mdsa,
	descriptionPreserveAttachments :: Description -> [Word32]
descriptionPreserveAttachments = [Word32] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([Word32] -> Int)
-> ([Word32] -> [Word32]) -> [Word32] -> (Int, [Word32])
forall b c c'. (b -> c) -> (b -> c') -> b -> (c, c')
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& [Word32] -> [Word32]
forall a. a -> a
id -> (Int
pac, [Word32]
pas) } Description -> IO r
f =
	Int -> (Ptr Reference -> IO r) -> IO r
forall a b. Storable a => Int -> (Ptr a -> IO b) -> IO b
allocaArray Int
iac \Ptr Reference
pias ->
	Ptr Reference -> [Reference] -> IO ()
forall a. Storable a => Ptr a -> [a] -> IO ()
pokeArray Ptr Reference
pias [Reference]
ias IO () -> IO r -> IO r
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>>
	Int -> (Ptr Reference -> IO r) -> IO r
forall a b. Storable a => Int -> (Ptr a -> IO b) -> IO b
allocaArray Int
cac \Ptr Reference
pcas ->
	Ptr Reference -> [Reference] -> IO ()
forall a. Storable a => Ptr a -> [a] -> IO ()
pokeArray Ptr Reference
pcas [Reference]
cas IO () -> IO r -> IO r
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>>
	((Ptr Reference -> IO r) -> IO r)
-> ([Reference] -> (Ptr Reference -> IO r) -> IO r)
-> Maybe [Reference]
-> (Ptr Reference -> IO r)
-> IO r
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ((Ptr Reference -> IO r) -> Ptr Reference -> IO r
forall a b. (a -> b) -> a -> b
$ Ptr Reference
forall a. Ptr a
NullPtr)
		(\[Reference]
ras Ptr Reference -> IO r
g -> Int -> (Ptr Reference -> IO r) -> IO r
forall a b. Storable a => Int -> (Ptr a -> IO b) -> IO b
allocaArray Int
cac \Ptr Reference
p -> Ptr Reference -> [Reference] -> IO ()
forall a. Storable a => Ptr a -> [a] -> IO ()
pokeArray Ptr Reference
p [Reference]
ras IO () -> IO r -> IO r
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Ptr Reference -> IO r
g Ptr Reference
p)
		Maybe [Reference]
mras \Ptr Reference
pras ->
	((Ptr Reference -> IO r) -> IO r)
-> (Reference -> (Ptr Reference -> IO r) -> IO r)
-> Maybe Reference
-> (Ptr Reference -> IO r)
-> IO r
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ((Ptr Reference -> IO r) -> Ptr Reference -> IO r
forall a b. (a -> b) -> a -> b
$ Ptr Reference
forall a. Ptr a
NullPtr)
		(\Reference
dsa Ptr Reference -> IO r
g -> (Ptr Reference -> IO r) -> IO r
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca \Ptr Reference
p -> Ptr Reference -> Reference -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke Ptr Reference
p Reference
dsa IO () -> IO r -> IO r
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Ptr Reference -> IO r
g Ptr Reference
p) Maybe Reference
mdsa \Ptr Reference
pdsa ->
	Int -> (Ptr Word32 -> IO r) -> IO r
forall a b. Storable a => Int -> (Ptr a -> IO b) -> IO b
allocaArray Int
pac \Ptr Word32
ppas ->
	Ptr Word32 -> [Word32] -> IO ()
forall a. Storable a => Ptr a -> [a] -> IO ()
pokeArray Ptr Word32
ppas [Word32]
pas IO () -> IO r -> IO r
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>>
	Description -> IO r
f C.Description {
		descriptionFlags :: Word32
C.descriptionFlags = Word32
flgs,
		descriptionPipelineBindPoint :: Word32
C.descriptionPipelineBindPoint = Word32
bp,
		descriptionInputAttachmentCount :: Word32
C.descriptionInputAttachmentCount = Int -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
iac,
		descriptionPInputAttachments :: Ptr Reference
C.descriptionPInputAttachments = Ptr Reference
pias,
		descriptionColorAttachmentCount :: Word32
C.descriptionColorAttachmentCount = Int -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
cac,
		descriptionPColorAttachments :: Ptr Reference
C.descriptionPColorAttachments = Ptr Reference
pcas,
		descriptionPResolveAttachments :: Ptr Reference
C.descriptionPResolveAttachments = Ptr Reference
pras,
		descriptionPDepthStencilAttachment :: Ptr Reference
C.descriptionPDepthStencilAttachment = Ptr Reference
pdsa,
		descriptionPreserveAttachmentCount :: Word32
C.descriptionPreserveAttachmentCount = Int -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
pac,
		descriptionPPreserveAttachments :: Ptr Word32
C.descriptionPPreserveAttachments = Ptr Word32
ppas }

enum "S" ''Word32 [''Show, ''Storable, ''Num]
{-# LINE 75 "src/Gpu/Vulkan/Subpass/Middle/Internal.hsc" #-}
	[("SExternal", 4294967295)]
{-# LINE 76 "src/Gpu/Vulkan/Subpass/Middle/Internal.hsc" #-}

data Dependency = Dependency {
	Dependency -> S
dependencySrcSubpass :: S,
	Dependency -> S
dependencyDstSubpass :: S,
	Dependency -> StageFlags
dependencySrcStageMask :: Pipeline.StageFlags,
	Dependency -> StageFlags
dependencyDstStageMask :: Pipeline.StageFlags,
	Dependency -> AccessFlags
dependencySrcAccessMask :: AccessFlags,
	Dependency -> AccessFlags
dependencyDstAccessMask :: AccessFlags,
	Dependency -> DependencyFlags
dependencyDependencyFlags :: DependencyFlags }
	deriving Int -> Dependency -> ShowS
[Dependency] -> ShowS
Dependency -> String
(Int -> Dependency -> ShowS)
-> (Dependency -> String)
-> ([Dependency] -> ShowS)
-> Show Dependency
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Dependency -> ShowS
showsPrec :: Int -> Dependency -> ShowS
$cshow :: Dependency -> String
show :: Dependency -> String
$cshowList :: [Dependency] -> ShowS
showList :: [Dependency] -> ShowS
Show

dependencyToCore :: Dependency -> C.Dependency
dependencyToCore :: Dependency -> Dependency
dependencyToCore Dependency {
	dependencySrcSubpass :: Dependency -> S
dependencySrcSubpass = S Word32
ss,
	dependencyDstSubpass :: Dependency -> S
dependencyDstSubpass = S Word32
ds,
	dependencySrcStageMask :: Dependency -> StageFlags
dependencySrcStageMask = Pipeline.StageFlagBits Word32
ssm,
	dependencyDstStageMask :: Dependency -> StageFlags
dependencyDstStageMask = Pipeline.StageFlagBits Word32
dsm,
	dependencySrcAccessMask :: Dependency -> AccessFlags
dependencySrcAccessMask = AccessFlagBits Word32
sam,
	dependencyDstAccessMask :: Dependency -> AccessFlags
dependencyDstAccessMask = AccessFlagBits Word32
dam,
	dependencyDependencyFlags :: Dependency -> DependencyFlags
dependencyDependencyFlags = DependencyFlagBits Word32
flgs } = C.Dependency {
		dependencySrcSubpass :: Word32
C.dependencySrcSubpass = Word32
ss,
		dependencyDstSubpass :: Word32
C.dependencyDstSubpass = Word32
ds,
		dependencySrcStageMask :: Word32
C.dependencySrcStageMask = Word32
ssm,
		dependencyDstStageMask :: Word32
C.dependencyDstStageMask = Word32
dsm,
		dependencySrcAccessMask :: Word32
C.dependencySrcAccessMask = Word32
sam,
		dependencyDstAccessMask :: Word32
C.dependencyDstAccessMask = Word32
dam,
		dependencyDependencyFlags :: Word32
C.dependencyDependencyFlags = Word32
flgs }